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

SQL Server 資料庫檔案移動最佳實踐:sp_detach_db / sp_attach_db 離線遷移指南

     編輯:關於SqlServer

為何需要離線移動?

資料庫檔案 (.mdf/.ldf) 在服務運行時被獨佔鎖定,無法直接複製/移動。必須先分離 釋放鎖定,移動檔案後再附加 回服務。

分離資料庫:sp_detach_db

EXEC sp_detach_db 'MyDatabase';
  • 僅限 sysadmin 固定伺服器角色執行。
  • 自動對所有資料表執行 UPDATE STATISTICS,確保統計資訊最新再離線。
  • 分離後資料庫從 `sys.databases` 移除,檔案釋放可自由移動/複製。

附加資料庫:sp_attach_db

EXEC sp_attach_db 'MyDatabase',
    @filename1 = 'D:\NewLocation\MyDatabase_Data.mdf',
    @filename2 = 'D:\NewLocation\MyDatabase_Log.ldf';
  • 至少指定主資料檔 (.mdf),記錄檔 (.ldf) 可選 (若省略會嘗試原路徑或自動建立)。
  • 檔案路徑必須為 SQL Server 服務帳號可存取的本地路徑 (UNC 路徑需權限)。
  • 附加成功後資料庫重新上線,可正常存取。

完整遷移流程

  1. 確認無作用中連線:EXEC sp_who2 檢查該資料庫 SPID,必要時 KILL 或設定 SINGLE_USER 滾斷連線。
  2. 執行 sp_detach_db。
  3. 在檔案系統層級移動/複製 .mdf/.ldf 至新磁碟/目錄 (建議使用 Robocopy 保留權限/屬性)。
  4. 執行 sp_attach_db 指定新路徑。
  5. 驗證:DBCC CHECKDB、查詢核心業務表、檢查 `sys.master_files` 路徑正確。
  6. 更新連線字串/別名 (如使用檔案路徑連線的舊應用)。

適用場景與替代方案

注意事項

  • 分離會移除資料庫鎖定與中繼資料,不可在複寫發布者/訂閱者、鏡像、記錄傳送角色資料庫上直接分離,需先移除拓撲角色。
  • 附加時若資料庫曾啟用 TRUSTWORTHY、DB_CHAINING、BROKER 等選項,需重新設定。
  • 大型資料庫移動耗時,規劃足夠停機窗口並預留回滾方案 (保留原檔案直到驗證通過)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
場景建議方法
同機器磁碟遷移 (停機窗口允許)sp_detach_db / sp_attach_db (最簡單、統計自動更新)
跨伺服器遷移 (需最小停機)備份/還原 (可壓縮、可差異、可鏡像)
Always On 可用性群組環境新增次要複本 → 容錯移轉 → 移除舊複本 (零停機)
SQL Server 2005+ 線上移動檔案ALTER DATABASE ... MODIFY FILE → 離線/上線單一檔案 (無需整庫分離)