適用情境
- 硬體故障、非正常關機導致 LDF 損壞/遺失。
- 資料庫呈現 `SUSPECT` (置疑) 狀態,錯誤日誌記錄 `Could not redo log record`、`The log cannot be rebuilt because the database was not cleanly shut down`。
- 無法卸離 (`DETACH`)、無法 `ATTACH_REBUILD_LOG`。
- **無可用備份**,僅存 MDF 主資料檔案。
⚠️ 風險警示
此流程屬**最後手段**,將導致 **未提交交易遺失** 並可能造成 **資料不一致** (需 `DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS`)。執行前務必複製 MDF 檔案備份。
逐步恢復操作流程
階段一:建立空殼資料庫並置換 MDF
- **停止 SQL Server 服務** (MSSQLSERVER)。
- **備份原始 MDF** 複製至安全位置 (如 `D:\Backup\DBName.mdf`)。
- **啟動 SQL Server 服務**。
- **刪除原資料庫** (SSMS 右鍵 Delete,確認關閉現有連線)。
- **建立同名新資料庫** (檔案名、路徑、大小建議與原設定一致)。
- **停止 SQL Server 服務**。
- **用備份的原始 MDF 覆蓋** 新建資料庫的 MDF 檔案。
- **啟動 SQL Server 服務**。此時資料庫將進入 `RECOVERY_PENDING` 或 `SUSPECT` 狀態。
階段二:緊急模式修復
-- 1. 設定緊急模式 (僅 sysadmin 可存取,唯讀,不執行恢復)
ALTER DATABASE [YourDB] SET EMERGENCY;
GO
-- 2. 切換單一使用者模式 (排除其他連線干擾修復)
ALTER DATABASE [YourDB] SET SINGLE_USER WITH ROLLBACK IMMEDIATE;
GO
-- 3. 執行修復 (允許資料遺失 - 最後手段)
DBCC CHECKDB ([YourDB], REPAIR_ALLOW_DATA_LOSS) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
-- 4. 重建索引/修復結構 (補充修復)
DBCC CHECKDB ([YourDB], REPAIR_REBUILD) WITH NO_INFOMSGS, ALL_ERRORMSGS;
GO
-- 5. 恢復多使用者模式
ALTER DATABASE [YourDB] SET MULTI_USER;
GO
-- 6. 關閉緊急模式
ALTER DATABASE [YourDB] SET ONLINE; -- 隱含從 EMERGENCY 返回
GO
關鍵指令解析
| 指令 |
作用 |
注意事項 |
| `SET EMERGENCY` |
繞過恢復程序掛載資料庫,唯讀,僅 sysadmin 可存取,`sys.databases.state_desc = EMERGENCY` |
不執行 REDO/UNDO,交易日誌未被使用 |
| `SET SINGLE_USER ... ROLLBACK IMMEDIATE` |
強制斷開所有連線,確保獨佔執行 DBCC |
生產環境謹慎執行,會中斷業務 |
| `REPAIR_ALLOW_DATA_LOSS` |
嘗試修復所有報告錯誤,**可能刪除損壞頁面/資料列導致資料遺失** |
**不可逆**,執行前必須複製 MDF 備份 |
| `REPAIR_REBUILD` |
執行非破壞性修復 (重建索引、修復頁面鏈結等) |
不會遺失資料,建議在 ALLOW_DATA_LOSS 後執行 |
修復後驗證清單
- 執行 `DBCC CHECKDB ([YourDB]) WITH NO_INFOMSGS` 確認無錯誤。
- 檢查核心業務資料表列數、關鍵欄位完整性、外鍵約束 (`DBCC CHECKCONSTRAINTS`)。
- 立即執行 **完整備份** (`BACKUP DATABASE ...`),建立新的恢復基準點。
- 考慮重建索引 (`ALTER INDEX ALL ON ... REBUILD`) 整理碎片。
- 若啟用複寫/鏡像/CDC,需重新設定。
替代方案評估 (優先順序)
- 還原備份 (最佳): 完整備份 + 記錄備份 → 時間點還原,零資料遺失 (視 RPO)。
- 頁面級還原 (Enterprise): 僅少數頁面損壞時,從備份還原特定頁面。
- 次要檔案群組離線還原: 損壞非 PRIMARY 檔案群組時,PRIMARY 上線服務,背景還原。
- 本文流程 (最後手段): 無備份、僅存 MDF、接受資料遺失風險。
預防勝於治療
- 配置 **完整復原模式 + 定期完整/差異/記錄備份** 至異地儲存。
- 啟用 **頁面驗證 CHECKSUM** (`ALTER DATABASE SET PAGE_VERIFY CHECKSUM`)。
- 部署 **資料庫鏡像/AlwaysOn 可用性群組** 實現高可用。
- 監控 `suspect_pages` 表、`DBCC CHECKDB` 定期排程 (建議週次),設置警示。
- UPS 電源保護、RAID 儲存、定期硬體健康檢查。