核心存儲過程
| 過程 | 用途 | 參數 |
| sp_detach_db | 脫機數據庫 | @dbname, @skipchecks |
| sp_attach_db | 附加數據庫 (含日誌) | @dbname, @filename1 (mdf), @filename2 (ldf)... |
| sp_attach_single_file_db | 僅附加數據文件 (自動重建日誌) | @dbname, @physname (mdf) |
場景一:完整遷移 (保留日誌、事務一致性)
-- 源服務器
EXEC sp_detach_db @dbname = 'TestDB';
GO
-- 複製 TestDB.mdf, TestDB_log.ldf 到目標服務器同路徑或新路徑
-- 目標服務器
EXEC sp_attach_db
@dbname = 'TestDB',
@filename1 = 'D:\MSSQL\Data\TestDB.mdf',
@filename2 = 'D:\MSSQL\Log\TestDB_log.ldf';
GO
場景二:僅遷移數據文件 (日誌損壞/丟失/不需要)
-- 源服務器 (可選,若服務器仍在線)
EXEC sp_detach_db @dbname = 'TestDB';
-- 目標服務器 (僅需 .mdf)
EXEC sp_attach_single_file_db
@dbname = 'TestDB',
@physname = 'D:\MSSQL\Data\TestDB.mdf';
GO
-- 系統自動創建新日誌文件 (TestDB_log.ldf),原日誌內容丟失
場景三:文件路徑變更遷移
-- 脫機
EXEC sp_detach_db 'TestDB';
-- 移動文件到新磁盤
-- 附加指定新路徑
EXEC sp_attach_db
@dbname = 'TestDB',
@filename1 = 'E:\NewData\TestDB.mdf',
@filename2 = 'F:\NewLog\TestDB_log.ldf';
現代化替代:BACKUP/RESTORE (推薦生產環境)
-- 備份
BACKUP DATABASE TestDB TO DISK = 'D:\Backup\TestDB.bak' WITH COMPRESSION, STATS=10;
-- 還原 (可指定新路徑)
RESTORE DATABASE TestDB
FROM DISK = 'D:\Backup\TestDB.bak'
WITH
MOVE 'TestDB' TO 'E:\NewData\TestDB.mdf',
MOVE 'TestDB_log' TO 'F:\NewLog\TestDB_log.ldf',
REPLACE, STATS=10;
優勢:不需脫機、支持差異/日誌備份鏈、可驗證備份完整性、跨版本遷移更安全。
版本兼容性注意
- 附加/脫機:SQL 2000+ 支持,但**不支持降級附加** (高版本 .mdf 不能附加到低版本)
- 備份/還原:支持跨版本升級 (如 2008R2 -> 2019),不支持降級
- 文件複製法:僅限同版本、同補丁級別
常見錯誤排查
| 錯誤 | 原因 | 解決 |
| 文件被占用 | 數據庫未脫機/服務未停 | sp_detach_db 或停止 SQL 服務 |
| 權限不足 | 服務賬戶無文件目錄權限 | 授予 SQL 服務賬戶 讀寫權限 |
| 版本不匹配 | 高版本 mdf 附加到低版本 | 使用備份還原升級路徑 |
| 日誌序列號不匹配 | 非正常脫機/複製 | sp_attach_single_file_db 重建日誌 |
總結
- 開發/測試/小庫快速遷移:
sp_detach_db + sp_attach_db
- 日誌損壞/無需日誌:
sp_attach_single_file_db
- 生產核心庫/跨版本/高可用:**備份/還原** 唯一標準
- 文件級遷移前**務必備份原始文件**