dbcc checkdb 用法

dbcc checkdb 用法

 

DBCC CHECKDB用于检查指定数据库中的所有对象的分配和结构完整性。

一、语法

  •  
  • 
    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 ] ]
    
                [ , [ EXTENDED_LOGICAL_CHECKS  ] ]
    
            }
    
        ]
    
    		
  • 参数说明

    database_name

    是要对其中的所有对象分配和结构完整性进行检查的数据库。如果未指定,则默认为当前数据库。数据库名称必须符合标识符的规则。

    NOINDEX

    指定不检查非系统表的非聚集索引。NOINDEX 减少执行总时间,因为它不对用户定义的表的非聚集索引进行检查。NOINDEX 对系统表没有影响,因为 DBCC CHECKDB 总是对所有系统表索引进行检查。

    REPAIR_ALLOW_DATA_LOSS

    会尝试修复报告中所有错误,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。

    REPAIR_FAST

    进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。

    REPAIR_REBUILD

    执行由 REPAIR_FAST 完成的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。

    ESTIMATEONLY

    预估修复所需要的tempdb空间

    NO_INFOMSGS

    取消显示所有信息性消息。

    ALL_ERRORMSGS

    显示针对每个对象报告的所有错误。如果未指定 ALL_ERRORMSGS,则只为每个对象显示前 200 条错误消息。按对象 ID 对错误信息进行排序(从 tempdb 中生成的消息除外)。

    PHYSICAL_ONLY

    将检查限制为页和记录标头的物理结构完整性、B 树的物理结构以及数据库的分配一致性。设计该检查是为了以较小的开销检查数据库的物理一致性,但它还可以检测会危及用户数据安全的残缺页、校验和错误以及常见的硬件故障。

    TABLOCK

    使 DBCC CHECKDB 获取锁,而不使用内部数据库快照。这包括一个短期数据库排他 (X) 锁。TABLOCK 可使 DBCC CHECKDB 在负荷较重的数据库上运行得更快,但 DBCC CHECKDB 运行时会减少数据库上可获得的并发性。

    EXTENDED_LOGICAL_CHECKS

    如果兼容级别为 100 (SQL Server 2008) 或更高,则对索引视图、XML 索引和空间索引(如果存在)执行逻辑一致性检查。

    DATA_PURITY

    使 DBCC CHECKDB 检查数据库中是否存在无效或越界的列值。例如,DBCC CHECKDB 检测日期和时间值大于或小于 datetime 数据类型的可接受范围的列。

    二、DBCC CHECKDB执行流程

     

    1、检查关键系统表

    2、对数据库运行DBCC CHECKALLOC

    3、对数据库中每个表或试图运行DBCC CHECKTABLE

    4、对数据库运行DBCC CHECKCATLOG

    5、验证数据库中每个索引试图的内容

    6、验证数据库中Service Broker数据

    三、对于数据库中每个表,DBCC CHECKDB 检查的方面

    1、索引和数据页是否已正确链接。

    2、索引是否按照正确的顺序排列。

    3、各指针是否一致。

    4、每页上的数据是否均合理。

    5、页面偏移量是否合理。

    四、DBCC CHECKDB 修复步骤

     

    1、修改数据库为紧急模式 
    ALTER DATABASE 库名 SET EMERGENCY 
     
    2、使数据库变为单用户模式 
     
    ALTER DATABASE 库名 SET SINGLE_USER
     
    3、修复数据库日志重新生成,此命令检查的分配,结构,逻辑完整性和所有数据库中的对象错误
    
    当您指定“REPAIR_ALLOW_DATA_LOSS”作为DBCC CHECKDB命令参数,该程序将检查和修复报告的错误。但是,这些修复可能会导致一些数据丢失。
    DBCC CheckDB (库名 , REPAIR_ALLOW_DATA_LOSS) 命令执行完成后可能会出现以下警告:
    
    警告: 数据库 '库名' 的日志已重新生成。已失去事务的一致性。RESTORE 链已断开,服务器不再有以前的日志文件的上下文,因此您需要了解它们的内容。应运行 DBCC CHECKDB 验证物理一致性。数据库已置于 dbo-only 模式。在准备使数据库可用时,需要重置数据库选项,并删除所有多余的日志文件。
    此时可以不用理会此警告,关闭Microsoft SQL Server Management Studio。
     
    4、重新打开Microsoft SQL Server Management Studio,使数据库变回为多用户模式
     
    ALTER DATABASE 库名 SET MULTI_USER 
    
    5、重新启动sqlserver
    
    

    五、要获得好的 DBCC 性能的一些建议

    1、在系统使用率较低时运行 CHECKDB。

    2、请确保未同时执行其它磁盘 I/O 操作,例如磁盘备份。

    3、将 tempdb 放到单独的磁盘系统或快速磁盘子系统中。

    4、允许 tempdb 在驱动器上有足够的扩展空间。使用带有 ESTIMATE ONLY 的 DBCC 估计 tempdb 将需要多少空间。

    5、避免运行占用大量 CPU 的查询或批处理作业。

    6、在 DBCC 命令运行时,减少活动事务。

    7、使用 NO_INFOMSGS 选项显著减少处理和 tempdb 的使用。

    8、考虑使用带有 PHYSICAL_ONLY 选项的 DBCC CHECKDB 来检查页和记录首部的物理结构。当硬件导致的错误被置疑时,这个操作将执行快速检查。

    六、DBCC CHECKDB 在使用时的建议

    1、DBCC CHECKDB实际是对当前数据库进行快照,在快照上执行检查,因此防止对当前用户执行出现阻塞和并发问题,CHCEKDB可以在多用户模式下执行

     

    2、DBCC CHECKDB默认使用多线程并行检查,可以使用SP_CONFIGURE 'max degree of parallelism'来设置最大并行度

     

    3、使用WITH PHYSICAL_ONLY以较小开销检查数据库物理一致性

     

    4、使用WITH NO_INDEX来避免检查索引

     

    5、可以使用

     

    SELECT 

    R.session_id,

    R.request_id,

    R.percent_complete,

    R.start_time,

    R.estimated_completion_time,

    R.status,

    R.command

    FROM sys.dm_exec_requests R

    WHERE command LIKE '%DBCC CHECK%'

     

    来估算出执行DBCC还需要多长时间完成,该值可能不太准

     

    6、将CHECKDB拆分成多个步骤完成,CHECKFILEGROUP CHECKALLOC CHECKTABLE 

     

    7、在备份机上测试

     

    标签: