2003-12-26 13:00 所有 POS 當機、伺服器極慢。重啟時 RAID 卡報警,系統日誌與 SQL Server 錯誤日誌大量出現 Error 823, Severity 24, State 2: I/O error (torn page),偏移位址指向 D:\DATA\POS_DB.mdf。
Error 823 表示 Windows API 讀寫成功,但邏輯檢查失敗(如不完整頁)。解決步驟:DBCC CHECKDB → 修復報錯 → 檢查系統事件日誌 → 聯繫硬體廠商診斷。
事件檢視器顯示一周前即有錯誤(偏移位址不同)。檢查 RAID 發現第 1 顆 HDD 紅燈亮起(灰塵遮蔽不易察覺)。結論:RAID5 單顆磁碟故障導致資料庫檔案損壞。
Msg 8909: Object ID 26342838, index ID 35207, page ID (1:50978). PageId in header mismatch.
Msg 8939: Object ID 859150106, index ID 255, page (1:238770). Buffer I/O error test failed.
Msg 8928: Object ID 861246123, index ID 0: Page (1:57291) could not be processed.
Msg 2511: Object ID 862626116, Index ID 0. Keys out of order on page (1:269310), slots 0 and 1.
大量資料表出現錯誤關聯,記錄所有受影響 Object ID 以便後續比對。
DBCC CHECKDB 錯誤依舊。RESTORE DATABASE POS_DB FROM DISK=...),重啟服務後 DBCC CHECKDB 錯誤與修復前完全一致。驚人發現:備份檔本身已包含損壞頁面,SQL Server 備份不驗證資料庫完整性。| 選項 | 行為 | 資料風險 |
|---|---|---|
| REPAIR_FAST | 輕量修復(如非叢集索引鍵) | 無 |
| REPAIR_REBUILD | 含 REPAIR_FAST + 重建索引等耗時操作 | 無 |
| REPAIR_ALLOW_DATA_LOSS | 含 REPAIR_REBUILD + 配置/取消配置頁、刪除損壞文字物件 | 可能遺失資料 |
ALTER DATABASE POS_DB SET SINGLE_USER
GO
DBCC CHECKDB('POS_DB', REPAIR_ALLOW_DATA_LOSS) WITH TABLOCK
GO
ALTER DATABASE POS_DB SET MULTI_USER
GO
DBCC results for 'TABLE_NAME'.
There are 1 rows in 1 pages for object 'TABLE_NAME'.
The error has been repaired.
CHECKDB found 0 allocation errors and 1 consistency errors in table '(Object ID 26342838)'.
CHECKDB fixed 0 allocation errors and 1 consistency errors in table '(Object ID 26342838)'.
大量類似訊息表示修復逐表進行。修復完成後務必重新備份並驗證資料完整性。
RESTORE VERIFYONLY 僅檢查備份集可讀性,必須定期在測試環境實際還原並執行 DBCC CHECKDB。