Làm cách nào để di chuyển tệp cơ sở dữ liệu SQL Server?


103

Tôi có một cơ sở dữ liệu và muốn di chuyển các tập tin .mdf.ldfđến một vị trí khác. Nhưng tôi không muốn dừng MSSQLSERVERdịch vụ và tôi không muốn xuất sang máy chủ khác.

Tôi có thể làm cái này như thế nào?

Câu trả lời:


154

Bạn không phải dừng dịch vụ SQL Server để di chuyển các tệp cơ sở dữ liệu, nhưng bạn phải lấy cơ sở dữ liệu cụ thể ngoại tuyến. Điều này là do bạn không thể di chuyển các tệp trong khi chúng đang được truy cập và việc lấy cơ sở dữ liệu ngoại tuyến sẽ ngăn các tệp được sử dụng bởi ứng dụng SQL Server.

Quá trình di chuyển chúng khá đơn giản. Detach / Đính kèm đã được mô tả, nhưng nó không gần như phức tạp này.

Thay đổi vị trí tệp bằng ALTER DATABASElệnh:

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

Lưu ý, bạn không cần phải khai báo vị trí cũ trong lệnh này. Thay đổi đường dẫn này không có hiệu lực ngay lập tức, nhưng sẽ được sử dụng vào lần tiếp theo cơ sở dữ liệu khởi động.

Đặt cơ sở dữ liệu ngoại tuyến

(Tôi sử dụng WITH ROLLBACK IMMEDIATEđể đuổi tất cả mọi người ra và phục hồi tất cả các giao dịch hiện đang mở)

ALTER DATABASE foo SET OFFLINE WITH ROLLBACK IMMEDIATE;

Di chuyển / Sao chép các tập tin vào vị trí mới

Chỉ cần sao chép các tệp qua phương thức yêu thích của bạn (Nhấp vào Drag n Kéo, XCopy, Sao chép-Mục, Robocopy)

Đưa cơ sở dữ liệu trực tuyến

ALTER DATABASE foo SET ONLINE;

Bạn có thể thấy điều này được mô tả chi tiết hơn ở đây .


13
Điều này làm việc cho tôi. Trong trường hợp của tôi, tôi cũng phải di chuyển tệp LDF bằng lệnh đầu tiên: vd 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
Cũng có thể được sử dụng để di chuyển các tệp chỉ mục văn bản đầy đủ chỉ bằng cách cập nhật tên tệp để khớp với những gì bạn thấy trong hộp thoại tệp.
DShook

24
Đảm bảo sau khi di chuyển (các) tệp cơ sở dữ liệu, người dùng "NT DỊCH VỤ \ MSSQLSERVER" có quyền đối với tệp đó hoặc bạn sẽ gặp lỗi khi cố gắng đưa cơ sở dữ liệu trở lại trực tuyến.
Demonslay335

"Tên" được cho là gì? Trong tài liệu này có "logic_name." Có ý nghĩa gì?
johnny

2
@mlhDev Thật ra trong trường hợp của tôi MODIFY FILElà có thể thay đổi. Nếu bạn chạy MODIFY FILE trước, nó sẽ cho bạn biết lệnh chạy thành công và vị trí sẽ được thay đổi sau khi hoạt động ngoại tuyến trực tuyến (cách diễn đạt khác nhưng bạn hiểu ý). Tuy nhiên, ngoại tuyến-> Di chuyển tệp-> Đặt hàng trực tuyến có vấn đề vì lý do rõ ràng. Cũng đánh dấu ghi chú của Demonslay335. Cho phép tập tin là quan trọng.
Lionet Chen

50

Các tập tin MDF và LDF được bảo vệ và không thể di chuyển trong khi cơ sở dữ liệu trực tuyến.

Nếu bạn không dừng việc cơ sở dữ liệu hoạt động, thì bạn có thể làm DETACHđiều đó, di chuyển các tệp và sau ATTACHđó.

  • Nhấp chuột phải vào tên của cơ sở dữ liệu
  • Lựa chọn Properties
  • Chuyển đến Filestab
  • Ghi lại PathFileNamecác tập tin MDF và LDF . Bước này rất quan trọng trong trường hợp bạn không muốn kết thúc việc tìm kiếm các tệp bị thiếu ...
  • Nhấp chuột phải vào tên cơ sở dữ liệu
  • Lựa chọn Tasks -> Detach
  • Di chuyển các tập tin mà bạn muốn
  • Nhấp chuột phải vào Databasesnút của máy chủ của bạn
  • Lựa chọn Attach
  • Bấm vào Addnút
  • Chỉ vào vị trí mới
  • Nhấp chuột OK

