情境:.bak 還原失敗(版本不符、檔案損壞、路徑衝突等),但手邊有完整的 .mdf (資料檔) 與 .ldf (記錄檔)。解法:停止服務 → 複製檔案 → sp_attach_db 附加。
net stop MSSQLSERVER。.mdf、.ldf 至目標伺服器資料目錄(如 D:\SQLData\)。net start MSSQLSERVER。EXEC sp_attach_db
@dbname = N'MyDatabase',
@filename1 = N'D:\SQLData\MyDatabase.mdf',
@filename2 = N'D:\SQLData\MyDatabase_log.ldf';
@dbname:附加後的資料庫名稱(必須唯一)。@filename1:主資料檔完整路徑(含 N'' 前綴表示 Unicode 字串,避免中文路徑亂碼)。@filename2:記錄檔完整路徑。@filename1~@filename16)。使用 sp_attach_single_file_db(SQL Server 2005+ 已棄用,建議改用 CREATE DATABASE ... FOR ATTACH_REBUILD_LOG):
-- SQL Server 2005/2008/2012/2014/2016/2019 推薦寫法
CREATE DATABASE MyDatabase
ON (FILENAME = N'D:\SQLData\MyDatabase.mdf')
FOR ATTACH_REBUILD_LOG;
GO
此指令會自動重建記錄檔(新記錄檔約 500KB),資料庫進入正常線上狀態。
sp_attach_db 或 FOR ATTACH_REBUILD_LOG 掛載使用者資料庫。Setup /QUIET /ACTION=REBUILDDATABASE ...。僅 sysadmin 固定伺服器角色成員可執行附加作業。
N'路徑' 強制 Unicode 解譯,雙位元組字元(中文路徑/檔名)才不會亂碼導致附加失敗。
掌握 sp_attach_db / FOR ATTACH_REBUILD_LOG,在備份檔不可用時仍能快速恢復資料庫服務。