SQL Server 備份除 BACKUP DATABASE 外,直接複製 .mdf (資料檔) 與 .ldf (記錄檔) 也是常見做法。本文詳述正常掛載流程,並深入解析僅有 MDF 檔案時的緊急還原技術。
-- 卸離資料庫
EXEC sp_detach_db 'db_name';
-- 掛載完整資料庫 (需 mdf + ldf)
EXEC sp_attach_db @dbname = 'db_name',
@filename1 = 'path\db_data.mdf',
@filename2 = 'path\db_log.ldf';
-- 僅掛載資料檔 (自動建立新記錄檔)
EXEC sp_attach_single_file_db @dbname = 'db_name',
@physname = 'path\db_data.mdf';
關鍵:備份時務必同時複製 .mdf 與 .ldf 兩個檔案。
情境:僅備份了 MDF,或從其他伺服器複製來的 MDF 無對應 LDF,直接 sp_attach_single_file_db 可能失敗,報錯:
訊息 1813,層級 16:無法開啟新資料庫。CREATE DATABASE 將終止。
裝置啟動錯誤。實體檔案名 '..._log.LDF' 可能有誤。
CREATE DATABASE testtest_log.ldf,用備份的 test_data.mdf 覆蓋 test_data.mdfUSE master; GO
EXEC sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE; GO
UPDATE sysdatabases SET status = -32768 WHERE dbid = DB_ID('test'); GO
企業管理員顯示「唯讀/置疑/離線/緊急模式」,僅見系統表。DBCC REBUILD_LOG('test', 'path\test_log.ldf'); GO
若報錯「無法排他鎖定」,關閉企業管理員連線後重試。成功訊息:「警告: 資料庫 'test' 的日誌已重建。已失去交易一致性...」DBCC CHECKDB('test')EXEC sp_dboption 'test', 'dbo use only', 'false'; GO
EXEC sp_configure 'allow updates', 0; RECONFIGURE WITH OVERRIDE; GO