首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> SQL Server 資料庫 >> 關於SqlServer

SQL Server 資料庫損壞:偵測機制、原因分類與輕量修復實戰

     編輯:關於SqlServer

資料庫損壞雖低機率,一旦發生影響巨大。本文系統整理:損壞根因 (I/O 子系統為主)、頁面保護機制 (Checksum/Torn Page)、偵測時機、輕量修復步驟 (DBCC CHECKDB 選項、頁面還原、備份還原策略)。

損壞根因分類

  1. I/O 子系統 (99%+):
     - 硬體:磁碟壞軌、控制器快取失效 (無 BBWC/FBWC)、記憶體錯誤 (非 ECC)、電源波動、溫濕度。
     - 軟體:防毒掃描攔截寫入、磁碟加密驅動 Bug、RAID 驅動缺陷、網路存儲 (iSCSI/SAN) 封包遺失。
     - 路徑:SQL Buffer Pool → Windows API → 過濾驅動 → HBA/NIC → Switch → SAN Controller → Disk。
  2. 人為操作:
     - 刪除記錄檔 (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/鏡像):主體讀取失敗自動向夥伴請求乾淨頁面。

輕量修復階梯 (由輕到重)

  1. 單頁還原 (Enterprise, Full Recovery):
    RESTORE DATABASE MyDB PAGE='1:123' FROM DISK='...' WITH NORECOVERY;
    RESTORE LOG MyDB FROM DISK='...' WITH RECOVERY;

    適用:少數幾頁損壞、備份鏈完整。
  2. DBCC CHECKDB REPAIR_REBUILD:
    ALTER DATABASE MyDB SET SINGLE_USER;
    DBCC CHECKDB (MyDB, REPAIR_REBUILD);
    ALTER DATABASE MyDB SET MULTI_USER;

    適用:非叢集索引損壞、無資料遺失風險 (重建索引)。
  3. DBCC CHECKDB REPAIR_ALLOW_DATA_LOSS:
    最後手段,會刪除損壞頁面/資料列,導致資料遺失。執行前必備份 (哪怕損壞也備份)。
  4. 完整還原:從最後乾淨完整備份 + 記錄備份鏈還原至損壞前時間點 (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 錯誤。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved