共用方式為


MSSQLSERVER_7105

適用於:SQL Server

詳細資料

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

說明

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

因為這個錯誤是嚴重性層級 22,因此聯機會由伺服器終止。 這個錯誤訊息也會寫入 SQL ERRORLOG 檔案和具有 EventID=7105 的 Windows 應用程式事件記錄檔中。

可能的原因

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

  • 資料庫頁面或 LOB 頁面結構中有資料庫頁面參考的資料庫損毀問題。
  • 遇到失敗的查詢是使用 READ UNCOMMITTED ISOLATION LEVELNOLOCK 查詢提示。
  • SQL Server 引擎內發生問題,導致查詢失敗,並出現此錯誤。

請參閱解決方式和 詳細資訊 小節,以判斷您特定問題的原因和適當的解決方案。

使用者動作

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

    • 訊息中會提供資料庫標識碼。

    • 若要找出完全受影響的數據表而不執行 DBCC CHECKDB,您必須找出發生錯誤之查詢所存取的數據表。 其中一種方法是使用 SQL Profiler 來追蹤查詢。 不過,在 SQL Server 2008 (10.0.x) 和 SQL Server 2008 (10.0.x) R2 中,您可以使用 system_health 擴充事件會話來尋找查詢。 如需如何使用system_health會話的詳細資訊,請參閱此連結: 使用 system_health 會話

    • 如同任何資料庫一致性問題,您可以從不包含此問題的已知良好備份還原,來解決這些錯誤。

    • 不過,如果您無法從備份還原,請遵循或DBCC CHECKTABLE修復這些錯誤的建議DBCC CHECKDB。 這可能會導致數據遺失。 如需使用 CHECKDB 和資料庫損毀問題原因的詳細資訊,請參閱文章: 如何針對 DBCC CHECKDB 所報告的資料庫一致性錯誤進行疑難解答。

  2. 可能會發生此錯誤,因為存取數據表的查詢使用 隔離等級 READ UNCOMMITTEDNOLOCK 查詢提示(也稱為「已變更讀取」)。

    • 如果 DBCC CHECKDBDBCC CHECKTABLE 未顯示與此數據表和 LOB 資料相關聯的任何錯誤,則最有可能的原因是使用 dedirty 讀取。 如果這是應用程式的情況,您必須避免使用已變更的讀取或重試查詢。

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

其他相關資訊

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

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

    訊息 8929,層級 16,狀態 1,第 1 行
    物件標識符2137058649、索引標識符 0、分割區標識碼72057594038910976、配置單位標識碼72057594039828480(類型數據列內數據):在非數據列數據列中發現錯誤,標識符131203072 RID 所識別的數據記錄所擁有的數據記錄 = (1:179:1)
    訊息 8964,層級 16,狀態 1,第 1 行
    數據表錯誤:對象識別碼2137058649、索引標識碼 0、分割區標識碼72057594038910976、配置單位標識元72057594039894016(類型 LOB 數據)。 未參考頁面 (1:177)、 位置 1、文字標識碼131203072的異列數據節點。
    訊息 8965,層級 16,狀態 1,第 1 行
    數據表錯誤:對象識別碼2137058649、索引標識碼 0、分割區標識碼72057594038910976、配置單位標識元72057594039894016(類型 LOB 數據)。 頁面 (255:177), 位置 1, 文字標識碼131203072由頁面參考的異列數據節點 (1:179), 位置 1,但在掃描中看不到

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

    資料庫頁面 1:179,位置 1 正在參考資料庫內無效頁面的 LOB 頁面(第 255:177 頁)。 Page (1:177) 是有效的 LOB 頁面,但從未由任何資料庫頁面參考。 因此,在此情況下,問題在於第 1 頁 1:179 中位置 1 的數據列參考第 255:177 頁,而不是 1:177。

  • 尋找片語「異列數據」和「類型LOB數據」,判斷錯誤是否 DBCC CHECKDB 與LOB頁面問題有關的關鍵。

    Msg 8929 與參考 LOB 頁面的資料庫頁面有關。
    Msg 8964 是錯誤,指出任何資料庫頁面未參考 LOB 頁面。
    Msg 8965 是錯誤,指出資料庫頁面參考 LOB 頁面,但不存在為有效的頁面

    在許多情況下,涉及這些類型的錯誤,修復會導致刪除指向LOB數據和LOB數據本身的數據列。 修復演算法只會嘗試移除影響有問題之資料庫數據列的 LOB 片段,但無法保證在所有情況下,視 LOB「樹狀結構」內損毀的專案而定。

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

    修復:刪除物件標識碼2137058649的記錄、索引標識碼 0、分割區標識碼72057594038910976、配置單位標識元72057594039828480(類型數據列數據),在頁面 (1:179), 位置 1。 將會重建索引。
    修復:刪除標識碼為131203072的 off-row 數據行,針對對象標識碼2137058649、索引標識碼 0、分割區標識元72057594038910976、配置單位標識碼72057594039894016(1:177)頁面上的單位標識符72057594039894016(類型 LOB 數據),位置 1。
    訊息 8929,層級 16,狀態 1,第 1 行
    物件標識符2137058649、索引標識符 0、分割區標識碼72057594038910976、配置單位標識碼72057594039828480(類型數據列內數據):在非數據列數據列中發現錯誤,標識符131203072 RID 所識別的數據記錄所擁有的數據記錄 = (1:179:1)
    已修復錯誤。
    訊息 8964,層級 16,狀態 1,第 1 行
    數據表錯誤:對象識別碼2137058649、索引標識碼 0、分割區標識碼72057594038910976、配置單位標識元72057594039894016(類型 LOB 數據)。 未參考頁面 (1:177)、 位置 1、文字標識碼131203072的異列數據節點。
    已修復錯誤。
    訊息 8965,層級 16,狀態 1,第 1 行
    數據表錯誤:對象識別碼2137058649、索引標識碼 0、分割區標識碼72057594038910976、配置單位標識元72057594039894016(類型 LOB 數據)。 頁面 (255:177), 位置 1, 文字識別碼131203072由頁面參考 (1:179), 位置 1, 但未在掃描中看到。
    無法修復此錯誤

    最後一則訊息說 Could not repair this error 是誤導性的。 錯誤已修復,因為指向無效頁面的資料庫頁面數據列已刪除(255:177)。