Câu trả lời:
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 DATABASE
lệ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 .
MODIFY FILE
là 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.
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
đó.
Properties
Files
tabPath
và FileName
cá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 ...Tasks -> Detach
Databases
nút của máy chủ của bạnAttach
Add
nútOK
Bạn sẽ ổn ngay bây giờ. Thông tin về DETACH
- ATTACH
quá trình có thể được tìm thấy ở đây .
Trong liên kết về DETACH
- ATTACH
có một đề xuất sử dụng ALTER DATABASE
câ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.
Để di chuyển tệp cơ sở dữ liệu hệ thống, hãy làm theo các bước sau:
Đăng nhập với tư cách người dùng trong SSMS
Hãy sao lưu cơ sở dữ liệu do người dùng tạo để đảm bảo an toàn.
Giết tất cả các phiên được kết nối với Máy chủ từ SSMS.
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.
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
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\
Dừng phiên bản SQL Server.
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.)
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.
Đăng nhập với tư cách sa
ngườ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 làm từng bước một:
đóng tất cả kết nối
THAY ĐỔI CƠ SỞ MyDB SET SINGLE_USER VỚI ROLLBACK NGAY LẬP TỨC
thiết lập cơ sở dữ liệu với trạng thái ngoại tuyến
THAY ĐỔI MyDB SET OFFLINE
Đế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')
đặt cơ sở dữ liệu với trạng thái trực tuyến
THAY ĐỔI MyDB SET ONLINE
thiết lập nhiều người dùng
ALTER DATABASE MyDB SET MULTI_USER
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
Thực hiện theo 4 bước đơn giản sau:
CurrentLocation
cột.
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');
Bây giờ, Dừng máy chủ bằng cách nhấp chuột phải vào Server_Name
cái mà bạn có thể thấy trong Object Explorer (Bên trái).
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.
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.
Để 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).
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