Elv*_*dov 0 sql-server dbcc-checkdb sql-server-2016 dbcc-checktable
我在其中一个数据库上运行 DBCC CHECKDB 时遇到了分配错误。它抛出以下错误:
消息 8947,级别 16,状态 1,第 5 行表错误:对象 ID 1277199566、索引 ID 1、分区 ID 720577176766669456、分配单元 ID 720577087666647328 的多个 IAM 页(类型 LOB 数据)包含间隔。IAM 页面 (1:425664) 和 (1:1422669)。
CHECKDB 在表“schemaName.tableName”(对象 ID 1277199566)中发现 1 个分配错误和 0 个一致性错误。CHECKDB 在数据库“databaseName”中发现 1 个分配错误和 0 个一致性错误。
奇怪的是,当我尝试在该表上运行 DBCC CHECKTABLE 时,它没有显示任何错误。此外,我尝试运行 CHECKTABLE WITH EXTENDED_LOGICAL_CHECKS 选项,但没有出现任何错误。
根据 Microsoft 文档:
要对数据库中的每个表执行 DBCC CHECKTABLE,请使用 DBCC CHECKDB。
对于指定的表,DBCC CHECKTABLE 检查以下内容:
- 索引、行内、LOB 和行溢出数据页正确链接。
- 索引按正确的排序顺序排列。
- 指针是一致的。
- 每页数据合理,包括计算列。
- 页面偏移是合理的。
- 基表中的每一行在每个非聚集索引中都有一个匹配的行,反之亦然。
- 分区表或索引中的每一行都在正确的分区中。
- 使用 FILESTREAM 在文件系统中存储 varbinary(max) 数据时文件系统和表之间的链接级一致性
但正如我所看到的,相反的情况并非如此。我们不能只对一张表运行 CHECKTABLE 并为同一张表获得相同的结果。
在检查特定对象的完整性和一致性方面,是否有人拥有与这两个命令之间的差异相关的信息?
通过执行以下操作检查指定数据库中所有对象的逻辑和物理完整性:
- 在数据库上运行DBCC CHECKALLOC。
- 对数据库中的每个表和视图运行DBCC CHECKTABLE。
- 在数据库上运行DBCC CHECKCATALOG。
- 验证数据库中每个索引视图的内容。
- 使用 FILESTREAM 在文件系统中存储 varbinary(max) 数据时,验证表元数据与文件系统目录和文件之间的链接级一致性。
- 验证数据库中的 Service Broker 数据。
跑步DBCC CHECKTABLE
只是这些步骤之一。
要查看分配错误,您需要运行DBCC CHECKALLOC
.
DBCC CHECKTABLE
确实对属于该对象的页面执行广泛的检查。它不会检查可能以不一致的方式引用表的数据库范围的分配元数据。DBCC CHECKALLOC
执行这些检查。