故障場景
- 使用者資料庫 (非 master/msdb) 遭遇實體檔案損壞 (如磁碟壞軌、誤修改 MDF 位元組)。
- 資料庫啟動後狀態為「可疑」。
- 具備最近一次完整備份與後續交易日誌備份。
恢復前置條件
- 資料庫復原模式為 完整 或 大量記錄。
- 擁有損壞前的 完整備份 (`.bak`)。
- 擁有完整備份後至故障點的 所有交易日誌備份** 且鏈條未斷。
分步恢復操作 (isql / sqlcmd / SSMS)
步驟 1:尾端日誌備份 (關鍵!)
在還原前,嘗試備份目前作用中日誌 (包含未寫入資料檔的交易):
BACKUP LOG Test TO DISK = 'D:\Backup\Test_TailLog.bak' WITH NO_TRUNCATE;
- `NO_TRUNCATE`:即使資料庫損壞/可疑,仍嘗試讀取日誌檔案備份。
- 若成功,此備份包含故障前最後的交易,可將資料損失降至最低 (RPO ≈ 0)。
- 若失敗 (日誌檔同樣損壞),則依賴現有日誌備份鏈,RPO = 最後一次日誌備份時間點。
步驟 2:還原完整備份 (NORECOVERY)
RESTORE DATABASE Test FROM DISK = 'D:\Backup\Test_Full.bak' WITH NORECOVERY, REPLACE;
- `NORECOVERY`:保持資料庫處於恢復中狀態,等待後續日誌還原。
- `REPLACE`:允許覆蓋現有損壞資料庫檔案。
步驟 3:依序還原差異備份 (若有,同 NORECOVERY)
RESTORE DATABASE Test FROM DISK = 'D:\Backup\Test_Diff.bak' WITH NORECOVERY;
步驟 4:依序還原所有交易日誌備份
-- 除最後一個外,皆用 NORECOVERY
RESTORE LOG Test FROM DISK = 'D:\Backup\Test_Log1.bak' WITH NORECOVERY;
RESTORE LOG Test FROM DISK = 'D:\Backup\Test_Log2.bak' WITH NORECOVERY;
-- 最後一個 (含尾端日誌備份) 用 RECOVERY 完成
RESTORE LOG Test FROM DISK = 'D:\Backup\Test_TailLog.bak' WITH RECOVERY;
步驟 5:驗證
DBCC CHECKDB('Test') WITH NO_INFOMSGS;
SELECT * FROM Test..CriticalTable; -- 業務關鍵表抽查
關鍵風險與對策
| 風險 | 影響 | 對策 |
| 日誌備份鏈中斷 | 無法還原至故障點,資料遺失 = 斷點至故障間的交易 | 監控備份作業失敗告警;定期 `RESTORE VERIFYONLY` 驗證備份可用性 |
| 尾端日誌備份失敗 | RPO 退化為最後一次成功日誌備份 | 鏡像/AlwaysOn 同步複寫提供次級複本日誌備份能力 |
| 還原過程中斷電/錯誤 | 資料庫處於恢復中狀態 | 重新執行 `RESTORE DATABASE ... WITH RECOVERY` 完成恢復 |
現代版本 (SQL 2005+) 增強功能
- 頁面級還原: `RESTORE DATABASE ... PAGE = '1:100, 1:101' ...` 僅還原損壞頁面,線上完成,無需整庫離線。
- 檔案群組還原: 僅還原受損檔案群組,其他群組保持線上。
- 時間點還原 UI: SSMS「還原資料庫」→「時間軸」視覺化選擇還原點。
預防勝於治療:備份策略檢查清單
- 完整備份:每日 1 次,離站/異地複製。
- 差異備份:每 4-6 小時 (視資料變更率)。
- 交易日誌備份:每 15-60 分鐘 (視 RPO 需求)。
- 備份驗證:`RESTORE VERIFYONLY` / `CHECKSUM` 選項 / 定期演練還原。
- 備份加密:`WITH ENCRYPTION` (SQL 2014+) 防止備份檔外洩。
- 備份壓縮:`WITH COMPRESSION` (SQL 2008+) 節省儲存與傳輸頻寬。