ฉันมีฐานข้อมูลและต้องการย้าย.mdf
และ.ldf
ไฟล์ไปยังตำแหน่งอื่น แต่ฉันไม่ต้องการหยุดMSSQLSERVER
บริการและฉันไม่ต้องการส่งออกไปยังเซิร์ฟเวอร์อื่น
ฉันจะทำสิ่งนี้ได้อย่างไร
ฉันมีฐานข้อมูลและต้องการย้าย.mdf
และ.ldf
ไฟล์ไปยังตำแหน่งอื่น แต่ฉันไม่ต้องการหยุดMSSQLSERVER
บริการและฉันไม่ต้องการส่งออกไปยังเซิร์ฟเวอร์อื่น
ฉันจะทำสิ่งนี้ได้อย่างไร
คำตอบ:
คุณไม่ต้องหยุดบริการ SQL Server เพื่อย้ายไฟล์ฐานข้อมูล แต่คุณต้องใช้ฐานข้อมูลเฉพาะแบบออฟไลน์ นี่เป็นเพราะคุณไม่สามารถย้ายไฟล์ในขณะที่พวกเขากำลังเข้าถึงและทำให้ฐานข้อมูลออฟไลน์หยุดไฟล์จากการใช้งานโดยแอปพลิเคชันเซิร์ฟเวอร์ SQL
กระบวนการย้ายพวกมันค่อนข้างง่าย การแยก / แนบได้ถูกอธิบายไว้แล้ว แต่มันก็ไม่ได้ซับซ้อนเกือบ
เปลี่ยนตำแหน่งไฟล์ด้วยALTER DATABASE
คำสั่ง:
USE master; --do this all from the master
ALTER DATABASE foo
MODIFY FILE (name='DB_Data1'
,filename='X:\NewDBFile\DB_Data1.mdf'); --Filename is new location
หมายเหตุคุณไม่จำเป็นต้องประกาศตำแหน่งเก่าในคำสั่งนี้ การเปลี่ยนพา ธ นี้จะไม่มีผลในทันที แต่จะใช้ในครั้งต่อไปที่ฐานข้อมูลเริ่มทำงาน
ตั้งค่าฐานข้อมูลออฟไลน์
(ฉันใช้WITH ROLLBACK IMMEDIATE
เพื่อเตะทุกคนและย้อนกลับธุรกรรมที่เปิดอยู่ทั้งหมดในปัจจุบัน)
ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;
ย้าย / คัดลอกไฟล์ไปยังตำแหน่งใหม่
เพียงแค่คัดลอกไฟล์ไปโดยใช้วิธีการที่คุณชื่นชอบ (คลิก 'n Drag, XCopy, คัดลอกรายการ, Robocopy)
นำฐานข้อมูลออนไลน์
ALTER DATABASE foo SET ONLINE;
MODIFY FILE
คำสั่งซื้อของฉันสามารถเปลี่ยนได้ หากคุณเรียกใช้แก้ไขไฟล์ก่อนมันจะบอกคุณว่าคำสั่งทำงานได้สำเร็จและตำแหน่งจะเปลี่ยนไปหลังจากการทำงานแบบออฟไลน์ออนไลน์ (การใช้ถ้อยคำแตกต่างกัน แต่คุณได้รับแนวคิด) ออฟไลน์ -> ย้ายไฟล์ -> การสั่งซื้อออนไลน์มีความสำคัญด้วยเหตุผลที่ชัดเจน ทำเครื่องหมายโน้ตของ Demonslay335 ด้วย การอนุญาตให้ใช้ไฟล์เป็นสิ่งสำคัญ
ไฟล์ MDF และ LDF ได้รับการปกป้องและไม่สามารถย้ายได้ในขณะที่ฐานข้อมูลออนไลน์
หากคุณไม่รังเกียจที่จะหยุดฐานข้อมูลจากการทำงานคุณDETACH
ก็สามารถทำได้ย้ายไฟล์ATTACH
ไปมา
Properties
Files
แท็บPath
และFileName
จากไม้ MDF และ LDF ไฟล์ ขั้นตอนนี้มีความสำคัญในกรณีที่คุณไม่ต้องการค้นหาไฟล์ที่หายไป ...Tasks -> Detach
Databases
โหนดของเซิร์ฟเวอร์ของคุณAttach
Add
ปุ่มOK
คุณควรจะตกลงตอนนี้ ข้อมูลเกี่ยวกับDETACH
- ATTACH
กระบวนการสามารถพบได้ที่นี่
ในลิงค์เกี่ยวกับDETACH
- ATTACH
มีคำแนะนำให้ใช้ALTER DATABASE
คำสั่งอีกครั้งหากเก็บฐานข้อมูลในอินสแตนซ์เดียวกันของ SQL Server อ้างอิงอื่น ๆ ในการย้ายฐานข้อมูลผู้ใช้
หากคุณต้องการให้มันทำงานได้ขณะที่การย้ายแล้วทำ-BACKUP
RESTORE
ในกระบวนการกู้คืนคุณสามารถกำหนดตำแหน่งใหม่ของไฟล์ฐานข้อมูล
หากต้องการย้ายไฟล์ฐานข้อมูลระบบให้ทำตามขั้นตอนเหล่านี้:
เข้าสู่ระบบในฐานะผู้ใช้ sa ใน SSMS
ทำการสำรองข้อมูลของฐานข้อมูลที่ผู้ใช้สร้างขึ้นเพื่อความปลอดภัย
ฆ่าเซสชันทั้งหมดที่เชื่อมต่อกับเซิร์ฟเวอร์จาก SSMS
ดำเนินการคำสั่งต่อไปนี้เพื่อตรวจสอบตำแหน่งไฟล์ปัจจุบันของฐานข้อมูลระบบ:
USE master;
SELECT * FROM sys.master_files;
ระบุพา ธ และจดบันทึกพา ธ ปัจจุบันของไฟล์
ใช้ TSQL เพื่อเปลี่ยนพา ธ ของไฟล์สำหรับฐานข้อมูลทั้งหมดยกเว้นมาสเตอร์:
ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )
เช่น:
ALTER DATABASE tempdb
MODIFY FILE ( NAME = tempdev
, FILENAME = "DestinationPath\tempdb.mdf");
ALTER DATABASE tempdb
MODIFY FILE ( NAME = templog
, FILENAME = "DestinationPath\templog.ldf");
ALTER DATABASE model
MODIFY FILE ( NAME = modeldev
, FILENAME = "DestinationPath\model.mdf");
ALTER DATABASE model
MODIFY FILE ( NAME = modellog
, FILENAME = "DestinationPath\modellog.ldf");
ALTER DATABASE msdb
MODIFY FILE ( NAME = MSDBData
, FILENAME = "DestinationPath\msdbdata.mdf");
ALTER DATABASE msdb
MODIFY FILE ( NAME = MSDBLog
, FILENAME = "DestinationPath\msdblog.ldf");
ตอนนี้ตำแหน่งไฟล์ถูกเปลี่ยน
อย่าลืมย้ายทั้งไฟล์ ldf และ mdf
ใน SSMS คลิกขวาที่เซิร์ฟเวอร์และเลือกคุณสมบัติ คุณสมบัติภายในไปที่การตั้งค่าฐานข้อมูล เปลี่ยนตำแหน่งเริ่มต้นของฐานข้อมูลสำหรับ Data และ Log เป็นพา ธ ปลายทาง ออกจากระบบเซิร์ฟเวอร์
เช่นเปลี่ยนC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\
เป็นE:\projects\DataBaseFiles\MSSQL\DATA\
หยุดอินสแตนซ์ของ SQL Server
คัดลอกไฟล์หรือไฟล์ไปยังตำแหน่งใหม่ ใช้ Robocopy เพื่อย้ายไฟล์เพื่อคัดลอกการอนุญาตไปยังโฟลเดอร์ปลายทาง เปิด cmd และเรียกใช้ในฐานะผู้ดูแลระบบและใช้คำสั่งต่อไปนี้:
robocopy / วินาที sourceFolder destinationFolder
เป็นการดีกว่าถ้าไปที่ตำแหน่งต้นทางเพื่อเรียกใช้คำสั่ง ลบไฟล์อื่นที่ไม่ใช่ไฟล์ฐานข้อมูลระบบที่ถูกคัดลอก เช่น:
robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\
(ที่นี่เรากำลังย้ายไฟล์ฐานข้อมูลระบบทั้งหมดไปยังตำแหน่งใหม่)
ทำตามขั้นตอน follwing ในตัวจัดการการกำหนดค่าเซิร์ฟเวอร์ SQL:
ในโหนบริการเซิร์ฟเวอร์ SQL คลิกขวาที่อินสแตนซ์ของ SQL Server (ตัวอย่างเช่น SQL Server (MSSQLSERVER)) และเลือกคุณสมบัติ .. ในกล่องโต้ตอบคุณสมบัติของ SQL Server (instance_name) คลิกแท็บพารามิเตอร์เริ่มต้น ในกล่องพารามิเตอร์ที่มีอยู่ให้เลือกพารามิเตอร์ –d เพื่อย้ายไฟล์ข้อมูลหลัก คลิกอัปเดตเพื่อบันทึกการเปลี่ยนแปลง ในกล่องระบุพารามิเตอร์เริ่มต้นให้เปลี่ยนพารามิเตอร์เป็นเส้นทางใหม่ของฐานข้อมูลหลัก ในกล่องพารามิเตอร์ที่มีอยู่ให้เลือกพารามิเตอร์ –l เพื่อย้ายไฟล์บันทึกต้นแบบ คลิกอัปเดตเพื่อบันทึกการเปลี่ยนแปลง ในกล่องระบุพารามิเตอร์เริ่มต้นให้เปลี่ยนพารามิเตอร์เป็นเส้นทางใหม่ของฐานข้อมูลหลัก
ค่าพารามิเตอร์สำหรับไฟล์ข้อมูลต้องเป็นไปตามพารามิเตอร์ -d และค่าสำหรับล็อกไฟล์ต้องเป็นไปตามพารามิเตอร์ -l ตัวอย่างต่อไปนี้แสดงค่าพารามิเตอร์สำหรับตำแหน่งเริ่มต้นของไฟล์ข้อมูลหลัก
-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf
หากการย้ายตำแหน่งตามแผนสำหรับไฟล์ข้อมูลหลักคือ E: \ SQLData ค่าพารามิเตอร์จะเปลี่ยนไปดังนี้:
-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf
หยุดอินสแตนซ์ของ SQL Server โดยคลิกขวาที่ชื่ออินสแตนซ์แล้วเลือกหยุด รีสตาร์ทอินสแตนซ์ของ SQL Server
เข้าสู่ระบบในฐานะsa
ผู้ใช้ใน SSMS และตรวจสอบตำแหน่งของไฟล์ฐานข้อมูลโดยดำเนินการค้นหาต่อไปนี้:
USE master;
SELECT * FROM sys.master_files;
เสร็จหมดแล้ว.
คุณทำทีละขั้นตอน:
ปิดการเชื่อมต่อทั้งหมด
เปลี่ยนแปลงฐานข้อมูลชุด MyDB SINGLE_USER ด้วย ROLLBACK ทันที
ตั้งค่าฐานข้อมูลด้วยสถานะออฟไลน์
แก้ไขฐานข้อมูล MyDB SET ออฟไลน์
ไปยังเส้นทางใหม่
แก้ไขฐานข้อมูล MyDB แก้ไขไฟล์ (ชื่อ = MyDB, ชื่อไฟล์ = 'N: \ DATA \ MyDB.MDF')
ตั้งค่าฐานข้อมูลด้วยสถานะออนไลน์
เปลี่ยนแปลงฐานข้อมูล MyDB SET ONLINE
ตั้งค่าผู้ใช้หลายคน
เปลี่ยนฐานข้อมูล MyDB SET MULTI_USER
มีวิธีการย้ายไฟล์ข้อมูลฐานข้อมูล (ยังไม่แน่ใจว่าหากมีวิธีการนี้สำหรับ logfiles) โดยไม่ต้องออฟไลน์ฐานข้อมูล
Dejan Nakarada-Kordicมีคำอธิบาย + สคริปต์สำหรับวิธีนี้ที่นี่: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline
เวอร์ชันย่อคือคุณเพิ่มไฟล์ฐานข้อมูลอื่นที่ตำแหน่งใหม่จากนั้นใช้ DBCC Shrinkfile พร้อมตัวเลือก EMPTYFILE เพื่อย้ายข้อมูลจากไฟล์เก่าไปยังไฟล์ใหม่ เมื่อเสร็จแล้วคุณสามารถลบไฟล์ข้อมูลเก่า
ไม่ใช่โซลูชันของฉันฉันกำลังมองหาโซลูชันนี้ด้วยตนเองและพบว่ามีประโยชน์มากสำหรับสภาพแวดล้อมการผลิตของเรา
Thorfinn
ทำตาม 4 ขั้นตอนง่าย ๆ เหล่านี้:
CurrentLocation
คอลัมน์
SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');
ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME , FILENAME = 'NEW_PATH\DATABASE_NAME.mdf');
ALTER DATABASE DATABASE_NAME MODIFY FILE ( NAME = DATABASE_FILE_NAME_log , FILENAME = 'NEW_PATH\DATABASE_FILE_NAME_log.ldf');
ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุด (ฉันยินดีต้อนรับความคิดเห็นใด ๆ ที่จะบอกฉันว่ามันไม่ได้) แต่มันง่ายมาก (และรวดเร็วถ้าคุณมีฐานข้อมูลขนาดเล็ก):
ก่อนสำรองฐานข้อมูลไปยังไฟล์. bak จากนั้นกู้คืนฐานข้อมูลจากไฟล์. bak เดียวกันโดยเลือกตำแหน่งไฟล์. mdf และ .ldf ใหม่ภายใต้ตัวเลือกไฟล์สำหรับงานคืนค่า
ฉันจะไม่ทำในสภาพแวดล้อมการใช้งานจริงของหน้าต่างการบำรุงรักษาเนื่องจากคุณไม่สามารถเข้าถึงฐานข้อมูลในระหว่างการกู้คืนได้ วิธีอื่นที่ฉันเคยเห็นข้างต้นจะมีข้อเสียคล้าย หลังจากงานคืนค่าเสร็จสิ้นคุณไม่ต้องลบไฟล์เก่า มันทำโดยอัตโนมัติ
เพื่อเสริมคำตอบที่มีอยู่: นี่คือสคริปต์เพื่อสร้างALTER DATABASE ... MOVE ...
คำสั่งสำหรับฐานข้อมูลทั้งหมด:
SELECT 'ALTER DATABASE ' + QUOTENAME(d.name) +
' MODIFY FILE (name=' + QUOTENAME(f.name, '''') +
', filename=' + QUOTENAME(REPLACE(f.physical_name, 'C:\', 'D:\'), '''') +
');'
FROM sys.master_files AS f
INNER JOIN sys.databases AS d ON f.database_id = d.database_id
WHERE d.name <> 'master';
บันทึก:
แทนที่REPLACE(f.physical_name, 'C:\', 'D:\')
ด้วยการแปลงใด ๆ ที่คุณต้องการทำกับพา ธ ของไฟล์
master
ได้รับการยกเว้นเนื่องจากเส้นทางจะถูกกำหนดโดยตัวเลือกการเริ่มต้นของ SQL Server (ดูตัวอย่างคำตอบนี้เพื่อดูรายละเอียด)
USE master; --do this all from the master ALTER DATABASE foo MODIFY FILE (name='DB_Data1_log' ,filename='X:\NewDBFile\DB_Data1_log.ldf'); --Filename is new location