Sql-Server

數據庫損壞:QueryStore 內部表

  • August 15, 2019

今天早上,收到以下電子郵件提醒:

日期/時間:2018 年 2 月 28 日上午 9:26:42

描述:嘗試在數據庫 9 中獲取邏輯頁面 (1:3948712) 失敗。它屬於分配單元72057594045857792而不是72059184917512192。

評論:(無)

作業執行:SQL Sentry 2.0 警報陷阱

查看次要副本的事件日誌,有 3 次出現相同的消息:

源 spid138

消息嘗試在數據庫 9 中獲取邏輯頁面 (1:3948712) 失敗。它屬於分配單元72057594045857792而不是72059184917512192。

在輔助副本(2 節點同步可用性組)上執行以下命令:

DBCC TRACEON(3604)
dbcc page (9, 1,3948712,3)
go
DBCC TRACEOff(3604)

來自任一副本的結果片段:

Page @0x00000070DAB8C000

m_pageId = (1:3948712)              m_headerVersion = 1               
m_type = 3 m_typeFlagBits = 0x0                m_level = 0            
m_flagBits = 0x8200 m_objId (AllocUnitId.idObj) = 129   m_indexId
(AllocUnitId.idInd) = 256  Metadata: AllocUnitId = 72057594046382080  
Metadata: PartitionId = 72057594040811520                             
Metadata: IndexId = 1 Metadata: ObjectId = 197575742      
m_prevPage = 0:0)                  m_nextPage = (0:0) pminlen = 0                 
m_slotCnt = 2                       m_freeCnt = 1634 m_freeData = 6568
m_reservedCnt = 0                   m_lsn = (46041:1506360:18)
m_xactReserved = 0                  m_xdesId = (0:0)                  
m_ghostRecCnt = 0 m_tornBits = -99702035              DB Frag ID = 1

在主副本上執行以下命令:

select OBJECT_NAME (197575742)
plan_persist_plan

問題

  1. 我是否正確地說我有一個plan_persist_plan作為查詢儲存一部分的表的聚集索引損壞?
  2. 是執行以下內容的最佳/唯一修復:
ALTER DATABASE MyDatabase SET QUERY_STORE CLEAR; 
  1. 如果 #2 是最好的解決方法,是否有任何好的方法可以保留查詢儲存中將被刪除的數據?
  2. 這種損壞是否表明 IO 子系統有問題?

其他資訊

  • 我顯然啟用了 QueryStore,它的容量為 350MB,目前處於讀寫模式,刷新間隔 15 分鐘,每小時收集一次統計資訊,擷取模式全部,基於自動大小的清理,5 天過時的查詢門檻值。
  • DB id 9 是一個關鍵業務使用者數據庫
  • 錯誤詳細資訊為錯誤:605,嚴重性:21,狀態:3。

我已按照指南檢查了 Windows 系統事件日誌。這僅產生“資訊”事件,沒有錯誤。

DBCC CHECKTABLE ('sys.plan_persist_plan');  

結果:

DBCC results for 'sys.plan_persist_plan'.
There are 12562 rows in 240 pages for object "sys.plan_persist_plan". 
DBCC execution completed. 
If DBCC printed error messages, contact your system administrator.

我無法建立正確的命令來重建索引,以下不起作用:

ALTER INDEX PK_plan_persist_plan_cidx ON sys.plan_persist_plan REBUILD;

正如我在上面的評論中所指出的,我在查詢儲存內部表中遇到了類似的損壞問題。

正如您自己所建議的那樣,我曾經ALTER DATABASE MyDatabase SET QUERY_STORE CLEAR;嘗試解決此問題,並且效果很好。在 SQL Server 2017 中,微軟添加了一個可以在清除數據之前嘗試的修復程序sp_query_store_consistency_check:(來源

如果您想保留數據,那麼可能唯一的方法是複製表格 - 我找不到為此創建腳本的人。

通常由於損壞,我也會擔心我的磁碟,但在這種情況下,我有點懷疑問題出在查詢儲存本身。

引用自:https://dba.stackexchange.com/questions/199023