DBCC CHECKDB (Transact-SQL)

更新日期: 2008 年 11 月 17 日

通过执行下列操作检查指定数据库中所有对象的逻辑和物理完整性:

  • 对数据库运行 DBCC CHECKALLOC
  • 对数据库中的每个表和视图运行 DBCC CHECKTABLE
  • 对数据库运行 DBCC CHECKCATALOG
  • 验证数据库中每个索引视图的内容。
  • 验证数据库中的 Service Broker 数据。

这意味着不必从 DBCC CHECKDB 单独运行 DBCC CHECKALLOC、DBCC CHECKTABLE 或 DBCC CHECKCATALOG 命令。有关这些命令执行的检查的详细信息,请参阅这些命令的说明。

主题链接图标Transact-SQL 语法约定

语法

DBCC CHECKDB 
[
    [ ( database_name | database_id | 0
        [ , NOINDEX 
        | , { REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ]
        ) ]
    [ WITH 
        {
            [ ALL_ERRORMSGS ]
            [ , NO_INFOMSGS ]
            [ , TABLOCK ]
            [ , ESTIMATEONLY ]
            [ , { PHYSICAL_ONLY | DATA_PURITY } ]
        }
    ]
]

参数

  • database_name | database_id | 0
    要为其运行完整性检查的数据库的名称或 ID。如果未指定,或者指定为 0,则使用当前数据库。数据库名称必须符合标识符规则。
  • NOINDEX
    指定不应对用户表的非聚集索引执行会占用很大系统开销的检查。这将减少总执行时间。NOINDEX 不影响系统表,因为总是对系统表索引执行完整性检查。
  • REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD
    指定 DBCC CHECKDB 修复发现的错误。指定的数据库**必须处于单用户模式,才能使用以下修复选项之一。

    • REPAIR_ALLOW_DATA_LOSS
      尝试修复报告的所有错误。这些修复可能会导致一些数据丢失。
    • REPAIR_FAST
      保留该语法只是为了向后兼容。未执行修复操作。
    • REPAIR_REBUILD
      执行次要、快速修复(例如,修复非聚集索引中的额外键)以及耗时修复(例如,重新生成索引)。执行这些修复时不会有丢失数据的危险。
    ms176064.note(zh-cn,SQL.90).gif重要提示:
    仅将 REPAIR 选项作为最后手段使用。若要修复错误,建议您通过备份进行还原。修复操作不会考虑表本身或表之间可能存在的任何约束。如果指定的表与一个或多个约束有关,建议您在修复操作后运行 DBCC CHECKCONSTRAINTS。如果必须使用 REPAIR,则运行不带有修复选项的 DBCC CHECKDB 来查找要使用的修复级别。如果使用 REPAIR_ALLOW_DATA_LOSS 级别,则建议您在运行带有此选项的 DBCC CHECKDB 之前备份数据库。
  • ALL_ERRORMSGS
    显示针对每个对象报告的所有错误。在 SQL Server 2005 Service Pack 3 (SP3) 中,默认情况下显示所有错误消息。指定或省略此选项都不起作用。在 SQL Server 的早期版本中,如果未指定 ALL_ERRORMSGS,则只为每个对象显示前 200 条错误消息。按对象 ID 对错误消息排序,从 tempdb 数据库生成的那些消息除外。

    在 SQL Server Management Studio 中,返回的最大错误消息数为 1000。使用 Management Studio 时,如果指定了 ALL_ERRORMSGS,则可能需要多次执行 DBCC CHECKDB 才能得到完整的错误列表。建议您使用 sqlcmd 实用工具来执行 DBCC 命令,或计划 SQL Server 代理作业来执行该命令并将输出定向到文件。这两种方法中的任一种都可以确保执行该命令一次即可报告所有错误消息。

  • NO_INFOMSGS
    取消显示所有信息性消息。
  • TABLOCK
    使 DBCC CHECKDB 获取锁,而不使用内部数据库快照。这包括一个短期数据库排他 (X) 锁。TABLOCK 可使 DBCC CHECKDB 在负荷较重的数据库上运行得更快,但 DBCC CHECKDB 运行时会减少数据库上可获得的并发性。有关锁的详细信息,请参阅锁模式

    TABLOCK 限制执行的检查;DBCC CHECKCATALOG 未对数据库运行并且 Service Broker 数据未进行验证。

  • ESTIMATE ONLY
    显示运行包含所有其他指定选项的 DBCC CHECKDB 时所需的 tempdb 空间估计数量。不执行实际数据库检查。
  • PHYSICAL_ONLY
    将检查限制为页和记录标头的物理结构完整性、B 树的物理结构以及数据库的分配一致性。设计该检查是为了以较小的开销检查数据库的物理一致性,但它还可以检测会危及用户数据安全的残缺页、校验和错误以及常见的硬件故障。PHYSICAL_ONLY 始终表示 NO_INFOMSGS,不能与任何修复选项一同使用。
  • DATA_PURITY
    使 DBCC CHECKDB 检查数据库中是否存在无效或越界的列值。例如,DBCC CHECKDB 检测到一些列,其日期和时间值大于或小于 datetime 数据类型的可接受范围,或者是小数位数或精度值无效的 decimal 或近似 numeric 数据类型列。

    对于在 SQL Server 2005 中创建的数据库,默认情况下将启用列值完整性检查,并且不需要使用 DATA_PURITY 选项。对于从 SQL Server 的早期版本升级的数据库,默认情况下不启用列值检查,直到 DBCC CHECKDB WITH DATA_PURITY 已在数据库中正确运行为止。然后,DBCC CHECKDB 将默认检查列值完整性。有关从 SQL Server 的早期版本升级数据库会对 CHECKDB 有何影响的详细信息,请参阅本主题的“备注”部分。

    如果指定了 PHYSICAL_ONLY,则不执行列完整性检查。

    无法使用 DBCC 修复选项来纠正该选项所报告的验证错误。有关手动更正这些错误的信息,请参阅知识库文章 923247:解决 SQL Server 2005 中 DBCC 错误 2570

结果集

DBCC CHECKDB 返回以下结果集。这些值可能有所不同,除非指定 ESTIMATEONLY、PHYSICAL_ONLY 或 NO_INFOMSGS 选项:

DBCC results for 'model'.
Service Broker Msg 9675, Level 10, State 1: Message Types analyzed: 13.
Service Broker Msg 9676, Level 10, State 1: Service Contracts analyzed: 5.
Service Broker Msg 9667, Level 10, State 1: Services analyzed: 3.
Service Broker Msg 9668, Level 10, State 1: Service Queues analyzed: 3.
Service Broker Msg 9669, Level 10, State 1: Conversation Endpoints analyzed: 0.
Service Broker Msg 9674, Level 10, State 1: Conversation Groups analyzed: 0.
Service Broker Msg 9670, Level 10, State 1: Remote Service Bindings analyzed: 0.
DBCC results for 'sys.sysrowsetcolumns'.
There are 630 rows in 7 pages for object 'sys.sysrowsetcolumns'.
DBCC results for 'sys.sysrowsets'.
There are 97 rows in 1 pages for object 'sys.sysrowsets'.
DBCC results for 'sysallocunits'.
There are 195 rows in 3 pages for object 'sysallocunits'.
There are 0 rows in 0 pages for object "sys.sysasymkeys".
DBCC results for 'sys.syssqlguides'.
There are 0 rows in 0 pages for object "sys.syssqlguides".
DBCC results for 'sys.queue_messages_1977058079'.
There are 0 rows in 0 pages for object "sys.queue_messages_1977058079".
DBCC results for 'sys.queue_messages_2009058193'.
There are 0 rows in 0 pages for object "sys.queue_messages_2009058193".
DBCC results for 'sys.queue_messages_2041058307'.
There are 0 rows in 0 pages for object "sys.queue_messages_2041058307".
CHECKDB found 0 allocation errors and 0 consistency errors in database 'model'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

指定 NO_INFOMSGS 时,DBCC CHECKDB 返回以下结果集(消息):

The command(s) completed successfully.

指定 PHYSICAL_ONLY 时,DBCC CHECKDB 返回以下结果集:

DBCC results for 'model'.
CHECKDB found 0 allocation errors and 0 consistency errors in database 'master'.
DBCC execution completed. If DBCC printed error messages, contact your system administrator.

指定 ESTIMATEONLY 时,DBCC CHECKDB 返回以下结果集。

Estimated TEMPDB space needed for CHECKALLOC (KB) 
------------------------------------------------- 
13

(1 row(s) affected)

Estimated TEMPDB space needed for CHECKTABLES (KB) 
-------------------------------------------------- 
57

(1 row(s) affected)

DBCC execution completed. If DBCC printed error messages, contact your system administrator.

备注

在 SQL Server 的早期版本中,用于每个表、每个索引行计数和页计数的值可能不正确。在特定情况下,其中的一个或多个值甚至会变为负值。在 SQL Server 2005 中,这些值始终得到正常维护。因此,在 SQL Server 2005 上创建的数据库应当永远不包含不正确计数;但是,升级到 SQL Server 2005 的数据库则可能包含。这不是数据库中存储的任何数据的损坏。DBCC CHECKDB 已得到增强,可以检测计数值之一变为负值这一情况。检测到负计数值之后,DBCC CHECKDB 的输出会包含一个警告和一个建议,建议运行 DBCC UPDATEUSAGE 解决该问题。尽管看起来是由于将数据库升级到 SQL Server 2005 导致了该问题,但实际上升级过程之前错误的计数便已存在。

DBCC CHECKDB 不检查禁用的索引。有关禁用索引的详细信息,请参阅禁用索引

如果用户定义类型标记为按字节排序,则该用户定义类型必须只有一个序列化。在 DBCC CHECKDB 运行期间,如果按字节排序的用户定义类型没有一致的序列化,则会导致错误 2537。有关详细信息,请参阅User-Defined Type Requirements

由于只能以单用户模式修改 Resource 数据库,因此不能直接对其运行 DBCC CHECKDB 命令。但是,当对 master 数据库执行 DBCC CHECKDB 时,也在内部对 Resource 数据库运行另一个 CHECKDB。这意味着 DBCC CHECKDB 可以返回额外结果。如果未设置任何选项,或者设置了 PHYSICAL_ONLY 或 ESTIMATEONLY 选项,则命令返回额外的结果集。

在 SP2 以前的 SQL Server 2005 版本中,执行 DBCC CHECKDB 将清除 SQL Server 实例的计划缓存。清除计划缓存将导致对所有后续执行计划进行重新编译,并可能会导致查询性能暂时性地突然降低。在 SP2 中,执行 DBCC CHECKDB 不会清除计划缓存。

内部数据库快照

对于执行这些检查所需要的事务一致性,DBCC CHECKDB 使用内部数据库快照。这样可以防止在执行这些命令时出现阻塞和并发问题。有关详细信息,请参阅了解数据库快照中的稀疏文件大小以及 DBCC (Transact-SQL) 中的“DBCC 内部数据库快照用法”部分。如果无法创建快照或指定了 TABLOCK,DBCC CHECKDB 将获取锁以获得所需一致性。在这种情况下,需要排他数据库锁才能执行分配检查,需要共享表锁才能执行表检查。

如果无法创建内部数据库快照,则对 master 运行 DBCC CHECKDB 时将失败。

对 tempdb 运行 DBCC CHECKDB 不会执行任何分配或目录检查,并且必须获取共享表锁才能执行表检查。这是因为,为了提高性能,不允许对 tempdb 使用数据库快照。这意味着无法获得所需的事务一致性。

最佳实践

在 SQL Server 2005 中,运行没有选项的 DBCC CHECKDB 的时间可能要比在早期版本中运行的时间长得多。导致此行为发生的原因如下:

  • 引入的逻辑检查更全面。
  • 要检查的某些基础结构更为复杂。
  • 在 SQL Server 2005 中引入了许多新的检查,以包含新增功能。

因此,针对生产系统中频繁使用的情况,建议您使用 PHYSICAL_ONLY 选项。使用 PHYSICAL_ONLY 可以极大地缩短对大型数据库运行 DBCC CHECKDB 的运行时间。同时建议您定期运行没有选项的 DBCC CHECKDB。应当以什么频率执行这些运行任务将取决于各个企业及其生产环境。

并行检查对象

默认情况下,DBCC CHECKTABLE 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置与配置并行查询相同。若要限制 DBCC 检查可使用的处理器的最大数目,请使用 sp_configure。有关详细信息,请参阅max degree of parallelism 选项。通过使用跟踪标志 2528 可以禁用并行检查。有关详细信息,请参阅跟踪标志 (Transact-SQL)

了解 DBCC 错误消息

DBCC CHECKDB 命令结束之后,便会将一个消息写入 SQL Server 错误日志。如果 DBCC 命令成功执行,则消息指示成功以及命令的运行时间。如果 DBCC 命令在完成检查之前由于错误而停止,则消息将指示命令已终止,并指示状态值和命令运行的时间。下表列出并说明了此消息中可包含的状态值。

状态 说明

0

引发了错误号 8930。这表示元数据中存在的损坏终止了 DBCC 命令。

1

出现错误号 8967。存在一个内部 DBCC 错误。

2

在紧急模式数据库修复过程中出错。

3

这表示元数据中存在的损坏终止了 DBCC 命令。

4

检测到断定或访问违规。

5

出现终止了 DBCC 命令的未知错误。

错误报告

在 SQL Server 2005 Service Pack 1 中,一旦 DBCC CHECKDB 检测到损坏错误,就将在 SQL Server LOG 目录中创建转储文件 (SQLDUMPnnnn.txt)。如果为 SQL Server 实例启用了“功能使用情况数据收集”和“错误报告”功能,该文件将被自动转发给 Microsoft。收集的数据将用于改进 SQL Server 功能。有关详细信息,请参阅错误和使用情况报告设置

转储文件包含 DBCC CHECKDB 命令的结果以及其他诊断输出数据。只有 SQL Server 服务帐户和 sysadmin 角色的成员有权进行访问。默认情况下,sysadmin 角色包含 Windows BUILTIN\Administrators 组和本地管理员组的所有成员。如果数据收集进程失败,DBCC 命令不会失败。

纠正错误

如果 DBCC CHECKDB 报告了任何错误,建议从数据库备份还原数据库,而不运行具有一个 REPAIR 选项的 REPAIR。如果不存在备份,则运行修复将更正报告的错误。要使用的修复选项在报告的错误的末尾处指定。但是,通过使用 REPAIR_ALLOW_DATA_LOSS 选项来更正错误可能需要删除某些页,因此会删除某些数据。

在某些情况下,可能会在数据库中输入对列的数据类型而言无效或越界的值。在 SQL Server 2000 中,DBCC CHECKDB 不对这些列值执行范围或完整性检查。但是,在 SQL Server 2005 中,DBCC CHECKDB 可以检测到对所有列数据类型都无效的列值。因此,对从 SQL Server 的早期版本升级的数据库运行带 DATA_PURITY 选项的 DBCC CHECKDB 可能会显示预先存在的列值错误。因为 SQL Server 2005 不会自动修复这些错误,所以必须手动更新这些列值。如果 CHECKDB 检测到此类错误,CHECKDB 将返回一个警告、错误号 2570 以及标识受影响的行和手动更正错误的信息。

修复操作可以在用户事务下执行,以使用户回滚已做的更改。如果回滚修复,数据库仍会包含错误,因而必须通过备份进行还原。修复完成后,备份数据库。

在数据库紧急模式下纠正错误

如果已通过使用 ALTER DATABASE 语句将数据库设置为紧急模式,那么,假如指定了 REPAIR_ALLOW_DATA_LOSS 选项,则 DBCC CHECKDB 可以对数据库执行某些特殊修复。这些修复可能允许那些在普通情况下无法恢复的数据库在物理一致状态下重新联机。这些修复应当是最后手段,并且只有在无法从备份还原数据库时才采用。如果将数据库设置为紧急模式,则该数据库将标记为 READ_ONLY 并禁用日志记录,而且只有 sysadmin 固定服务器角色的成员才能访问它。

ms176064.note(zh-cn,SQL.90).gif注意:
不能在紧急模式下在用户事务内部运行 DBCC CHECKDB 命令并在执行之后回滚事务。

数据库处于紧急模式并且以 REPAIR_ALLOW_DATA_LOSS 子句运行 DBCC CHECKDB 时,将执行以下操作:

  • DBCC CHECKDB 将使用由于 I/O 或校验和错误而标记为不可访问的页,就如同这些错误没有出现过一样。这样操作将增加从数据库恢复数据的机会。
  • DBCC CHECKDB 将尝试使用常规的基于日志的恢复技术恢复数据库。
  • 如果由于事务日志损坏而导致数据库恢复失败,则将重新生成事务日志。重新生成事务日志可能导致事务一致性丢失。

如果 DBCC CHECKDB 命令成功,则数据库将在物理上是一致的,并且数据库状态将设置为 ONLINE。但是,数据库可能包含一种或多种事务不一致的情况。我们建议运行 DBCC CHECKCONSTRAINTS 来发现任何业务逻辑缺陷,并立即备份数据库。

如果 DBCC CHECKDB 命令失败,则无法修复数据库。

在复制的数据库中运行具有 REPAIR_ALLOW_DATA_LOSS 的 DBCC CHECKDB

运行具有 REPAIR_ALLOW_DATA_LOSS 选项的 DBCC CHECKDB 命令可能会影响用户数据库(发布数据库和订阅数据库)以及由复制使用的分发数据库。发布数据库和订阅数据库包括已发布的表和复制元数据表。请注意这些数据库中的下列潜在问题:

  • 已发布的表。可能不会复制由 CHECKDB 进程为修复损坏的用户数据而执行的操作:
    • 合并复制使用触发器跟踪对已发布的表所做的更改。如果 CHECKDB 进程插入、更新或删除了行,则触发器不会激发;因此,更改将不会复制。
    • 事务复制使用事务日志跟踪对已发布的表所做的更改。然后,日志读取器代理将这些更改移动到分发数据库。某些 DBCC 修复即使记入日志,仍然无法由日志读取器代理复制。例如,如果数据页由 CHECKDB 进程释放,则日志读取器代理不会将它翻译为 DELETE 语句;因此,更改将不会复制。
  • 复制元数据表。由 CHECKDB 进程为修复损坏的复制元数据表而执行的操作需要删除并重新配置复制。

如果必须对用户数据库或分发数据库运行具有 REPAIR_ALLOW_DATA_LOSS 选项的 DBCC CHECKDB 命令:

  1. 停止系统:停止数据库和复制拓扑中所有其他数据库的活动,然后尝试同步所有节点。有关详细信息,请参阅How to: Quiesce a Replication Topology (Replication Transact-SQL Programming)
  2. 执行 DBCC CHECKDB。
  3. 如果 DBCC CHECKDB 报表包括分发数据库中任何表或用户数据库中任何复制元数据表的修复,则请删除并重新配置复制。有关详细信息,请参阅删除复制
  4. 如果 DBCC CHECKDB 报表包括任何已复制表的修复,则请执行数据验证以确定发布数据库和订阅数据库中的数据之间是否有所不同。有关详细信息,请参阅发布服务器和订阅服务器上的数据不匹配

权限

要求具有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员身份。

示例

A. 检查当前数据库和 AdventureWorks 数据库

下面的示例将对当前数据库和 AdventureWorks 数据库执行 DBCC CHECKDB

-- Check the current database.
DBCC CHECKDB;
GO
-- Check the AdventureWorks database without nonclustered indexes.
DBCC CHECKDB (AdventureWorks, NOINDEX);
GO

B. 检查当前数据库,取消信息性消息

以下示例检查当前数据库,并取消所有信息性消息。

DBCC CHECKDB WITH NO_INFOMSGS;
GO

请参阅

参考

DBCC (Transact-SQL)
sp_helpdb (Transact-SQL)
系统表 (Transact-SQL)

其他资源

物理数据库体系结构
了解数据库快照中的稀疏文件大小
索引视图上的 DBCC 错误疑难解答
优化 DBCC CHECKDB 性能

帮助和信息

获取 SQL Server 2005 帮助

更改历史记录

版本 历史记录

2008 年 11 月 17 日

新增内容:
  • ALL_ERRORMSGS 的定义中介绍了 SP3 中的新增功能。

2006 年 12 月 12 日

新增内容:
  • 在“备注”中添加了有关 DBCC CHECKDB 何时清除计划缓存的信息。

2006 年 7 月 17 日

新增内容:
  • 添加了有关如何返回 ALL_ERRORMSGS 定义中所有错误消息的信息。

2006 年 4 月 14 日

新增内容:
  • 添加了“错误报告”部分。此部分描述了 SP1 中的新功能。
  • 添加了“在数据库紧急模式下纠正错误”部分。

2005 年 12 月 5 日

新增内容:
  • 添加了按字节排序的用户定义类型的错误消息 2537 的相关信息。
  • 添加了“在复制的数据库中运行具有 REPAIR_ALLOW_DATA_LOSS 的 DBCC CHECKDB”部分。
  • 添加了“了解 DBCC 错误消息”部分。
更改的内容:
  • 更正了语法。
  • 更正了 REPAIR_FAST 定义。此选项不执行修复操作。
  • 通过添加在指定选项时未执行的操作更正了 TABLOCK 定义。