Bạn sẽ ổn ngay bây giờ. Thông tin về DETACH- ATTACHquá trình có thể được tìm thấy ở đây .

Trong liên kết về DETACH- ATTACHcó một đề xuất sử dụng ALTER DATABASEcâu lệnh nếu giữ cơ sở dữ liệu trên cùng một phiên bản của SQL Server. Tham khảo thêm trong Di chuyển cơ sở dữ liệu người dùng .

Nếu bạn muốn giữ cho nó chạy trong khi di chuyển, sau đó làm một BACKUP- RESTORE. Trong quá trình khôi phục, bạn có thể xác định vị trí mới của các tệp cơ sở dữ liệu.


3
Tôi khuyên bạn nên mở SQL Management Studio với tư cách quản trị viên để tránh các sự cố truy cập tệp khi gắn lại
Simon_Weaver

6

Để di chuyển tệp cơ sở dữ liệu hệ thống, hãy làm theo các bước sau:

  1. Đăng nhập với tư cách người dùng trong SSMS

  2. Hãy sao lưu cơ sở dữ liệu do người dùng tạo để đảm bảo an toàn.

  3. Giết tất cả các phiên được kết nối với Máy chủ từ SSMS.

  4. Thực hiện lệnh sau để kiểm tra vị trí tệp hiện tại của cơ sở dữ liệu hệ thống:

    USE master;
    SELECT * FROM sys.master_files;

Xác định đường dẫn và lưu ý đường dẫn hiện tại của tệp.

  1. Sử dụng TSQL để thay đổi đường dẫn tệp cho tất cả cơ sở dữ liệu ngoại trừ chính:

    ALTER DATABASE database_name MODIFY FILE ( NAME = logical_name , FILENAME = 'new_path\os_file_name' )

Ví dụ:

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

Bây giờ vị trí tập tin đã được thay đổi.

Đảm bảo di chuyển cả tệp ldf và mdf

  1. Trong SSMS nhấp chuột phải vào Máy chủ và chọn thuộc tính. Thuộc tính bên trong đi đến Cài đặt cơ sở dữ liệu. Thay đổi vị trí mặc định của cơ sở dữ liệu cho Dữ liệu và Nhật ký thành đường dẫn đích. Đăng xuất khỏi máy chủ.

    Vd: đổi C:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\thànhE:\projects\DataBaseFiles\MSSQL\DATA\

  2. Dừng phiên bản SQL Server.

  3. Sao chép tập tin hoặc tập tin vào vị trí mới. Sử dụng Robocopy để di chuyển các tệp để sao chép quyền truy cập vào thư mục đích. Mở cmd và chạy với tư cách quản trị viên và sử dụng lệnh sau:

    robocopy / sec sourceFolder DestinationFolder

Tốt hơn là đi đến vị trí nguồn để chạy lệnh. Xóa các tệp khác ngoài tệp cơ sở dữ liệu hệ thống được sao chép. Ví dụ:

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

(Ở đây chúng tôi đang di chuyển tất cả các tệp cơ sở dữ liệu hệ thống sang vị trí mới.)

  1. Từ menu Bắt đầu, trỏ đến Tất cả chương trình, trỏ đến Microsoft SQL Server, trỏ đến Công cụ cấu hình, sau đó bấm Trình quản lý cấu hình máy chủ SQL.

Thực hiện các bước follwing trong Trình quản lý cấu hình SQL Server:

Trong nút Dịch vụ máy chủ SQL, bấm chuột phải vào phiên bản của SQL Server (ví dụ: Máy chủ SQL (MSSQLSERVER)) và chọn Thuộc tính .. Trong hộp thoại Thuộc tính SQL Server (instance_name), bấm vào tab Tham số khởi động. Trong hộp Tham số hiện có, chọn tham số mật khẩu để di chuyển tệp dữ liệu chủ. Nhấp vào Cập nhật để lưu thay đổi. Trong hộp Chỉ định tham số khởi động, thay đổi tham số thành đường dẫn mới của cơ sở dữ liệu chủ. Trong hộp Tham số hiện có, chọn tham số mật khẩu để di chuyển tệp nhật ký chính. Nhấp vào Cập nhật để lưu thay đổi. Trong hộp Chỉ định tham số khởi động, thay đổi tham số thành đường dẫn mới của cơ sở dữ liệu chủ.

Giá trị tham số cho tệp dữ liệu phải tuân theo tham số -d và giá trị cho tệp nhật ký phải tuân theo tham số -l. Ví dụ sau đây cho thấy các giá trị tham số cho vị trí mặc định của tệp dữ liệu chủ.

-dC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\master.mdf
-lC:\Program Files\Microsoft SQL Server\MSSQL12.SQLEXPRESS\MSSQL\DATA\mastlog.ldf

Nếu định vị lại theo kế hoạch cho tệp dữ liệu chủ là E: \ SQLData, các giá trị tham số sẽ được thay đổi như sau:

-dE:\projects\DataBaseFiles\MSSQL\DATA\master.mdf
-lE:\projects\DataBaseFiles\MSSQL\DATA\mastlog.ldf

Dừng phiên bản SQL Server bằng cách bấm chuột phải vào tên đối tượng và chọn Dừng. Khởi động lại phiên bản của SQL Server.

  1. Đăng nhập với tư cách sangười dùng trong SSMS và xác minh vị trí của các tệp cơ sở dữ liệu bằng cách thực hiện truy vấn sau:

    USE master;
    SELECT * FROM sys.master_files;

Tất cả đã được làm xong.


Bạn có thể sử dụng hàm SQL để tự động hóa tác vụ cho tất cả các cơ sở dữ liệu: stackoverflow.com/a/19505918/439524
đặc biệt

3

Bạn làm từng bước một:

  1. đóng tất cả kết nối
    THAY ĐỔI CƠ SỞ MyDB SET SINGLE_USER VỚI ROLLBACK NGAY LẬP TỨC

  2. thiết lập cơ sở dữ liệu với trạng thái ngoại tuyến
    THAY ĐỔI MyDB SET OFFLINE

  3. Đến đường dẫn mới
    THAY ĐỔI TẬP TIN MyDB MODIFY FILE (Tên = MyDB, Tên tệp = 'N: \ DATA \ MyDB.MDF')

  4. đặt cơ sở dữ liệu với trạng thái trực tuyến
    THAY ĐỔI MyDB SET ONLINE

  5. thiết lập nhiều người dùng
    ALTER DATABASE MyDB SET MULTI_USER


3

Có một cách để di chuyển các tệp dữ liệu cơ sở dữ liệu (chưa chắc chắn nếu có cách nào để thực hiện việc này cho các tệp dữ liệu) mà không cần lấy cơ sở dữ liệu ngoại tuyến.

Dejan Nakarada-Kordic có lời giải thích + tập lệnh cho phương thức này tại đây: https://www.itprotoday.com/sql-server/move-database-files-without-taking-database-offline

Phiên bản ngắn là bạn thêm một tệp cơ sở dữ liệu khác tại vị trí mới, sau đó sử dụng DBCC Shrinkfile, với tùy chọn EMPTYFILE để di chuyển dữ liệu từ tệp cũ sang tệp mới. Khi điều này được thực hiện, bạn có thể loại bỏ các tập tin dữ liệu cũ.

Không phải giải pháp của tôi, tôi đã tự mình tìm kiếm giải pháp này và thấy nó rất hữu ích cho môi trường sản xuất của chúng tôi.

Thorfinn


1

