資料庫損壞雖低機率,一旦發生影響巨大。本文系統整理:損壞根因 (I/O 子系統為主)、頁面保護機制 (Checksum/Torn Page)、偵測時機、輕量修復步驟 (DBCC CHECKDB 選項、頁面還原、備份還原策略)。
損壞根因分類
- I/O 子系統 (99%+):
- 硬體:磁碟壞軌、控制器快取失效 (無 BBWC/FBWC)、記憶體錯誤 (非 ECC)、電源波動、溫濕度。
- 軟體:防毒掃描攔截寫入、磁碟加密驅動 Bug、RAID 驅動缺陷、網路存儲 (iSCSI/SAN) 封包遺失。
- 路徑:SQL Buffer Pool → Windows API → 過濾驅動 → HBA/NIC → Switch → SAN Controller → Disk。
- 人為操作:
- 刪除記錄檔 (LDF) 導致資料庫 SUSPECT。
- 十六進位編輯器直接修改 MDF/NDF。
- 非正常關機 (電源拔除) 導致未 Checkpoint 的髒頁遺失。
頁面保護機制 (三選一)
| 選項 | 機制 | 偵測能力 | Overhead | 建議 |
| CHECKSUM (預設 SQL 2005+) | 每頁尾計算 CRC/Checksum,寫入時驗證 | 完整偵測位元翻轉、頁面撕裂 | 極低 | 生產環境必開 |
| TORN_PAGE_DETECTION | 儲存頁面特定位元模式,讀取時比對 | 僅偵測 8KB 頁面部分寫入 (Torn Page) | 極低 | 舊版相容用 |
| NONE | 無保護 | 無 | 無 | 嚴禁 |
偵測時機
- 讀取時:查詢/掃描讀取頁面 → 驗證 Checksum → 失敗報錯
824 (邏輯錯誤) / 823 (I/O 錯誤)。
- 備份時:
BACKUP ... WITH CHECKSUM 逐頁驗證,發現損壞中止備份並報錯。
- DBCC CHECKDB:全庫掃描驗證所有頁面、索引一致性、系統表關聯。
- 自動頁面修復 (AlwaysOn/鏡像):主體讀取失敗自動向夥伴請求乾淨頁面。
輕量修復階梯 (由輕到重)
- 單頁還原 (Enterprise, Full Recovery):
RESTORE DATABASE MyDB PAGE='1:123' FROM DISK='...' WITH NORECOVERY;
RESTORE LOG MyDB FROM DISK='...' WITH RECOVERY;
適用:少數幾頁損壞、備份鏈完整。
- DBCC CHECKDB REPAIR_REBUILD:
ALTER DATABASE MyDB SET SINGLE_USER;
DBCC CHECKDB (MyDB, REPAIR_REBUILD);
ALTER DATABASE MyDB SET MULTI_USER;
適用:非叢集索引損壞、無資料遺失風險 (重建索引)。
- DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS:
最後手段,會刪除損壞頁面/資料列,導致資料遺失。執行前必備份 (哪怕損壞也備份)。
- 完整還原:從最後乾淨完整備份 + 記錄備份鏈還原至損壞前時間點 (Point-in-Time)。
預防清單
- 啟用 PAGE_VERIFY CHECKSUM、BACKUP CHECKSUM。
- 儲存層:RAID 1/10/5/6 + BBWC/FBWC,定期巡檢 (Patrol Read)。
- 記憶體:ECC RAM,啟用 Windows
Driver Verifier 測試儲存驅動。
- 備份策略:每日完整 + 每 15 分鐘記錄,定期
RESTORE VERIFYONLY、DBCC CHECKDB 離線檢查 (或備份副本上執行)。
- 監控:
msdb.dbo.suspect_pages、sys.dm_io_virtual_file_stats 錯誤計數、Windows 事件記錄 Disk 錯誤。