前幾天解決客戶問題時,碰到一個現象。 當客戶查詢一張表時,報錯, 如下: Location: statutil.cpp:3225Expression: m_fInitialized && m_statBlob.CbSize() && iKey >= -1 && iKey < m_statBlob.G ...
前幾天解決客戶問題時,碰到一個現象。
當客戶查詢一張表時,報錯, 如下:
Location: statutil.cpp:3225
Expression: m_fInitialized && m_statBlob.CbSize() && iKey >= -1 && iKey < m_statBlob.GetHeader()->GetKeyCount()
SPID: 61
Process ID: 1876
消息 3624,級別 20,狀態 1,第 1 行
系統斷定檢查已失敗。有關詳細信息,請查看 SQL Server 錯誤日誌。通常,斷定失敗是由軟體錯誤或數據損壞導致的。若要檢查資料庫是否已損壞,請考慮運行 DBCC CHECKDB。如果您同意在安裝過程中將轉儲發送到 Microsoft,則將向 Microsoft 發送微型轉儲。更新可能在 Microsoft 的最新 Service Pack 或技術支持部門的 QFE 中提供。
消息 0,級別 20,狀態 0,第 0 行
當前命令發生了嚴重錯誤。應放棄任何可能產生的結果。 看到這錯誤 ,給人的第一印像是 資料庫里是不是有壞頁了,所以隨即對整個庫做 DBCC CHECKDB 的檢查(當然對那特定的表做檢查也是快速定位錯誤的一種途徑),但檢查的 0 個分配錯誤和 0 個一致性錯誤 。這倒讓我有些差異,隨即查看 error log ,發現用戶在幾分鐘前重啟過sql server 服務,並且當時資料庫里的這張表正在重新組織索引,那麼這時就把這問題基本上縮小範圍了。 此時,我這樣做了一下驗證,通過其它欄位查詢同樣一條內客是可以的,但就是用特定的那個欄位去查詢會報錯,又通過 sp_helpindex 查看這張表上的索引情況,發現出問題的欄位上果然有索引,所以讓客戶把涉汲這個欄位的索引全部刪除重建,再去查詢就正常了。 事後問客戶,為啥重啟sql 服務,他們說在重新組織索引時,發現等了半天也沒有動靜,以為卡死了,所以就重啟了。 關於重建索引,重新組織索引,以及聯機索引的知識,請參考後續的博客,謝謝。