ฉันจะย้ายไฟล์ฐานข้อมูล SQL Server ได้อย่างไร


103

ฉันมีฐานข้อมูลและต้องการย้าย.mdfและ.ldfไฟล์ไปยังตำแหน่งอื่น แต่ฉันไม่ต้องการหยุดMSSQLSERVERบริการและฉันไม่ต้องการส่งออกไปยังเซิร์ฟเวอร์อื่น

ฉันจะทำสิ่งนี้ได้อย่างไร

คำตอบ:


154

คุณไม่ต้องหยุดบริการ 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;

คุณสามารถดูนี้อธิบายในรายละเอียดเพิ่มเติมที่นี่


13
สิ่งนี้ใช้ได้สำหรับฉัน ในกรณีของฉันฉันก็ต้องย้ายไฟล์ LDF ด้วยเช่นกันโดยใช้คำสั่งแรก: 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
Dewi Rees

1
นอกจากนี้ยังสามารถใช้เพื่อย้ายไฟล์ดัชนีข้อความแบบเต็มเพียงแค่อัปเดตชื่อไฟล์เพื่อให้ตรงกับสิ่งที่คุณเห็นในกล่องโต้ตอบไฟล์
DShook

24
ตรวจสอบให้แน่ใจหลังจากย้ายไฟล์ฐานข้อมูลแล้วผู้ใช้ "NT SERVICE \ MSSQLSERVER" มีสิทธิ์ใช้งานหรือคุณจะได้รับข้อผิดพลาดเมื่อพยายามทำให้ฐานข้อมูลกลับมาออนไลน์
Demonslay335

"ชื่อ" ควรจะเป็นคืออะไร? ในเอกสารประกอบมี "logical_name" พวกเขาหมายถึงอะไร?
johnny

2
@mlhDev ที่จริงในMODIFY FILEคำสั่งซื้อของฉันสามารถเปลี่ยนได้ หากคุณเรียกใช้แก้ไขไฟล์ก่อนมันจะบอกคุณว่าคำสั่งทำงานได้สำเร็จและตำแหน่งจะเปลี่ยนไปหลังจากการทำงานแบบออฟไลน์ออนไลน์ (การใช้ถ้อยคำแตกต่างกัน แต่คุณได้รับแนวคิด) ออฟไลน์ -> ย้ายไฟล์ -> การสั่งซื้อออนไลน์มีความสำคัญด้วยเหตุผลที่ชัดเจน ทำเครื่องหมายโน้ตของ Demonslay335 ด้วย การอนุญาตให้ใช้ไฟล์เป็นสิ่งสำคัญ
Lionet Chen

50

ไฟล์ 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ในกระบวนการกู้คืนคุณสามารถกำหนดตำแหน่งใหม่ของไฟล์ฐานข้อมูล


3
ฉันแนะนำให้เปิด SQL Management Studio ในฐานะผู้ดูแลระบบเพื่อหลีกเลี่ยงปัญหาการเข้าถึงไฟล์เมื่อทำการติดตั้งใหม่อีกครั้ง
Simon_Weaver

6

หากต้องการย้ายไฟล์ฐานข้อมูลระบบให้ทำตามขั้นตอนเหล่านี้:

  1. เข้าสู่ระบบในฐานะผู้ใช้ sa ใน SSMS

  2. ทำการสำรองข้อมูลของฐานข้อมูลที่ผู้ใช้สร้างขึ้นเพื่อความปลอดภัย

  3. ฆ่าเซสชันทั้งหมดที่เชื่อมต่อกับเซิร์ฟเวอร์จาก SSMS

  4. ดำเนินการคำสั่งต่อไปนี้เพื่อตรวจสอบตำแหน่งไฟล์ปัจจุบันของฐานข้อมูลระบบ:

    USE master;
    SELECT * FROM sys.master_files;

ระบุพา ธ และจดบันทึกพา ธ ปัจจุบันของไฟล์

  1. ใช้ 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

  1. ใน SSMS คลิกขวาที่เซิร์ฟเวอร์และเลือกคุณสมบัติ คุณสมบัติภายในไปที่การตั้งค่าฐานข้อมูล เปลี่ยนตำแหน่งเริ่มต้นของฐานข้อมูลสำหรับ Data และ Log เป็นพา ธ ปลายทาง ออกจากระบบเซิร์ฟเวอร์

    เช่นเปลี่ยนC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\เป็นE:\projects\DataBaseFiles\MSSQL\DATA\

  2. หยุดอินสแตนซ์ของ SQL Server

  3. คัดลอกไฟล์หรือไฟล์ไปยังตำแหน่งใหม่ ใช้ Robocopy เพื่อย้ายไฟล์เพื่อคัดลอกการอนุญาตไปยังโฟลเดอร์ปลายทาง เปิด cmd และเรียกใช้ในฐานะผู้ดูแลระบบและใช้คำสั่งต่อไปนี้:

    robocopy / วินาที sourceFolder destinationFolder

เป็นการดีกว่าถ้าไปที่ตำแหน่งต้นทางเพื่อเรียกใช้คำสั่ง ลบไฟล์อื่นที่ไม่ใช่ไฟล์ฐานข้อมูลระบบที่ถูกคัดลอก เช่น:

 robocopy /sec .\DATA E:\projects\DataBaseFiles\MSSQL\DATA\

(ที่นี่เรากำลังย้ายไฟล์ฐานข้อมูลระบบทั้งหมดไปยังตำแหน่งใหม่)

  1. จากเมนูเริ่มชี้ไปที่โปรแกรมทั้งหมดชี้ไปที่ Microsoft SQL Server ชี้ไปที่เครื่องมือตั้งค่าคอนฟิกแล้วคลิกตัวจัดการการกำหนดค่าเซิร์ฟเวอร์ SQL

ทำตามขั้นตอน 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

  1. เข้าสู่ระบบในฐานะsaผู้ใช้ใน SSMS และตรวจสอบตำแหน่งของไฟล์ฐานข้อมูลโดยดำเนินการค้นหาต่อไปนี้:

    USE master;
    SELECT * FROM sys.master_files;

เสร็จหมดแล้ว.


คุณสามารถใช้ฟังก์ชัน SQL เพื่อทำงานอัตโนมัติสำหรับฐานข้อมูลทั้งหมด: stackoverflow.com/a/19505918/439524
amuliar

3

คุณทำทีละขั้นตอน:

  1. ปิดการเชื่อมต่อทั้งหมด
    เปลี่ยนแปลงฐานข้อมูลชุด MyDB SINGLE_USER ด้วย ROLLBACK ทันที

  2. ตั้งค่าฐานข้อมูลด้วยสถานะออฟไลน์
    แก้ไขฐานข้อมูล MyDB SET ออฟไลน์

  3. ไปยังเส้นทางใหม่
    แก้ไขฐานข้อมูล MyDB แก้ไขไฟล์ (ชื่อ = MyDB, ชื่อไฟล์ = 'N: \ DATA \ MyDB.MDF')

  4. ตั้งค่าฐานข้อมูลด้วยสถานะออนไลน์
    เปลี่ยนแปลงฐานข้อมูล MyDB SET ONLINE

  5. ตั้งค่าผู้ใช้หลายคน
    เปลี่ยนฐานข้อมูล MyDB SET MULTI_USER


3

มีวิธีการย้ายไฟล์ข้อมูลฐานข้อมูล (ยังไม่แน่ใจว่าหากมีวิธีการนี้สำหรับ logfiles) โดยไม่ต้องออฟไลน์ฐานข้อมูล

Dejan Nakarada-Kordicมีคำอธิบาย + สคริปต์สำหรับวิธีนี้ที่นี่: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

เวอร์ชันย่อคือคุณเพิ่มไฟล์ฐานข้อมูลอื่นที่ตำแหน่งใหม่จากนั้นใช้ DBCC Shrinkfile พร้อมตัวเลือก EMPTYFILE เพื่อย้ายข้อมูลจากไฟล์เก่าไปยังไฟล์ใหม่ เมื่อเสร็จแล้วคุณสามารถลบไฟล์ข้อมูลเก่า

ไม่ใช่โซลูชันของฉันฉันกำลังมองหาโซลูชันนี้ด้วยตนเองและพบว่ามีประโยชน์มากสำหรับสภาพแวดล้อมการผลิตของเรา

Thorfinn


1

ทำตาม 4 ขั้นตอนง่าย ๆ เหล่านี้:

  1. เปิด SSMS และเลือกตัวเลือกแบบสอบถามใหม่จากด้านบนของหน้าต่าง จากนั้นคัดลอกและดำเนินการแบบสอบถามต่อไปนี้เพื่อค้นหาเส้นทางของฐานข้อมูลที่เราต้องการย้ายไปยังเส้นทางใหม่และโปรดทราบว่าเส้นทางที่คุณแสดงในCurrentLocationคอลัมน์

