資料頁從記憶體 Buffer Pool 透過 Checkpoint / Lazy Writer 寫入持久化儲存,必須穿越:
任何一層發生電壓不穩、斷電、過熱、韌體 Bug、壞軌,皆可能導致頁面寫入錯誤。此外,人為編輯 MDF/NDF、未清理交易即刪除 LDF 亦屬常見人禍。
| 選項 | 版本 | 原理 | 建議 |
|---|---|---|---|
| NONE | 所有 | 不驗證 | 絕不可用 |
| TORN_PAGE_DETECTION | 2000+ | 每 512 bytes 扇區取 2 bits 做元資料 (共 32 bits),偵測「部分寫入」 | 舊版相容 |
| CHECKSUM | 2005+ | 整頁計算 4-byte Checksum 存頁首,讀取時重算比對,可偵測位元翻轉 | 預設且推薦 |
啟用CHECKSUM後,僅有新寫入頁面 會計算 checksum;既有資料頁需經DBCC CHECKDB或備份讀取才會驗證。
| 錯誤 | 嚴重度 | 意義 | 記錄位置 |
|---|---|---|---|
| 823 | 24 | 硬 IO 錯誤:OS 回報無法讀取 | Windows Event Log、SQL Error Log、msdb.dbo.suspect_pages |
| 824 | 24 | 軟 IO 錯誤:讀到頁面但 Checksum 不符 | 同上 |
| 825 | 10 (資訊) | 重試成功:最多 4 次重讀後通過 | SQL Error Log (非預設) |
建立 SQL Server Agent 警示 針對 823/824 發送郵件,可第一時間知悉損毀。
CONTINUE_AFTER_ERROR 可強制完成但標記損毀。-- 僅顯示錯誤,抑制資訊訊息
DBCC CHECKDB WITH NO_INFOMSGS;
-- 指定資料庫
DBCC CHECKDB (YourDB) WITH NO_INFOMSGS, ALL_ERRORMSGS;
DBCC CHECKALLOC:配置頁一致性DBCC CHECKTABLE:每張表邏輯一致性DBCC CHECKCATALOG:中繼資料一致性RESTORE DATABASE [DB] PAGE='1:155' FROM DISK='backup.bak' WITH NORECOVERY...DROP INDEX / CREATE INDEX 或 ALTER INDEX REBUILD 即可修復,無資料遺失。SINGLE_USER 模式 (停機),以刪除資料換取一致性,結果不可預測,執行前必須評估 SLA 與業務影響。PAGE_VERIFY CHECKSUM。BACKUP ... WITH CHECKSUM + RESTORE VERIFYONLY WITH CHECKSUM。DBCC CHECKDB WITH NO_INFOMSGS (大庫拆解子命令)。資料庫損毀多源自 IO 子系統,偵測靠 CHECKSUM、DBCC CHECKDB、備份驗證三層防線;修復優先使用冗余 (HA/備份),REPAIR_ALLOW_DATA_LOSS 為最後手段且意味著資料遺失。唯有完善的備份與監控,才能在災難發生時從容應對。