Sql-Server
數據庫損壞:QueryStore 內部表
今天早上,收到以下電子郵件提醒:
日期/時間: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
問題
- 我是否正確地說我有一個
plan_persist_plan
作為查詢儲存一部分的表的聚集索引損壞?- 是執行以下內容的最佳/唯一修復:
ALTER DATABASE MyDatabase SET QUERY_STORE CLEAR;
- 如果 #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
:(來源)如果您想保留數據,那麼可能唯一的方法是複製表格 - 我找不到為此創建腳本的人。
通常由於損壞,我也會擔心我的磁碟,但在這種情況下,我有點懷疑問題出在查詢儲存本身。