SELECT name, physical_name AS CurrentLocation FROM sys.master_files WHERE database_id = DB_ID('DATABASE_NAME');

  1. ตอนนี้ไปยังเส้นทางที่และทราบชื่อของDatabase_Name.mdf & Database_Name_log.ldfไฟล์ จากนั้นดำเนินการค้นหาสองต่อไปนี้เพื่อย้ายฐานข้อมูลไปยังตำแหน่งที่ระบุ

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');

  1. ตอนนี้หยุดเซิร์ฟเวอร์โดยคลิกขวาServer_Nameที่คุณสามารถดูใน Object Explorer (ด้านซ้าย)

    ป้อนคำอธิบายรูปภาพที่นี่

  2. จากนั้นย้ายไฟล์ทั้งสองจากเส้นทางเก่าไปยังเส้นทางใหม่และเริ่มต้นเซิร์ฟเวอร์อีกครั้งโดยคลิกขวาที่ Server_Name ยืนยันเส้นทางใหม่ของฐานข้อมูลโดยดำเนินการค้นหาขั้นตอนที่ 1 อีกครั้ง


0

ฉันไม่แน่ใจว่านี่เป็นวิธีที่ดีที่สุด (ฉันยินดีต้อนรับความคิดเห็นใด ๆ ที่จะบอกฉันว่ามันไม่ได้) แต่มันง่ายมาก (และรวดเร็วถ้าคุณมีฐานข้อมูลขนาดเล็ก):

ก่อนสำรองฐานข้อมูลไปยังไฟล์. bak จากนั้นกู้คืนฐานข้อมูลจากไฟล์. bak เดียวกันโดยเลือกตำแหน่งไฟล์. mdf และ .ldf ใหม่ภายใต้ตัวเลือกไฟล์สำหรับงานคืนค่า

ฉันจะไม่ทำในสภาพแวดล้อมการใช้งานจริงของหน้าต่างการบำรุงรักษาเนื่องจากคุณไม่สามารถเข้าถึงฐานข้อมูลในระหว่างการกู้คืนได้ วิธีอื่นที่ฉันเคยเห็นข้างต้นจะมีข้อเสียคล้าย หลังจากงานคืนค่าเสร็จสิ้นคุณไม่ต้องลบไฟล์เก่า มันทำโดยอัตโนมัติ


1
สถานการณ์นี้มีข้อบกพร่องบางประการ เมื่อกู้คืนฐานข้อมูลต้นฉบับจะต้องถูกเขียนทับหรือเปลี่ยนชื่อ สำหรับฐานข้อมูลขนาดใหญ่เมธอดแนะนำค่าใช้จ่าย IO ที่ร้ายแรง การย้ายไฟล์ตามที่อธิบายไว้ในdetach-attachหรือเปลี่ยนวิธีการdbเป็นวิธีที่เร็วกว่า หากไฟล์ถูกย้ายภายในพาร์ติชัน NTFS เดียวกันนั่นเป็นการดำเนินการเมตาดาต้าเท่านั้น
vonPryz

@Ali - สำรองและกู้คืน อาจใช้เวลานานกว่า แต่โดยทั่วไปจะเป็นเส้นทางที่ปลอดภัยกว่า ดูการวิเคราะห์ของแอรอนเบอร์ทรานด์ได้ที่: blogs.sqlsentry.com/aaronbertrand/bad-habits-file-backups นอกจากนี้: sqlmag.com/blog/should-i-be-using-san-snapshots-backup-solution
RLF

สำหรับฐานข้อมูลขนาดใหญ่มากวิธีการนี้ (และวิธีการแยก / แนบ) จะแนะนำการหยุดทำงานที่สำคัญ เพื่อหลีกเลี่ยงปัญหานี้ให้วางฐานข้อมูลต้นทางในโหมดการกู้คืนเต็มจากนั้นทำการกู้คืนข้อมูลสำรองเริ่มต้นด้วยฐานข้อมูลปลายทางที่ไม่สามารถใช้งานได้ จากนั้นสำรอง / กู้คืนบันทึกธุรกรรมอย่างน้อยหนึ่งรายการ ฐานข้อมูลจะต้องหยุดทำงานในระหว่างการสำรอง / กู้คืนครั้งสุดท้ายของบันทึกธุรกรรมซึ่งอาจมีเวลาและขนาดเล็กตามอำเภอใจ เห็นได้ชัดว่าคุณจะต้องกู้คืนชื่ออื่นแล้วทำการสลับชื่อ วิธีนี้เทียบเท่ากับการจัดส่งบันทึก
Brian

0

เพื่อเสริมคำตอบที่มีอยู่: นี่คือสคริปต์เพื่อสร้าง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 (ดูตัวอย่างคำตอบนี้เพื่อดูรายละเอียด)

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.