案例背景
- 系統:POS 前台資料庫 SQL Server 2000 Enterprise + SP3,後台 IBM DB2。
- OS:Windows 2000 Server (10 Users)。
- 硬體:P4 Xeon 2.4GHz ×2、36GB HDD ×5 做 RAID 5、1GB RAM、HP DDS4 錄帶機。
- 資料庫大小:~5GB。
- 備份策略:每日磁帶完整備份(7 天循環)+ 每晚硬碟完整備份 (master, msdb, POS_DB)。
故障爆發:2003-12-26 13:00
所有 POS 當機、伺服器極慢。重開機至 RAID 卡檢查階段報警。Windows 系統日誌與 SQL Server 錯誤日誌均出現:
Error: 823, Severity: 24, State: 2
I/O error (torn page) detected during read at offset 0x0000001bf96000 in file 'D:\DATA\POS_DB.mdf'.
錯誤 823 解析
I/O 邏輯檢查失敗:Windows API 讀/寫成功,但資料邏輯檢查失敗(如撕裂頁 torn page)。MSDN 建議:
- 檢查硬體(磁碟控制器、纜線、磁碟機)。
- 執行
DBCC CHECKDB 評估損壞範圍。
- 從備份還原。
修復實戰過程(文章截斷,補全關鍵步驟)
- 硬體層面:更換損壞磁碟、重建 RAID 5、確認控制器快取電池正常(避免斷電導致 torn page)。
- 嘗試附加現有檔案:
sp_attach_db 失敗(日誌不一致)。
- 嘗試單檔掛載:
sp_attach_single_file_db 失敗(資料頁損壞)。
- 緊急模式重建日誌:
sp_configure 'allow updates', 1; RECONFIGURE WITH OVERRIDE;
UPDATE sysdatabases SET status = 32768 WHERE name = 'POS_DB';
-- 重啟服務,SQL Server 嘗試重建日誌
- DBCC CHECKDB 修復:
sp_dboption 'POS_DB', 'single user', 'true';
DBCC CHECKDB('POS_DB', REPAIR_ALLOW_DATA_LOSS);
接受資料遺失完成修復。
- 資料驗證與業務恢復:核對關鍵交易表、從磁帶備份還原關鍵時段資料、重新同步至 DB2 後台。
教訓總結
- RAID 5 非備份替代品:控制器快取無電池保護、單顆磁碟故障重建期間效能極差且易發生二次故障。
- 備份必須可驗證:定期演練還原,確保磁帶可讀、備份檔案完整。
- 監控 823/824/825 錯誤:設定 SQL Server Agent 警示,第一時間發現 I/O 錯誤。
- 緊急模式為最後手段:必伴隨資料遺失,修復後務必完整 DBCC 檢查、應用層資料核對。