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 LEVEL
或NOLOCK
查詢提示。 - SQL Server 引擎內發生問題,導致查詢失敗,並出現此錯誤。
請參閱解決方式和 詳細資訊 小節,以判斷您特定問題的原因和適當的解決方案。
使用者動作
如訊息所指出,您應該採取的第一個步驟是
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 所報告的資料庫一致性錯誤進行疑難解答。
可能會發生此錯誤,因為存取數據表的查詢使用 隔離等級
READ UNCOMMITTED
或NOLOCK
查詢提示(也稱為「已變更讀取」)。如果
DBCC CHECKDB
或DBCC 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)。