SQL Server 資料庫由主要資料檔(.mdf)、記錄檔(.ldf)組成。當發生硬體故障、誤刪、遷移遺失 LDF 等災難時,如何從檔案層面快速恢復是 DBA 必備技能。本文系統整理三大恢復場景:正常附加、單一 MDF 附加、疑似模式強制重建記錄檔,提供完整 T-SQL 腳本與圖形化操作步驟。
-- 完整路徑附加
EXEC sp_attach_db
@dbname = N'TestDB',
@filename1 = N'C:\Data\TestDB_data.mdf',
@filename2 = N'C:\Data\TestDB_log.ldf';
-- 僅附加單一檔案(會自動建立新 LDF)
EXEC sp_attach_single_file_db
@dbname = N'TestDB',
@physname = N'C:\Data\TestDB_data.mdf';
-- 1. 脫離資料庫(備份前必須)
EXEC sp_detach_db 'TestDB';
-- 2. 複製 .mdf / .ldf 到目標路徑
-- 3. 附加資料庫
EXEC sp_attach_db 'TestDB',
'C:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB_data.mdf',
'C:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB_log.ldf';
常見於:跨機器遷移遺失 LDF、LDF 損毀、僅備份了 MDF。
EXEC sp_attach_single_file_db 'TestDB', 'C:\Data\TestDB_data.mdf';
-- 可能出現警告:裝置啟動錯誤,已建立新記錄檔
錯誤:Msg 1813, Level 16, State 2: 未能開啟新資料庫 'test'. CREATE DATABASE 將終止。
CREATE DATABASE TestDB)。TestDB_log.ldf,用備份的 TestDB_data.mdf 覆蓋新建的 TestDB_data.mdf。USE master; GO
EXEC sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE; GO
UPDATE sysdatabases SET status = -32768 WHERE dbid = DB_ID('TestDB');
DBCC REBUILD_LOG('TestDB', 'C:\Program Files\Microsoft SQL Server\MSSQL\Data\TestDB_log.ldf');
若報錯 Msg 5030: 未能排它地鎖定資料庫,關閉所有連線(含 Enterprise Manager 視窗)後重試。
DBCC CHECKDB('TestDB');
EXEC sp_dboption 'TestDB', 'dbo use only', 'false';
EXEC sp_configure 'allow updates', 0; RECONFIGURE WITH OVERRIDE; GO
| 命令 | 用途 |
|---|---|
sp_detach_db | 脫離資料庫,釋放檔案鎖定 |
sp_attach_db | 附加 MDF+LDF |
sp_attach_single_file_db | 僅附加 MDF,自動建 LDF |
DBCC REBUILD_LOG | 重建交易記錄檔(緊急模式下) |
DBCC CHECKDB | 檢查資料庫邏輯/物理一致性 |
sp_dboption | 設定資料庫選項(單用戶、唯讀等) |
sp_configure 'allow updates' | 開啟/關閉系統表直接修改 |
REBUILD_LOG 會導致未提交交易遺失、邏輯一致性可能受損,務必事後執行 DBCC CHECKDB 並檢查業務數據完整性。BACKUP DATABASE 完整備份 + 差異/記錄備份,而非單純複製檔案。檔案級備份僅適用於離線冷備份場景。allow updates,避免誤操作系統表。從標準 sp_attach_db 到極端 REBUILD_LOG 災難恢復,掌握 MDF/LDF 檔案層面的操作全流程,能在關鍵時刻挽回業務數據。但請記住:沒有任何檔案級技巧能替代正規的備份策略。建立並定期演練災難恢復計畫(DRP),才是資料安全的根本保障。