Thực hiện theo 4 bước đơn giản sau:

  1. Mở SSMS và chọn tùy chọn Truy vấn mới từ đầu cửa sổ. Sau đó Sao chép và thực hiện Truy vấn sau để tìm đường dẫn Cơ sở dữ liệu mà chúng tôi muốn chuyển sang đường dẫn mới và lưu ý đường dẫn mà bạn hiển thị trong CurrentLocationcột.

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

  1. Bây giờ đi đến con đường đó và lưu ý tên của Database_Name.mdf & Database_Name_log.ldf tập tin. Sau đó thực hiện hai Truy vấn sau để di chuyển Cơ sở dữ liệu đến Vị trí cụ thể.

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. Bây giờ, Dừng máy chủ bằng cách nhấp chuột phải vào Server_Namecái mà bạn có thể thấy trong Object Explorer (Bên trái).

    nhập mô tả hình ảnh ở đây

  2. Sau đó Di chuyển cả hai tệp từ Đường dẫn cũ sang Đường dẫn mới và khởi động lại máy chủ bằng cách Nhấp chuột phải vào Server_Name. Xác nhận đường dẫn mới của cơ sở dữ liệu bằng cách thực hiện lại truy vấn của bước 1.


0

Tôi không chắc chắn rằng đây là cách tốt nhất (tôi sẽ hoan nghênh mọi bình luận để cho tôi biết nó không như thế nào), nhưng nó rất đơn giản (và nhanh chóng nếu bạn có một cơ sở dữ liệu nhỏ):

Đầu tiên, sao lưu cơ sở dữ liệu vào tệp .bak. Sau đó, khôi phục cơ sở dữ liệu từ cùng một tệp .bak, chọn vị trí tệp .mdf và .ldf mới trong các tùy chọn tệp cho tác vụ khôi phục.

Tôi sẽ không làm điều đó trong môi trường sản xuất bên cạnh cửa sổ bảo trì, vì bạn không thể truy cập cơ sở dữ liệu trong quá trình khôi phục. Các phương pháp khác tôi đã thấy ở trên sẽ có nhược điểm tương tự. Sau khi hoàn thành nhiệm vụ khôi phục, bạn không phải xóa tệp cũ. Nó tự động được thực hiện.


1
Kịch bản này có một số nhược điểm. Khi khôi phục, DB gốc phải được ghi đè hoặc đổi tên. Đối với cơ sở dữ liệu lớn, phương pháp giới thiệu chi phí IO nghiêm trọng. Di chuyển các tệp như được mô tả trong tách rời hoặc đính kèm các phương thức dbcách nhanh hơn. Nếu các tệp được di chuyển trong cùng một phân vùng NTFS, thì đó chỉ là hoạt động siêu dữ liệu.
vonPryz

@Ali - Sao lưu và khôi phục. Có thể mất nhiều thời gian hơn, nhưng nói chung là một con đường an toàn hơn. Xem phân tích của Aaron Bertrand tại: blog.sqlsentry.com/aaronbertrand/bad-habits-file-backups Ngoài ra: sqlmag.com/blog/should-i-be-USE-san-snapshots-backup-solution
RLF

Đối với cơ sở dữ liệu rất lớn, phương pháp này (và phương pháp tách / đính kèm) đưa ra thời gian chết đáng kể. Để tránh điều này, hãy đặt cơ sở dữ liệu nguồn ở chế độ khôi phục hoàn toàn, sau đó thực hiện khôi phục sao lưu ban đầu với DB đích không hoạt động. Sau đó sao lưu / khôi phục một hoặc nhiều nhật ký giao dịch. Cơ sở dữ liệu sẽ chỉ cần ngừng hoạt động trong lần sao lưu / khôi phục cuối cùng của nhật ký giao dịch, có thể chứa thời gian và kích thước nhỏ tùy ý. Rõ ràng bạn cũng sẽ cần khôi phục lại một tên khác và sau đó thực hiện trao đổi tên. Cách tiếp cận này gần tương đương với vận chuyển log.
Brian

0

Để bổ sung các câu trả lời hiện có: Đây là một tập lệnh để tạo các ALTER DATABASE ... MOVE ...câu lệnh cho tất cả các cơ sở dữ liệu:

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

Ghi chú:

  • Thay thế REPLACE(f.physical_name, 'C:\', 'D:\')bằng bất kỳ chuyển đổi nào bạn muốn thực hiện cho đường dẫn tệp.

  • masterđược miễn, vì đường dẫn của nó được xác định bởi các tùy chọn khởi động của SQL Server (xem, ví dụ, câu trả lời này để biết chi tiết).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.