某 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'
MSDN 定義:I/O 邏輯檢查失敗。讀/寫 Windows API 調用成功,但數據邏輯校驗失敗(如撕裂頁面)。
撕裂頁面: SQL Server 8KB 頁面寫入磁盤時,若發生斷電/崩潰/RAID 控制器故障,導致頁面只寫入前 4KB 或後 4KB,形成「半新半舊」的撕裂頁。重讀時校驗和不匹配,拋出 823。
SINGLE_USER 或離線,防止後續寫入擴大損壞DBCC CHECKDB (POS_DB) WITH NO_INFOMSGS, ALL_ERRORMSGS
REPAIR_REBUILD(不丟失數據)或 REPAIR_ALLOW_DATA_LOSS(最後手段)RESTORE DATABASE ... WITH NORECOVERY → 套用差異/日誌備份 → WITH RECOVERYsp_attach_single_file_db 僅掛載 MDF,自動重建 LDF(丟失未提交事務)DBCC CHECKDB ... REPAIR_ALLOW_DATA_LOSS 接受數據損失換取庫上線ALTER DATABASE POS_DB SET PAGE_VERIFY CHECKSUM(SQL 2005+ 默認),比 TORN_PAGE_DETECTION 更強RESTORE VERIFYONLY、定期演練恢復,**未驗證的備份不算備份**suspect_pages 表、RAID 控制器狀態、磁盤 SMART 信息本案最終通過更換硬盤+RAID卡重建、從磁盤夜間全備恢復,業務在 4 小時內恢復,數據丟失約 30 分鐘(最後一次日誌備份到故障間隔)。雙重備份策略挽救了核心數據,硬件投入(BBWC、熱備盤)證明是高回報的保險。