交易記錄檔 (LDF) 是資料庫復原的靈魂,遺失 LDF 將導致資料庫進入 SUSPECT/RECOVERY_PENDING 狀態。修復策略取決於遺失時記錄檔是否包含**作用中交易**。本文詳細說明兩種情境的分級修復步驟,從簡單的分離附加到複雜的緊急模式搶救與資料匯出重建。
sp_attach_single_file_db 僅附加 MDF → 若報錯 「記錄檔不符,無法附加」,通常代表有作用中交易 (或檢查點未截斷)。DBCC CHECKDB 輸出、錯誤日誌、sys.databases.log_reuse_wait_desc。EXEC sp_detach_db 'DBName';
或 SSMS 右鍵資料庫 → 工作 → 分離。EXEC sp_attach_single_file_db 'DBName', 'D:\Data\DBName.mdf';
或 SSMS 右鍵資料庫資料夾 → 附加 → 選擇 .mdf → 移除 .ldf 列表項 → 確定。
SQL Server 會自動建立新的空白記錄檔 (1MB 起),資料庫上線。**資料零損失 (前提:確實無作用中交易)。**
核心邏輯:建立同名空資料庫 → 置換 MDF → 進入 EMERGENCY 模式 (繞過復原) → 單用戶模式修復 → 匯出資料重建新庫。
USE master;
GO
EXEC sp_configure 'allow updates', 1; -- 允許直接更新系統表 (SQL 2000/2005 僅支援)
RECONFIGURE WITH OVERRIDE;
GO
UPDATE sysdatabases SET status = 32768 WHERE name = 'DBName'; -- 32768 = EMERGENCY 模式
GO
注意:SQL Server 2008+ **移除 `allow updates` 選項**,改用 `ALTER DATABASE DBName SET EMERGENCY;`。
-- 重啟服務生效 EMERGENCY 模式 (或直接 ALTER DATABASE)
ALTER DATABASE DBName SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
DBCC CHECKDB('DBName', REPAIR_ALLOW_DATA_LOSS); -- 最後手段,可能遺失資料
GO
-- SQL 2000/2005
UPDATE sysdatabases SET status = 28 WHERE name = 'DBName'; -- 28 = 正常線上
EXEC sp_configure 'allow updates', 0;
RECONFIGURE WITH OVERRIDE;
GO
-- SQL 2008+
ALTER DATABASE DBName SET MULTI_USER;
ALTER DATABASE DBName SET ONLINE;
EMERGENCY 模式下資料庫唯讀且不保證交易一致性。**必須立即匯出資料到全新資料庫**:
| 風險 | 說明 |
|---|---|
| 資料遺失 | `REPAIR_ALLOW_DATA_LOSS` 會刪除損壞頁面/索引,**不可逆**。 |
| 交易不一致 | EMERGENCY 模式繞過復原,未提交交易可能殘留、已提交交易可能遺失。 |
| 系統表更新危險 | 直接 UPDATE `sysdatabases` 極度危險,僅限極端災難修復,且 SQL 2008+ 已封鎖。 |
| 預防勝於治療 |
|
LDF 遺失修復成功率高度依賴「是否有作用中交易」。無作用中交易 → 分離附加秒級修復;有作用中交易 → 需進入緊急模式、接受潛在資料遺失、最終仍需資料匯出重建。**最佳策略永遠是:完善的備份策略讓您根本不需要走這條路。**