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

SQL Server 2000 數據庫修復實戰:823 錯誤、撕裂頁面與 RAID 故障應對

     編輯:關於SqlServer

案例背景

某 POS 項目:前端 SQL Server 2000 (Enterprise + SP3),後端 IBM DB2。硬件:P4 Xeon 2.4GHz×2、36GB×5 RAID5、1GB 內存、HP DDS4 磁帶庫。數據庫約 5GB。備份策略:每日磁帶全備(7 天循環)+ 夜間磁盤全備(master、msdb、POS_DB),雙重保險。

故障爆發

時間: 2003-12-26 13:00
現象: 所有 POS 死機、服務器極慢。重啟時 RAID 卡報警。
系統日誌:

Error: 823, Severity: 24, State: 2
I/O error (torn page) detected during read at offset 0x0000001bf96000 in file 'D:\DATA\POS_DB.mdf'
SQL Server 錯誤日誌:
2003-12-10 03:34:22.23 spid56 Error: 823, Severity: 24, State: 2
I/O error (torn page) detected during read at offset 0x00000074964000 in file 'D:\DATA\POS_DB.mdf'

錯誤 823 根因分析

MSDN 定義:I/O 邏輯檢查失敗。讀/寫 Windows API 調用成功,但數據邏輯校驗失敗(如撕裂頁面)。

撕裂頁面: SQL Server 8KB 頁面寫入磁盤時,若發生斷電/崩潰/RAID 控制器故障,導致頁面只寫入前 4KB 或後 4KB,形成「半新半舊」的撕裂頁。重讀時校驗和不匹配,拋出 823。

處理流程與關鍵決策

1. 立即停止寫入,評估損失範圍

  • 將資料庫設置為 SINGLE_USER 或離線,防止後續寫入擴大損壞
  • 檢查 RAID 控制器日誌、事件查看器,確認是否為硬件故障(本案為 RAID 卡/硬盤故障)

2. 執行 DBCC CHECKDB 評估邏輯損壞

DBCC CHECKDB (POS_DB) WITH NO_INFOMSGS, ALL_ERRORMSGS
  • 若報錯較少且可修復:嘗試 REPAIR_REBUILD(不丟失數據)或 REPAIR_ALLOW_DATA_LOSS(最後手段)
  • 本案因硬件故障導致大面積頁面損壞,DBCC 無法修復

3. 硬件層面修復(本案關鍵)

  • 更換故障硬盤,RAID 5 重建
  • 更換有問題的 RAID 卡/電池/緩存模組
  • 確認存儲子系統穩定後,再進行數據庫層面恢復

4. 從備份恢復(雙重備份發揮作用)

  1. 優先嘗試**最近一次磁盤全備**(RPO 最小,恢復最快)
  2. 若磁盤備份也損壞/不可用,啟用磁帶備份恢復
  3. 恢復順序:RESTORE DATABASE ... WITH NORECOVERY → 套用差異/日誌備份 → WITH RECOVERY
  4. 5. 極端情況:無可用備份時的搶救

    • sp_attach_single_file_db 僅掛載 MDF,自動重建 LDF(丟失未提交事務)
    • 第三方工具(如 ApexSQL Recover、SQL Database Recovery)嘗試從 MDF 提取數據
    • 最後手段:DBCC CHECKDB ... REPAIR_ALLOW_DATA_LOSS 接受數據損失換取庫上線

    經驗總結與最佳實踐

    1. 啟用頁面校驗和: ALTER DATABASE POS_DB SET PAGE_VERIFY CHECKSUM(SQL 2005+ 默認),比 TORN_PAGE_DETECTION 更強
    2. RAID 卡必配帶電池緩存(BBWC/FBWC): 斷電保護寫入緩存,防撕裂頁核心裝備
    3. 備份驗證機制: 定期 RESTORE VERIFYONLY、定期演練恢復,**未驗證的備份不算備份**
    4. 監控告警: 監控 823/824/825 錯誤、suspect_pages 表、RAID 控制器狀態、磁盤 SMART 信息
    5. 高可用架構: 關鍵業務上 AlwaysOn 可用性群組 / 數據庫鏡像 / 日誌傳送,RPO/RTO 可控

    後記

    本案最終通過更換硬盤+RAID卡重建、從磁盤夜間全備恢復,業務在 4 小時內恢復,數據丟失約 30 分鐘(最後一次日誌備份到故障間隔)。雙重備份策略挽救了核心數據,硬件投入(BBWC、熱備盤)證明是高回報的保險。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved