**分離** 與 **附加** 是 SQL Server 移動資料庫檔案 (MDF/LDF)、跨伺服器遷移、版本升級、磁碟重組的核心技術。操作簡單、停機時間短、保留完整資料與中繼資料 (權限、索引、統計、觸發器等)。
USE master;
GO
-- 強制單一使用者模式並立即回滾
ALTER DATABASE [MyDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 分離
EXEC sp_detach_db 'MyDB', 'true'; -- 'true' = 更新統計資料
GO
CREATE DATABASE [MyDB] ON
(FILENAME = N'D:\SQLData\MyDB.mdf'),
(FILENAME = N'D:\SQLLog\MyDB_log.ldf')
FOR ATTACH;
GO
-- 若記錄檔遺失/損毀,可嘗試重建記錄檔 (僅限乾淨關閉)
-- CREATE DATABASE [MyDB] ON (FILENAME = N'D:\SQLData\MyDB.mdf') FOR ATTACH_REBUILD_LOG;
| 問題 | 原因與解決 |
|---|---|
| 分離失敗「資料庫正在使用中」 | 檢查 `sys.dm_exec_sessions`、`sp_who2`;關閉應用程式連接池、停止 Agent 作業、停用複寫/鏡像;或勾選「卸除連接」。 |
| 附加後資料庫標示「疑似損毀」 | 檔案複製不完整、來源資料庫未乾淨關閉、版本不相容 (來源版本 > 目標版本)。檢查 ERRORLOG、嘗試 `DBCC CHECKDB`。 |
| 附加報錯「找不到記錄檔」 | 若資料庫乾淨關閉,可用 `FOR ATTACH_REBUILD_LOG` 重建記錄檔;否則需從備份還原。 |
| 權限錯誤「存取被拒」 | SQL Server 服務帳號 (或啟用服務 SID `NT SERVICE\MSSQLSERVER`) 無目標資料夾 NTFS 權限。授予 `Modify` 權限。 |
| 全文檢索目錄遺失 | 全文目錄不在資料庫檔案中,需單獨遷移或重建全文索引。 |
| Filestream 資料遺失 | Filestream 資料容器 (資料夾結構) 必須隨 MDF/LDF 一起移動,且路徑相對關係保持一致。 |
| 維度 | 分離/附加 | 備份/還原 |
|---|---|---|
| 停機時間 | 極短 (僅分離/附加瞬間) | 較長 (備份+複製+還原) |
| 版本升級 | 支援 (附加時自動升級) | 支援 (還原時自動升級) |
| 檔案級操作 | 直接移動檔案 | 需備份裝置/檔案 |
| 時間點恢復 | 不支援 | 支援 (完整+記錄備份) |
| 跨網路傳輸 | 需先複製檔案 | 可直接備份至網路共享 |
| 生產環境風險 | 分離瞬間不可用、需強制中斷連接 | 線上備份無停機 (完整模式) |
建議:計畫性遷移/磁碟重組用 **分離/附加**;災難恢復/時間點恢復/跨網路異地備份用 **備份/還原**。