DBCC CHECKTABLE ( table_name | view_name [,{ NOINDEX | index_id } |,{ REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ] ) [ WITH { ALL_ERRORMSGS ] [,EXTENDED_LOGICAL_CHECKS ] [,NO_INFOMSGS ] [,TABLOCK ] [,ESTIMATEONLY ] [,{ PHYSICAL_ONLY | DATA_purity } ] } ]
- table_name | view_name
-
要进行完整性检查的表或索引视图。表名或视图名必须符合有关标识符的规则。
- NOINDEX
-
指定不应对用户表的非聚集索引执行会占用很大系统开销的检查。这将减少总执行时间。NOINDEX 不会影响系统表,因为完整性检查的执行对象始终是所有系统表索引。
- index_id
-
要执行完整性检查的索引标识 (ID) 号。如果指定了 index_id,则 DBCC CHECKTABLE 只对该索引以及堆或聚集索引执行完整性检查。
- REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD
- ALL_ERRORMSGS
- EXTENDED_LOGICAL_CHECKS
-
如果兼容级别为 100 (sql Server 2008) 或更高,则对索引视图、XML 索引和空间索引(如果存在)执行逻辑一致性检查。
有关详细信息,请参阅本主题后面“备注”部分中的“对索引执行逻辑一致性检查”。
- NO_INFOMSGS
-
取消显示所有信息性消息。
- TABLOCK
-
可使 DBCC CHECKTABLE 获得一个共享表锁,而不使用内部数据库快照。TABLOCK 可使 DBCC CHECKTABLE 在负荷较重的表上运行得更快,但 DBCC CHECKTABLE 运行时会减少表上可获得的并发性。
- ESTIMATEONLY
- PHYSICAL_ONLY
-
限制为检查页、记录标头以及 B 树的物理结构的完整性。此选项旨在以较低的开销检查表的物理一致性,同时,此项检查还可以检测可能危及用户数据安全的残缺页和常见的硬件故障。DBCC CHECKTABLE 完全运行的时间可能比在早期版本中完全运行的时间长得多。导致此行为发生的原因如下:
-
逻辑检查更加全面。
-
要检查的某些基础结构更为复杂。
-
引入了许多新的检查以包含新增功能。
因此,使用 PHYSICAL_ONLY 选项可能会使 DBCC CHECKTABLE 在大型表上运行的时间短得多,所以对需要频繁检查的生产系统,建议使用 DBCC CHECKTABLE。我们仍然建议定期执行 DBCC CHECKTABLE 的完整运行。这些运行的执行频率取决于各业务和生产环境特定的因素。PHYSICAL_ONLY 始终表示 NO_INFOMSGS,不能与任何一个修复选项一同使用。
注意指定 PHYSICAL_ONLY 会导致 DBCC CHECKTABLE 跳过对 FILESTREAM 数据的所有检查。
-
- DATA_purity
-
使 DBCC CHECKTABLE 检查表中是否存在无效或越界的列值。例如,DBCC CHECKTABLE 检测到日期和时间值大于或小于 datetime 数据类型的可接受范围的列,或者小数位数或精度值无效的 decimal 或近似 numeric 数据类型列。
对于在 sql Server 2005 及更高版本中创建的数据库,默认情况下将启用列值完整性检查,并且不需要使用 DATA_purity 选项。对于从 sql Server 的早期版本升级的数据库,您可以使用 DBCC CHECKTABLE WITH DATA_purity 查找和更正特定表中的错误;但是,默认情况下不会对该表启用列值检查,直到 DBCC CHECKDB WITH DATA_purity 在数据库中正确运行时为止。然后,DBCC CHECKDB 和 DBCC CHECKTABLE 将默认检查列值完整性。
无法使用 DBCC 修复选项来纠正该选项所报告的验证错误。有关手动更正这些错误的信息,请参阅知识库文章 923247:解决 SQL Server 2005 中的 DBCC 错误 2570。
如果指定了 PHYSICAL_ONLY,则不执行列完整性检查。
|
---|
若要对数据库中的每个表执行 DBCC CHECKTABLE,请使用 DBCC CHECKDB。 |
对于指定的表,DBCC CHECKTABLE 将检查以下内容:
-
是否已正确链接索引、行内、LOB 以及行溢出数据页。
-
索引是否按照正确的顺序排列。
-
各指针是否一致。
-
每页上的数据是否合理(包括计算列)。
-
页面偏移量是否合理。
-
基表的每一行是否在每个非聚集索引中具有匹配的行,以及非聚集索引的每一行是否在基表中具有匹配的行。
-
已分区表或索引的每一行是否都位于正确的分区中。
-
使用 FILESTREAM 将 varbinary(max) 数据存储在文件系统中时,文件系统与表之间是否保持链接级一致性。
对索引执行逻辑一致性检查
对索引进行的逻辑一致性检查因数据库兼容级别而异,如下所示:
-
如果兼容级别为 100 (sql Server 2008) 或更高:
-
除非指定 NOINDEX,否则 DBCC CHECKTABLE 将对单个表及其所有非聚集索引同时执行物理和逻辑一致性检查。但是,在默认情况下,仅对 XML 索引、空间索引和索引视图执行物理一致性检查。
-
如果指定了 WITH EXTENDED_LOGICAL_CHECKS,则将对索引视图、XML 索引和空间索引(如果存在)执行逻辑检查。默认情况下,先执行物理一致性检查,然后执行逻辑一致性检查。如果还指定了 NOINDEX,则仅执行逻辑检查。
这些逻辑一致性检查可对索引对象的内部索引表及其引用的用户表进行交叉检查。为了查找外部行,将构造内部查询来对内部表和用户表的完整交集执行查询。运行此查询可能会对性能产生很大影响,并且无法跟踪其进度。因此,建议您仅在以下情况下才指定 WITH EXTENDED_LOGICAL_CHECKS:怀疑存在与物理损坏无关的索引问题,或者已关闭页级校验并且怀疑存在列级硬件损坏。
-
如果索引为筛选索引,DBCC CHECKDB 将执行一致性检查以验证索引项是否满足筛选谓词的要求。
-
-
如果兼容级别为 90 或更低,则除非指定 NOINDEX,否则 DBCC CHECKTABLE 将对单个表或索引视图及其所有非聚集索引和 XML 索引同时执行物理和逻辑一致性检查。不支持空间索引。
了解数据库的兼容级别
内部数据库快照
DBCC CHECKTABLE 使用内部数据库快照提供其执行这些检查必需的事务一致性。有关详细信息,请参阅 了解数据库快照中的稀疏文件大小 和 DBCC (Transact-SQL) 中的“DBCC 内部数据库快照用法”部分。
检查和修复 FILESTREAM 数据
对数据库和表启用 FILESTREAM 后,便可选择将 varbinary(max) 二进制大型对象 (BLOB) 存储在文件系统中。对在文件系统中存储 BLOB 的表使用 DBCC CHECKTABLE 时,DBCC 会检查文件系统与数据库之间的链接级一致性。
例如,如果一个表包含使用 FILESTREAM 属性的 varbinary(max) 列,DBCC CHECKTABLE 将检查文件系统目录和文件与表行、表列和列值之间是否存在一对一映射关系。如果指定了 REPAIR_ALLOW_DATA_LOSS 选项,DBCC CHECKTABLE 便可修复损坏。为了修复 FILESTREAM 损坏,DBCC 将删除缺少文件系统数据的任何表行,并将删除未映射到表行、表列或列值的任何目录和文件。
并行检查对象
默认情况下,DBCC CHECKTABLE 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。若要限制 DBCC 检查可使用的处理器的最大数目,请使用 sp_configure。有关详细信息,请参阅 max degree of parallelism 选项。
通过使用跟踪标志 2528 可以禁用并行检查。有关详细信息,请参阅跟踪标志 (Transact-SQL)。
了解 DBCC 错误消息
DBCC CHECKTABLE 命令完成后,将向 sql Server 错误日志中写入一条消息。如果 DBCC 命令成功执行,则该消息指示成功完成以及命令运行的时间。如果 DBCC 命令在完成检查之前由于错误而停止,则该消息将指示命令已终止,并指示状态值和命令运行的时间。下表列出并说明了该消息中可包含的状态值。
错误报告
只要 DBCC CHECKTABLE 检测到损坏错误,就会在 sql Server LOG 目录中创建一个微型转储文件 (sqlDUMPnnnn.txt)。如果为 sql Server 实例启用了“功能使用情况数据收集”和“错误报告”功能,该文件将被自动转发给 Microsoft。收集的数据将用于改进 sql Server 功能。
转储文件包含 DBCC CHECKTABLE 命令的结果以及其他诊断输出数据。该文件拥有任意访问控制列表 (DACL)。只有 sql Server 服务帐户和 sysadmin 角色的成员有权进行访问。默认情况下,sysadmin 角色包含 Windows BUILTIN\Administrators 组和本地管理员组的所有成员。如果数据收集进程失败,DBCC 命令不会失败。
纠正错误
DBCC CHECKTABLE 返回以下结果集。如果您仅指定了表名或任意选项,则返回相同的结果集。
DBCC results for 'HumanResources.Employee'. There are 288 rows in 13 pages for object 'Employee'. DBCC execution completed. If DBCC printed error messages,contact your system administrator.
如果指定了 ESTIMATEONLY 选项,则 DBCC CHECKTABLE 将返回以下结果集:
Estimated TEMPDB space needed for CHECKTABLES (KB) -------------------------------------------------- 21 (1 row(s) affected) DBCC execution completed. If DBCC printed error messages,contact your system administrator.
A. 检查特定表
以下示例将检查 AdventureWorks2008R2数据库中的 HumanResources.Employee 表的数据页完整性。
USE AdventureWorks2008R2; GO DBCC CHECKTABLE ("HumanResources.Employee"); GO
B. 以较低的开销检查表
以下示例将以较低的开销检查 AdventureWorks2008R2 数据库中的 Employee 表。
USE AdventureWorks2008R2; GO DBCC CHECKTABLE ("HumanResources.Employee") WITH PHYSICAL_ONLY; GO
C. 检查特定索引
以下示例将检查通过访问 sys.indexes 获得的特定索引。
USE AdventureWorks2008R2; GO DECLARE @indid int; SET @indid = (SELECT index_id FROM sys.indexes WHERE object_id = OBJECT_ID('Production.Product') AND name = 'AK_Product_Name'); DBCC CHECKTABLE ("Production.Product",@indid);
Transact-SQL 语法约定
- table_name | view_name
-
要进行完整性检查的表或索引视图。表名或视图名必须符合有关标识符的规则。
- NOINDEX
-
指定不应对用户表的非聚集索引执行会占用很大系统开销的检查。这将减少总执行时间。NOINDEX 不会影响系统表,因为完整性检查的执行对象始终是所有系统表索引。
- index_id
-
要执行完整性检查的索引标识 (ID) 号。如果指定了 index_id,则 DBCC CHECKTABLE 只对该索引以及堆或聚集索引执行完整性检查。
- REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD
- ALL_ERRORMSGS
- EXTENDED_LOGICAL_CHECKS
-
如果兼容级别为 100 (sql Server 2008) 或更高,则对索引视图、XML 索引和空间索引(如果存在)执行逻辑一致性检查。
有关详细信息,请参阅本主题后面“备注”部分中的“对索引执行逻辑一致性检查”。
- NO_INFOMSGS
-
取消显示所有信息性消息。
- TABLOCK
-
可使 DBCC CHECKTABLE 获得一个共享表锁,而不使用内部数据库快照。TABLOCK 可使 DBCC CHECKTABLE 在负荷较重的表上运行得更快,但 DBCC CHECKTABLE 运行时会减少表上可获得的并发性。
- ESTIMATEONLY
- PHYSICAL_ONLY
-
限制为检查页、记录标头以及 B 树的物理结构的完整性。此选项旨在以较低的开销检查表的物理一致性,同时,此项检查还可以检测可能危及用户数据安全的残缺页和常见的硬件故障。DBCC CHECKTABLE 完全运行的时间可能比在早期版本中完全运行的时间长得多。导致此行为发生的原因如下:
-
逻辑检查更加全面。
-
要检查的某些基础结构更为复杂。
-
引入了许多新的检查以包含新增功能。
因此,使用 PHYSICAL_ONLY 选项可能会使 DBCC CHECKTABLE 在大型表上运行的时间短得多,所以对需要频繁检查的生产系统,建议使用 DBCC CHECKTABLE。我们仍然建议定期执行 DBCC CHECKTABLE 的完整运行。这些运行的执行频率取决于各业务和生产环境特定的因素。PHYSICAL_ONLY 始终表示 NO_INFOMSGS,不能与任何一个修复选项一同使用。
注意指定 PHYSICAL_ONLY 会导致 DBCC CHECKTABLE 跳过对 FILESTREAM 数据的所有检查。
-
- DATA_purity
-
使 DBCC CHECKTABLE 检查表中是否存在无效或越界的列值。例如,DBCC CHECKTABLE 检测到日期和时间值大于或小于 datetime 数据类型的可接受范围的列,或者小数位数或精度值无效的 decimal 或近似 numeric 数据类型列。
对于在 sql Server 2005 及更高版本中创建的数据库,默认情况下将启用列值完整性检查,并且不需要使用 DATA_purity 选项。对于从 sql Server 的早期版本升级的数据库,您可以使用 DBCC CHECKTABLE WITH DATA_purity 查找和更正特定表中的错误;但是,默认情况下不会对该表启用列值检查,直到 DBCC CHECKDB WITH DATA_purity 在数据库中正确运行时为止。然后,DBCC CHECKDB 和 DBCC CHECKTABLE 将默认检查列值完整性。
无法使用 DBCC 修复选项来纠正该选项所报告的验证错误。有关手动更正这些错误的信息,请参阅知识库文章 923247:解决 SQL Server 2005 中的 DBCC 错误 2570。
如果指定了 PHYSICAL_ONLY,则不执行列完整性检查。
|
---|
若要对数据库中的每个表执行 DBCC CHECKTABLE,请使用 DBCC CHECKDB。 |
对于指定的表,DBCC CHECKTABLE 将检查以下内容:
-
是否已正确链接索引、行内、LOB 以及行溢出数据页。
-
索引是否按照正确的顺序排列。
-
各指针是否一致。
-
每页上的数据是否合理(包括计算列)。
-
页面偏移量是否合理。
-
基表的每一行是否在每个非聚集索引中具有匹配的行,以及非聚集索引的每一行是否在基表中具有匹配的行。
-
已分区表或索引的每一行是否都位于正确的分区中。
-
使用 FILESTREAM 将 varbinary(max) 数据存储在文件系统中时,文件系统与表之间是否保持链接级一致性。
对索引执行逻辑一致性检查
对索引进行的逻辑一致性检查因数据库兼容级别而异,如下所示:
-
如果兼容级别为 100 (sql Server 2008) 或更高:
-
除非指定 NOINDEX,否则 DBCC CHECKTABLE 将对单个表及其所有非聚集索引同时执行物理和逻辑一致性检查。但是,在默认情况下,仅对 XML 索引、空间索引和索引视图执行物理一致性检查。
-
如果指定了 WITH EXTENDED_LOGICAL_CHECKS,则将对索引视图、XML 索引和空间索引(如果存在)执行逻辑检查。默认情况下,先执行物理一致性检查,然后执行逻辑一致性检查。如果还指定了 NOINDEX,则仅执行逻辑检查。
这些逻辑一致性检查可对索引对象的内部索引表及其引用的用户表进行交叉检查。为了查找外部行,将构造内部查询来对内部表和用户表的完整交集执行查询。运行此查询可能会对性能产生很大影响,并且无法跟踪其进度。因此,建议您仅在以下情况下才指定 WITH EXTENDED_LOGICAL_CHECKS:怀疑存在与物理损坏无关的索引问题,或者已关闭页级校验并且怀疑存在列级硬件损坏。
-
如果索引为筛选索引,DBCC CHECKDB 将执行一致性检查以验证索引项是否满足筛选谓词的要求。
-
-
如果兼容级别为 90 或更低,则除非指定 NOINDEX,否则 DBCC CHECKTABLE 将对单个表或索引视图及其所有非聚集索引和 XML 索引同时执行物理和逻辑一致性检查。不支持空间索引。
了解数据库的兼容级别
内部数据库快照
DBCC CHECKTABLE 使用内部数据库快照提供其执行这些检查必需的事务一致性。有关详细信息,请参阅 了解数据库快照中的稀疏文件大小 和 DBCC (Transact-SQL) 中的“DBCC 内部数据库快照用法”部分。
检查和修复 FILESTREAM 数据
对数据库和表启用 FILESTREAM 后,便可选择将 varbinary(max) 二进制大型对象 (BLOB) 存储在文件系统中。对在文件系统中存储 BLOB 的表使用 DBCC CHECKTABLE 时,DBCC 会检查文件系统与数据库之间的链接级一致性。
例如,如果一个表包含使用 FILESTREAM 属性的 varbinary(max) 列,DBCC CHECKTABLE 将检查文件系统目录和文件与表行、表列和列值之间是否存在一对一映射关系。如果指定了 REPAIR_ALLOW_DATA_LOSS 选项,DBCC CHECKTABLE 便可修复损坏。为了修复 FILESTREAM 损坏,DBCC 将删除缺少文件系统数据的任何表行,并将删除未映射到表行、表列或列值的任何目录和文件。
并行检查对象
默认情况下,DBCC CHECKTABLE 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。若要限制 DBCC 检查可使用的处理器的最大数目,请使用 sp_configure。有关详细信息,请参阅 max degree of parallelism 选项。
通过使用跟踪标志 2528 可以禁用并行检查。有关详细信息,请参阅跟踪标志 (Transact-SQL)。
了解 DBCC 错误消息
DBCC CHECKTABLE 命令完成后,将向 sql Server 错误日志中写入一条消息。如果 DBCC 命令成功执行,则该消息指示成功完成以及命令运行的时间。如果 DBCC 命令在完成检查之前由于错误而停止,则该消息将指示命令已终止,并指示状态值和命令运行的时间。下表列出并说明了该消息中可包含的状态值。
错误报告
只要 DBCC CHECKTABLE 检测到损坏错误,就会在 sql Server LOG 目录中创建一个微型转储文件 (sqlDUMPnnnn.txt)。如果为 sql Server 实例启用了“功能使用情况数据收集”和“错误报告”功能,该文件将被自动转发给 Microsoft。收集的数据将用于改进 sql Server 功能。
转储文件包含 DBCC CHECKTABLE 命令的结果以及其他诊断输出数据。该文件拥有任意访问控制列表 (DACL)。只有 sql Server 服务帐户和 sysadmin 角色的成员有权进行访问。默认情况下,sysadmin 角色包含 Windows BUILTIN\Administrators 组和本地管理员组的所有成员。如果数据收集进程失败,DBCC 命令不会失败。
纠正错误
DBCC CHECKTABLE 返回以下结果集。如果您仅指定了表名或任意选项,则返回相同的结果集。
DBCC results for 'HumanResources.Employee'. There are 288 rows in 13 pages for object 'Employee'. DBCC execution completed. If DBCC printed error messages,contact your system administrator.
如果指定了 ESTIMATEONLY 选项,则 DBCC CHECKTABLE 将返回以下结果集:
Estimated TEMPDB space needed for CHECKTABLES (KB) -------------------------------------------------- 21 (1 row(s) affected) DBCC execution completed. If DBCC printed error messages,contact your system administrator.
A. 检查特定表
以下示例将检查 AdventureWorks2008R2数据库中的 HumanResources.Employee 表的数据页完整性。
USE AdventureWorks2008R2; GO DBCC CHECKTABLE ("HumanResources.Employee"); GO
B. 以较低的开销检查表
以下示例将以较低的开销检查 AdventureWorks2008R2 数据库中的 Employee 表。
USE AdventureWorks2008R2; GO DBCC CHECKTABLE ("HumanResources.Employee") WITH PHYSICAL_ONLY; GO
C. 检查特定索引
以下示例将检查通过访问 sys.indexes 获得的特定索引。
USE AdventureWorks2008R2; GO DECLARE @indid int; SET @indid = (SELECT index_id FROM sys.indexes WHERE object_id = OBJECT_ID('Production.Product') AND name = 'AK_Product_Name'); DBCC CHECKTABLE ("Production.Product",@indid);
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。