今天早上,收到以下电子邮件提醒:
日期/时间: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
:(来源)如果您想保留数据,那么可能唯一的方法是复制表格 - 我找不到为此创建脚本的人。
通常由于损坏,我也会担心我的磁盘,但在这种情况下,我有点怀疑问题出在查询存储本身。
回答你的问题#3
请参阅如何导出查询存储数据?在大多数情况下,导出 QS 数据并不难。我不能说你的错误是否会影响出口。
导出时可能会发现一些数据丢失,请参阅为什么 Query Store 缺少详细信息?
我修复了将数据库的兼容性级别从 110 更改为 130 (SQL Server 2016) 的错误。
我的实例构建版本是 13.0.5062.0,但是数据库是从旧版本迁移的,并且从未更改过兼容性级别。