创建尽可能简单的数据库:
CREATE DATABASE DatabaseCheck
将此数据库添加到可用性组,其中辅助数据库不可读
在主要运行中:
DBCC CHECKDB ('DatabaseCheck') WITH EXTENDED_LOGICAL_CHECKS
它成功了:
CHECKDB 在数据库“DatabaseCheck”中发现 0 个分配错误和 0 个一致性错误。DBCC 执行已完成。如果 DBCC 打印了错误消息,请联系您的系统管理员。
在辅助服务器上运行相同的 DBCC 命令。即使未发现任何错误,它仍会失败:
CHECKDB 在数据库“DatabaseCheck”中发现 0 个分配错误和 0 个一致性错误。消息 0,级别 11,状态 0,第 1 行 当前命令发生严重错误。结果(如果有)应被丢弃。
- 删除 WITH
EXTENDED_LOGICAL_CHECKS
可消除错误 - 使辅助副本可读可以消除错误
- 执行故障转移并检查新的主服务器后错误消失。检查新的辅助服务器后再次显示错误。
知道这是怎么回事吗?检查DBCC CHECKDB 文档没有提到 EXTENDED_LOGICAL_CHECKS 在不可读的辅助副本上不受支持。在我看来,这似乎是命令本身的一个错误。
我在命令输出中注意到的一件事是,它会检查如下统计数据:
已验证统计信息“sys.sysrscols.clst”的完整性。已验证统计信息“sys.sysrowsets.clust”的完整性。已验证统计信息“sys.sysrowsets._WA_Sys_00000002_00000005”的完整性。已验证统计信息“sys.sysrowsets._WA_Sys_00000003_00000005”的完整性。已验证统计信息“sys.sysrowsets._WA_Sys_00000006_00000005”的完整性。已验证统计信息“sys.sysrowsets._WA_Sys_00000004_00000005”的完整性。已验证统计信息“sys.sysrowsets._WA_Sys_00000005_00000005”的完整性。已验证统计信息“sys.sysrowsets._WA_Sys_00000008_00000005”的完整性。
在辅助运行时不存在这些
转载于:
Microsoft SQL Server 2019 (RTM-CU23) (KB5030333) - 15.0.4335.1 (X64) 2023 年 9 月 21 日 17:28:44 版权所有 (C) 2019 Microsoft Corporation 开发人员版(64 位)在 Windows Server 2019 Standard 10.0(内部版本 17763:)上
编辑:
错误日志中唯一的消息是:
Domain\user 执行的 DBCC CHECKDB (DatabaseCheck) 发现 0 个错误并修复了 0 个错误。耗时:0 小时 0 分钟 0 秒。内部数据库快照具有分割点 LSN = 00000034:000001b1:0001 和第一个 LSN = 00000034:000001af:0002。
sys.dm_server_memory_dumps 中没有最近的转储
我已经向 Microsoft 提交了一张票,因为我们在生产环境中遇到了这个“问题”。我希望这能为大家澄清这个问题,因为文档一开始就不是那么明显。
简短回答:扩展逻辑检查需要对数据库的读取访问权限。
票上的长答案:
问题:
客户尝试在辅助不可读副本上运行“DBCC CHECKDB WITH EXTENDED_LOGICAL_CHECKS”,但失败并显示:错误:976 状态 14。请参见图 1。这在 SQL 2019 和 2022(最新 CU)上可重现。如果辅助副本被标记为可读,则此过程成功且没有任何错误。
解决:
我可以确认,这种行为是设计使然。根据我们使用“EXTENDED_LOGICAL_CHECKS”的文档(...对索引视图、XML 索引和空间索引执行逻辑检查...)。
DBCC CHECKDB (Transact-SQL) - SQL 服务器
此行为是设计使然,因为要执行一致性检查,我们需要对数据库的读取权限。
(即 引用同一篇文章...。{ }这些逻辑一致性检查将索引对象的内部索引表与其引用的用户表进行交叉检查。为了找到离群行,构建了一个内部查询来执行内部表和用户表的完全交集...){ }
我还检查了堆栈转储并发现错误 976,这也证实我们正在尝试读取数据。
定义: