首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

SQL Server 數據庫脫機附加遷移:sp_detach_db、sp_attach_db、sp_attach_single_file_db 實戰

     編輯:PHP 相關知識

核心存儲過程

過程用途參數
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
  • 生產核心庫/跨版本/高可用:**備份/還原** 唯一標準
  • 文件級遷移前**務必備份原始文件**
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved