MSSQLSERVER_7105

適用範圍: 是SQL Server (所有支援的版本)

詳細資料

屬性
產品名稱 SQL Server
事件識別碼 7105
事件來源 MSSQLSERVER
元件 SQLEngine
符號名稱 TXT_PGNOTEXIST
訊息文字 LOB 資料類型節點的資料庫識別碼 %d,頁 %S_PGID,位置 %d 不存在。 這種現象通常是因為可在資料頁上讀取未認可資料的交易而造成。 執行 DBCC CHECKTABLE

說明

當資料庫頁面資料列所參考的大型物件 (LOB) 資料無法提供存取時,查詢可能會遇到訊息 7105。

因為此錯誤的嚴重性層級為 22,所以伺服器會終止連線。 此錯誤訊息也會寫入 SQL 錯誤記錄檔與 Windows 應用程式事件記錄檔,且事件識別碼 = 7105。

可能的原因

此錯誤可能是因為下列其中一個原因而發生:

  • 資料庫頁面內,或資料庫頁面參考的 LOB 頁面結構內發生資料庫損毀。
  • 遭遇失敗的查詢所使用查詢提示為 READ UNCOMMITTED ISOLATION LEVELNOLOCK
  • SQL Server 引擎內的問題會導致查詢因此錯誤而失敗。

請參閱<解決方法>與詳細資訊章節,以判斷造成特定問題的原因,以及適當的解決方案。

使用者動作

  1. 如訊息所示,您應該採取的第一個步驟是針對資料庫執行 DBCC CHECKDB,或針對發生問題的資料表執行 DBCC CHECKTABLE

    • 訊息中提供了資料庫識別碼。

    • 若要在不執行 DBCC CHECKDB 的情況下,確實找出受影響的資料表,您必須找出發生錯誤的查詢所存取的資料表。 其中一個方法是使用 SQL Profiler 來追蹤查詢。 不過,在 SQL Server 2008 與 SQL Server 2008 R2 中,您可使用 system_health 擴充事件工作階段來尋找查詢。 如需如何使用 system_health 工作階段的詳細資訊,請參閱此連結:使用 system_health 工作階段

    • 就像所有資料庫一致性問題一樣,您可從沒有發生此問題的良好備份進行還原來解決這些錯誤。

    • 不過,若無法從備份還原,請遵循 DBCC CHECKDBDBCC CHECKTABLE 的建議來修復這些錯誤。 此方法可能會導致資料遺失。 如需使用 CHECKDB 和導致資料庫損毀問題的詳細資訊,請參閱下列文章:如何疑難排解 DBCC CHECKB 所報告的資料庫一致性錯誤

  2. 發生此錯誤的原因,可能是因為存取資料表的查詢使用 READ UNCOMMITTED 隔離等級,或使用 NOLOCK 查詢提示 (也稱為中途讀取)。

    • 如果 DBCC CHECKDBDBCC CHECKTABLE 未顯示與此資料表和 LOB 資料建立關聯的任何錯誤,則最可能的原因是使用了中途讀取。 如果應用程式遇到這種情況,即必須避免使用中途讀取,或重試查詢。

    • 若發現這是錯誤的原因,則實際上並不存在資料庫一致性問題。

詳細資訊

如果資料庫損毀是此問題的原因,DBCC CHECKDB 和/或 DBCC CHECKTABLE 應該會回報錯誤。 不過,這些命令將不會回報訊息 7105。 您在 CHECKDB 中所遇到錯誤將取決於 LOB 結構的參考,或 LOB 結構自身內損毀的內容而定。

  • 如果資料庫頁面資料列未正確參考有效的 LOB 頁面,您可能會看到類似下列的錯誤:

    訊息 8929,層級 16,狀態 1,第 1 行
    物件識別碼 2137058649,索引識別碼 0,分割區識別碼 72057594038910976,配置單位識別碼 72057594039828480 (鍵入資料列中資料):在由 RID = (1:179:1) 識別的資料記錄所擁有,且識別碼為 131203072 的非資料列資料中發現錯誤
    訊息 8964,層級 16,狀態 1,第 1 行
    資料表錯誤:物件識別碼 2137058649,索引識別碼 0,分割區識別碼 72057594038910976,配置單位識別碼 72057594039894016 (鍵入 LOB 資料): 未參考頁面 (1:177),位置 1,文字識別碼 131203072 的非資料列資料節點。
    訊息 8965、層級 16、狀態 1、第 1 行
    資料表錯誤:物件識別碼 2137058649,索引識別碼 0,分割區識別碼 72057594038910976,配置單位識別碼 72057594039894016 (鍵入 LOB 資料): 已在頁面 (1:179),位置 1 中參考頁面 (255:177),位置 1,文字識別碼 131203072 的非資料列資料節點,但在掃描時卻找不到。

  • 針對該問題的不同案例,可能會導致不同組合的錯誤。 在此範例中:

    資料庫頁面 1:179,位置 1 所參考 LOB 頁面不是資料庫 (第 255:177 頁) 中的有效頁面。 頁面 (1:177) 為有效的 LOB 頁面,但不曾由任何資料庫頁面參考。 因此在這種情況下,問題在於第 1:179 頁的位置 1 中的資料列參考第 255:177 頁,而不是第 1:177 頁。

  • 藉由尋找「非資料列資料」與「鍵入 LOB 資料」字詞,是判斷 DBCC CHECKDB 錯誤是否與 LOB 頁面問題相關的關鍵。

    訊息 8929 是與參考 LOB 頁面的資料庫頁面相關的錯誤。
    訊息 8964 是指出沒有任何資料庫頁面參考 LOB 分頁的錯誤。
    訊息 8965 是指出資料庫頁面已參考 LOB 頁面,但其不是有效頁面的錯誤

    在許多涉及這類錯誤的情況下,修復將會導致刪除指向 LOB 資料的資料列,以及 LOB 資料本身。 修復演算法會嘗試只移除會影響相關資料庫資料列的 LOB 片段,但無法保證在所有情況下都能完成此作業,視 LOB「樹狀結構」內的損毀內容而定。

  • 在此處顯示的範例中,CHECKTABLE 使用 REPAIR_ALLOW_DATA_LOSS 所傳回的訊息看起來如下:

    修復:已刪除記錄,物件識別碼 2137058649,索引識別碼 0,分割區識別碼 72057594038910976,配置單位識別碼 72057594039828480 (鍵入資料列中資料),頁面 (1:179)、位置 1。 將會重建索引。
    修復:已刪除非資料列資料資料行,識別碼 131203072,物件識別碼 2137058649,索引識別碼 0,分割區識別碼 72057594038910976,配置單位識別碼 72057594039894016 (鍵入 LOB 資料),頁面 (1:177),位置 1。
    訊息 8929,層級 16,狀態 1,第 1 行
    物件識別碼 2137058649,索引識別碼 0,分割區識別碼 72057594038910976,配置單位識別碼 72057594039828480 (鍵入資料列中資料):在由 RID = (1:179:1) 識別的資料記錄所擁有,且識別碼為 131203072 的非資料列資料中發現錯誤
    已修復錯誤。
    訊息 8964,層級 16,狀態 1,第 1 行
    資料表錯誤:物件識別碼 2137058649,索引識別碼 0,分割區識別碼 72057594038910976,配置單位識別碼 72057594039894016 (鍵入 LOB 資料): 未參考頁面 (1:177),位置 1,文字識別碼 131203072 的非資料列資料節點。
    已修復錯誤。
    訊息 8965、層級 16、狀態 1、第 1 行
    資料表錯誤:物件識別碼 2137058649,索引識別碼 0,分割區識別碼 72057594038910976,配置單位識別碼 72057594039894016 (鍵入 LOB 資料): 已在頁面 (1:179),位置 1 中參考頁面 (255:177),位置 1,文字識別碼 131203072 的非資料列資料節點,但在掃描時卻找不到。
    無法修復此錯誤。

    最後顯示訊息 Could not repair this error 會造成誤導。 此錯誤已修復,因為指向無效頁面 (255:177) 的資料庫頁面資料列已刪除。