今天遇到了一個關於資料庫一致性錯誤的案例。海外工廠的一臺SQL Server 2005(9.00.5069.00 Standard Edition)資料庫在做DBCC CHECKDB的時候出現了一致性錯誤,下麵總結一下處理過程。具體的一致性錯誤信息如下所示: Msg 8992, Level 16, ... ...
今天遇到了一個關於資料庫一致性錯誤的案例。海外工廠的一臺SQL Server 2005(9.00.5069.00 Standard Edition)資料庫在做DBCC CHECKDB的時候出現了一致性錯誤,下麵總結一下處理過程。具體的一致性錯誤信息如下所示:
Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3853, State 1: Attribute (referenced_major_id=248841561,referenced_minor_id=6) of row (class=0,object_id=440842245,column_id=0,referenced_major_id=248841561,referenced_minor_id=6) in sys.sql_dependencies does not have a matching row (object_id=248841561,column_id=6) in sys.columns.
Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3853, State 1: Attribute (referenced_major_id=264841618,referenced_minor_id=7) of row (class=0,object_id=440842245,column_id=0,referenced_major_id=264841618,referenced_minor_id=7) in sys.sql_dependencies does not have a matching row (object_id=264841618,column_id=7) in sys.columns.
CHECKDB found 0 allocation errors and 2 consistency errors not associated with any single object.
DBCC results for 'sys.sysrowsetcolumns'.
Msg 2508, Level 16, State 1, Line 1
The In-row data USED page count for object "GRNPGDetail", index ID 0, partition ID 60321137623040, alloc unit ID 60321137623040 (type In-row data) is incorrect. Run DBCC UPDATEUSAGE.
關於第三個一致性錯誤,我之前多篇博客都介紹過這種類型的一致性錯誤,需要使用DBCC UPDATEUSAGE,該命令可以針對錶或索引中的每個分區更正行、已用頁、保留頁、葉級頁和數據頁的計數。DBCC UPDATEUSAGE命令報告目錄視圖中的頁數和行數錯誤併進行更正。這些錯誤可能導致sp_spaceused 系統存儲過程返回不正確的空間使用報告。此處略過。
下麵我們來看看下麵這個一致性錯誤,從類型上,是屬於元數據損壞(metadata corruption)。但是這個案例呢,又有點特別,跟我之前遇到SQL Server元數據損壞(metadata corruption)修複案例不同,我們先來看看分析過程
首先,通過object_id找到這三個對象,然後我們通過錯誤信息,可以判斷sys.sql_dependencies裡面引用的對象,發現在sys.columns裡面不存在這行記錄(object_id=248841561,column_id=6;object_id=264841618,column_id=7 ), 如下截圖所示,確實沒有找到(object_id=248841561,column_id=6;object_id=264841618,column_id=7 )的記錄。
Msg 8992, Level 16, State 1, Line 1
Check Catalog Msg 3853, State 1: Attribute (referenced_major_id=248841561,referenced_minor_id=6) of row (class=0,object_id=440842245,column_id=0,referenced_major_id=248841561,referenced_minor_id=6) in sys.sql_dependencies does not have a matching row (object_id=248841561,column_id=6) in sys.columns.
然後分析存儲過程“zzzPrcUnallocationAgingSM_not used”(其實看這個存儲過程命名,就知道這個存儲過程廢棄了,我們有些開發人員喜歡這樣將一個存儲過程標記為廢棄了),研究分析發現,代碼裡面視圖VW_SMAllocatedQty有個欄位FactoryPoNo,而實際上,視圖已經沒有了這個欄位,所以才會報這個一致性錯誤,只要註釋掉這一行或刪除這個存儲過程,問題就解決了,DBCC CHEKDB檢查,就會發現不存在一致性錯誤了。