如果您对SQLSERVERDBCC命令大全感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于SQLSERVERDBCC命令大全的详细内容,我们还将为您解答sqlserverdb
如果您对SQLSERVER DBCC命令大全感兴趣,那么本文将是一篇不错的选择,我们将为您详在本文中,您将会了解到关于SQLSERVER DBCC命令大全的详细内容,我们还将为您解答sql server dbcc的相关问题,并且为您提供关于DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKALLOC检查指定数据库的磁盘空间分配结构的一致性、DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKDB通过执行下列操作检查指定数据库中所有对象的逻辑和物理完整性、DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKTABLE检查组成表或索引视图的所有页和结构的完整性、DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CLEANTABLE回收表或索引视图中已删除的可变长度列的空间的有价值信息。
本文目录一览:- SQLSERVER DBCC命令大全(sql server dbcc)
- DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKALLOC检查指定数据库的磁盘空间分配结构的一致性
- DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKDB通过执行下列操作检查指定数据库中所有对象的逻辑和物理完整性
- DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKTABLE检查组成表或索引视图的所有页和结构的完整性
- DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CLEANTABLE回收表或索引视图中已删除的可变长度列的空间
SQLSERVER DBCC命令大全(sql server dbcc)
DBCC DROPCLEANBUFFERS:从缓冲池中删除所有缓存,清除缓冲区
在进行测试时,使用这个命令可以从sqlSERVER的数据缓存data cache(buffer)清除所有的测试数据,以保证测试的公正性。
需要注意的是这个命令只移走干净的缓存,不移走脏缓存。由于这个原因,在执行这个命令前,应该先执行CheckPoint,将所有脏的缓存写入磁盘,
这样在运行DBCC RROPCLEANBUFFERS 时,可以保证所有的数据缓存被清理,而不是其中的一部分。
DBCC CacheStats:显示存在于当前buffer Cache中的对象的信息,例如:hit rates,编译的对象和执行计划
DBCC ErrorLog :如果很少重启mssqlserver服务,那么服务器的日志(不是数据库事务日志)会增长得很快,而且打开和查看日志的速度也会很慢
使用这个命令,可以截断当前的服务器日志,主要是生成一个新的日志。可以考虑设置一个调度任务,每周执行这个命令自动截断服务器日志。
使用存储过程sp_cycle_errorlog也可以达到同样的目的
一、DBCC 帮助类命令
DBCC HELP('?') :查询所有的DBCC命令
DBCC HELP('命令') :查询指定的DBCC命令的语法说明
DBCC USEROPTIONS :返回当前连接的活动(设置)的SET选项
二、DBCC 检查验证类命令
DBCC CHECKALLOC('数据库名称') :检查指定数据库的磁盘空间分配结构的一致性
DBCC CHECKCATALOG ('数据库名称') :检查指定数据库的系统表内和系统表间的一致性
DBCC CHECKCONSTRAINTS ('tablename') :检查指定表上的指定约束或所有约束的完整性
DBCC CHECKDB :检查数据库中的所有对象的分配和结构完整性
DBCC CHECKFILEGROUP :检查指定文件组中所有表在当前数据库中的分配和结构完整性
DBCC CHECKTABLE :检查指定表或索引视图的数据、索引及test、ntest和image页的完整性
DBCC CHECKIDENT :如果存在大量数据删除,考虑在删除后,使用 dbcc checkident 重置一下自增值
http://social.msdn.microsoft.com/Forums/zh-CN/sqlserverzhchs/thread/8fa3e3a8-2ff2-4a68-be3e-92e76c380ef9/
检查指定的当前标识值
DBCC sqlPERF(UMsstATS):最关键的一个参考数据num runnable:表明当前有多少个线程再等待运行,如果大于等于2,考虑cpu达到瓶颈
Scheduler ID:当前机器有多少个逻辑cpu就有多少个Scheduler ID,具体怎麽看可以看一下我的这篇文章
SQLSERVER独特的任务调度算法"SQLOS"
三、DBCC 维护类命令
DBCC CLEANTABLE ('db_name','table_name') :回收Alter table drop column语句删除可变长度列或text
DBCC DBREINDEX :重建指定数据库的一个或多个索引 跟ALTER INDEX REBUILD差不多
DBCC INDEXDEFRAG:对表或视图上的索引和非聚集索引进行碎片整理
DBCC PINTABLE (db_id,object_id) :将表数据驻留在内存中
查看哪些表驻留在内存的方法是:0:没有驻留 ,1:驻留
1 USE [GPOSDB] 2 GO 3 SELECT OBJECTPROPERTY(OBJECT_ID('dbo.SystemPara'),'tableispinned')
DBCC UNPINTABLE (db_id,object_id) :撤消驻留在内存中的表
DBCC SHRINKDATABASE(db_id,int) :收缩指定数据库的数据文件和日志文件大小
DBCC SHRINKFILE(file_name,int):收缩相关数据库的指定数据文件和日志文件大小
四、DBCC 性能调节命令
DBCC dllname(FREE) :在内存中卸载指定的扩展过程动态链接库(dll)
sp_helpextendedproc 查看加载的扩展PROC
DBCC DROPCLEANBUFFERS :从缓冲池中删除所有缓冲区
DBCC FREEPROCCACHE :从执行计划缓冲区删除所有缓存的执行计划
DBCC INPUTBUFFER :显示从客户机发送到服务器的最后一个语句
DBCC OPENTRAN (db_name) :查询某个数据库执行时间最久的事务,由哪个程序拥有
DBCC SHOW_STATISTICS :显示指定表上的指定目标的当前统计信息分布
DBCC SHOWCONTIG :显示指定表的数据和索引的碎片信息
DBCC sqlPERF (logspace) :查看各个DB的日志情况
(iostats) 查看IO情况
(threads) 查看线程消耗情况
返回多种有用的统计信息
DBCC CACHESTATS :显示sql Server 2000内存的统计信息
DBCC CURSORSTATS :显示sql Server 2000游标的统计信息
DBCC MEMORYSTATS :显示sql Server 2000内存是如何细分的
DBCC sqlMGRSTATS :显示缓冲区中先读和预读准备的sql语句
五、DBCC 未公开的命令
DBCC ERRLOG :初始化sql Server 2000的错误日志文件
DBCC FLUSHPROCINDB (db_id) :清除sql Server 2005服务器内存中的某个数据库的存储过程缓存内容
DBCC BUFFER (db_name,object_name,int(缓冲区个数)) :显示缓冲区的头部信息和页面信息
DBCC DBINFO (db_name) :显示数据库的结构信息
DBCC DBTABLE :显示管理数据的表(数据字典)信息
DBCC IND (db_name,table_name,index_id) :查看某个索引使用的页面信息
DBCC REBUILDLOG :重建sql Server 2000事务日志文件
DBCC LOG (db_name,3) (-1~4) :查看某个数据库的事物日志信息 显示格式可以为:-1,0,1,2,3,4 每个数字代表不同的格式
DBCC PAGE :查看某个数据库数据页面信息
DBCC PROCBUF :显示过程缓冲池中的缓冲区头和存储过程头
DBCC PRTIPAGE :查看某个索引页面的每行指向的页面号
DBCC PSS (user,spid,1) :显示当前连接到sql Server 2000服务器的进程信息
DBCC RESOURCE :显示服务器当前使用的资源情况
DBCC TAB (db_id,object_id) :显示数据页面的结构
六、DBCC跟踪标记
跟踪标记用于临时设置服务器的特定特征或关闭特定行为,常用于诊断性能问题或调试存储过程或复杂的系统
DBCC TRACEON (3604) :打开跟踪标记
DBCC TRACEOFF :关闭跟踪标记
DBCC TRACESTATS :查看跟踪标记状态
七、官方使用DBCC的建议
1、在系统使用率较低时运行 CHECKDB。
2、请确保未同时执行其它磁盘 I/O 操作,例如磁盘备份。
3、将 tempdb 放到单独的磁盘系统或快速磁盘子系统中。
4、允许 tempdb 在驱动器上有足够的扩展空间。 使用带有 ESTIMATE ONLY 的 DBCC 估计 tempdb 将需要多少空间。
5、避免运行占用大量 cpu 的查询或批处理作业。
6、在 DBCC 命令运行时,减少活动事务。
7、使用 NO_INFOMSGS 选项减少一些信息的输出。
8、考虑使用带有 PHYSICAL_ONLY 选项的 DBCC CHECKDB 来检查页和记录的物理结构。
PHYSICAL_ONLY 选项:只检查物理错误,不检查逻辑错误
物理错误比逻辑出更严重,因为物理错误一般sqlSERVER都不能修复的,而逻辑错误大部分sqlSERVER都可以修复
DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKALLOC检查指定数据库的磁盘空间分配结构的一致性
检查指定数据库的磁盘空间分配结构的一致性。
DBCC CHECKALLOC [ (database_name | database_id | 0 [,NOINDEX |,{ REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ] ) [ WITH { [ ALL_ERRORMSGS ] [,NO_INFOMSGS ] [,TABLOCK ] [,ESTIMATEONLY ] } ] ]
- database_name | database_id | 0
-
要检查其分配和页使用情况的数据库的名称或 ID。如果未指定,或者指定为 0,则使用当前数据库。
数据库名称必须符合标识符规则。
- NOINDEX
-
指定不检查用户表的非聚集索引。
注意
维护 NOINDEX 只是为了实现向后兼容性,并不会影响 DBCC CHECKALLOC。
- REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD
-
指定 DBCC CHECKALLOC 修复找到的错误。database_name 必须处于单用户模式。
- REPAIR_ALLOW_DATA_LOSS
-
试图修复找到的任何错误。这些修复可能会导致一些数据丢失。REPAIR_ALLOW_DATA_LOSS 是允许修复分配错误的唯一选项。
- REPAIR_FAST
-
保留语法只是为了向后兼容。未执行修复操作。
- REPAIR_REBUILD
-
不适用。
重要提示仅将 REPAIR 选项作为最后手段使用。若要修复错误,建议您通过备份进行还原。修复操作不会考虑表本身或表之间可能存在的任何约束。如果指定的表与一个或多个约束有关,建议您在修复操作后运行 DBCC CHECKCONSTRAINTS。如果必须使用 REPAIR,则运行不带有修复选项的 DBCC CHECKDB 来查找要使用的修复级别。如果使用 REPAIR_ALLOW_DATA_LOSS 级别,则建议您在运行带有此选项的 DBCC CHECKDB 之前备份数据库。
- WITH
-
启用要指定的选项。
- ALL_ERRORMSGS
-
显示所有错误消息。默认情况下显示所有错误消息。指定或省略此选项都不起作用。
- NO_INFOMSGS
-
取消所有信息性消息和关于所用空间的报告。
- TABLOCK
-
使 DBCC 命令获取排他数据库锁。
- ESTIMATEONLY
-
显示当指定所有其他选项时运行 DBCC CHECKALLOC 所需的估计 tempdb 空间大小。
DBCC CHECKALLOC 将检查数据库中所有页的分配,而不管其所属的页类型或对象类型。它还可验证各种内部结构,这些结构可用于跟踪这些页以及它们之间的关系。
如果未指定 NO_INFOMSGS,则 DBCC CHECKALLOC 将收集有关数据库中所有对象的空间使用情况信息。然后将这一信息与找到的任何错误一起进行打印。
|
---|
DBCC CHECKALLOC 功能包含在 DBCC CHECKDB 和 DBCC CHECKFILEGROUP 中。这意味着您不必将 DBCC CHECKALLOC 与这些语句分开运行。 |
|
---|
DBCC CHECKALLOC 不会检查 FILESTREAM 数据。FILESTREAM 在文件系统中存储二进制大型对象 (BLOB)。 |
内部数据库快照
DBCC CHECKALLOC 可使用内部数据库快照来提供执行这些检查所需的事务的一致性。如果无法创建快照,或指定了 TABLOCK,则 DBCC CHECKALLOC 将尝试获取排他 (X) 数据库锁,以获取所需的一致性。有关锁的详细信息,请参阅锁模式。
|
---|
在 sql Server 2005 及更高版本中,对 tempdb 运行 DBCC CHECKALLOC 不会执行任何检查。这是因为,为了提高性能,不允许对 tempdb 使用数据库快照。这意味着无法获得所需的事务一致性。停止和启动 MSsqlSERVER 服务可以解决任何 tempdb 分配问题。此操作将删除并重新创建 tempdb 数据库。 |
了解 DBCC 错误消息
DBCC CHECKALLOC 命令完成后,会将一条消息写入 sql Server 错误日志。如果 DBCC 命令成功执行,则消息指示成功完成以及命令运行的时间。如果 DBCC 命令在完成检查之前由于错误而停止,则消息将指示命令已终止,并指示状态值和命令运行的时间。下表列出并说明了此消息中可包含的状态值。
状态 |
说明 |
---|---|
0 |
引发了错误号 8930。这指示导致 DBCC 命令终止的元数据损坏。 |
1 |
引发了错误号 8967。存在一个内部 DBCC 错误。 |
2 |
在紧急模式数据库修复过程中出错。 |
3 |
这指示导致 DBCC 命令终止的元数据损坏。 |
4 |
检测到断定或访问违规。 |
5 |
出现终止了 DBCC 命令的未知错误。 |
错误报告
一旦 DBCC CHECKALLOC 检测到损坏错误,就将在 sql Server LOG 目录中创建微型转储文件 (sqlDUMPnnnn.txt)。如果为 sql Server 实例启用了“功能使用情况数据收集”和“错误报告”功能,该文件将被自动转发给 Microsoft。收集的数据将用于改进 sql Server 功能。
转储文件包含 DBCC CHECKALLOC 命令的结果以及其他诊断输出数据。该文件拥有任意访问控制列表 (DACL)。只有 sql Server 服务帐户和 sysadmin 角色的成员有权进行访问。默认情况下,sysadmin 角色包含 Windows BUILTIN\Administrators 组和本地管理员组的所有成员。如果数据收集进程失败,DBCC 命令不会失败。
纠正错误
如果 DBCC CHECKALLOC 报告了任何错误,则建议您通过数据库备份来还原该数据库,而不是运行修复。如果备份不存在,则运行修复也可纠正报告的错误;但是,纠正这些错误时可能需要删除某些页,进而删除数据。
修复可在用户事务内执行。允许回滚所做的更改。如果回滚所做的更改,则数据库仍将包含错误,因此必须通过备份进行还原。修复完成后,备份该数据库。
下表说明了 DBCC CHECKALLOC 返回的信息。
项 |
说明 |
---|---|
FirstIAM |
仅供内部使用。 |
Root |
仅供内部使用。 |
Dpages |
数据页计数。 |
Pages used |
分配的页。 |
Dedicated extents |
分配给对象的区数。 如果使用混合分配页,则可能有未分配区数的页。 |
DBCC CHECKALLOC 还会报告每条索引和每个文件中分区的分配摘要。此摘要说明了数据的分布情况。
项 |
说明 |
---|---|
Reserved pages |
分配给索引的页和已分配区数中未使用的页。 |
Used pages |
分配给索引和索引正在使用的页。 |
Partition ID |
仅供内部使用。 |
Alloc unit ID |
仅供内部使用。 |
In-row data |
页包含索引或堆数据。 |
LOB data |
页包含 varchar(max)、nvarchar(max)、varbinary(max)、text、ntext、xml 和 image 数据。 |
Row-overflow data |
页包含已推送到行外的可变长度列数据。 |
DBCC CHECKALLOC 将返回以下结果集(值可能有所不同),指定了 ESTIMATEONLY 或 NO_INFOMSGS 时除外。
DBCC results for 'master'. *************************************************************** Table sysobjects Object ID 1. Index ID 1 FirstIAM (1:11) Root (1:12) Dpages 22. Index ID 1. 24 pages used in 5 dedicated extents. Index ID 2 FirstIAM (1:1368) Root (1:1362) Dpages 10. Index ID 2. 12 pages used in 2 dedicated extents. Index ID 3 FirstIAM (1:1392) Root (1:1408) Dpages 4. Index ID 3. 6 pages used in 0 dedicated extents. Total number of extents is 7. *************************************************************** '...' *************************************************************** Table spt_server_info Object ID 1938105945. Index ID 1 FirstIAM (1:520) Root (1:508) Dpages 1. Index ID 1. 3 pages used in 0 dedicated extents. Total number of extents is 0. *************************************************************** Processed 52 entries in sysindexes for database ID 1. File 1. Number of extents = 210,used pages = 1126,reserved pages = 1280. File 1 (number of mixed extents = 73,mixed pages = 184). Object ID 1,Index ID 0,data extents 5,pages 24,mixed extent pages 9. '...' Object ID 1938105945,data extents 0,pages 3,mixed extent pages 3. Total number of extents = 210,reserved pages = 1280 in this database. (number of mixed extents = 73,mixed pages = 184) in this database. CHECKALLOC found 0 allocation errors and 0 consistency errors in database 'master'. DBCC results for 'master'. *************************************************************** Table sys.sysrowsetcolumns Object ID 4. Index ID 1,partition ID 262144,alloc unit ID 262144 (type In-row data). FirstIAM (1:98). Root (1:94). Dpages 7. Index ID 1,alloc unit ID 262144 (type In-row data). 9 pages used in 1 dedicated extents. Index ID 1,alloc unit ID 262398 (type Row-overflow data). FirstIAM (0:0). Root (0:0). Dpages 0. Index ID 1,alloc unit ID 262398 (type Row-overflow data). 0 pages used in 0 dedicated extents. Total number of extents is 1. ... *************************************************************** Processed 201 entries in system catalog for database ID 1. File 1. Number of extents = 44,used pages = 300,reserved pages = 345. File 1 (number of mixed extents = 29,mixed pages = 225). Object ID 4,index ID 1,alloc unit ID 262144 (type In-row data),data extents 1,pages 9,mixed extent pages 8. Object ID 5,partition ID 327680,alloc unit ID 327680 (type In-row data),pages 2,mixed extent pages 2. Object ID 7,partition ID 458752,alloc unit ID 458752 (type In-row data),pages 5,mixed extent pages 5. Object ID 8,index ID 0,partition ID 524288,alloc unit ID 524288 (type In-row data),mixed extent pages 2. Object ID 13,partition ID 851968,alloc unit ID 851968 (type In-row data),mixed extent pages 8. Object ID 15,partition ID 983040,alloc unit ID 983040 (type In-row data),mixed extent pages 2. Object ID 26,partition ID 281474978414592,alloc unit ID 1703937 (type In-row data),mixed extent pages 3. Object ID 27,partition ID 281474978480128,alloc unit ID 1769473 (type In-row data),index ID 2,partition ID 562949955190784,alloc unit ID 1769474 (type In-row data),index extents 0,mixed extent pages 3. ... Object ID 1179151246,partition ID 72057594038845440,alloc unit ID 13435136 (type In-row data),data extents 2,pages 18,mixed extent pages 8. Object ID 1179151246,partition ID 72057594038910976,alloc unit ID 13566208 (type In-row data),index extents 1,pages 16,mixed extent pages 8. Object ID 1911677858,partition ID 72057594039631872,alloc unit ID 15073536 (type In-row data),mixed extent pages 2. Total number of extents = 41,used pages = 289,reserved pages = 323 in this database. (number of mixed extents = 27,mixed pages = 211) in this database. CHECKALLOC 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 CHECKALLOC 将返回以下结果集。
Estimated TEMPDB space needed for CHECKALLOC (KB) ------------------------------------------------- 34 (1 row(s) affected) DBCC execution completed. If DBCC printed error messages,contact your system administrator.
要求拥有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员身份。
下面的示例将对当前数据库和 AdventureWorks2008R2 数据库执行 DBCC CHECKALLOC。
-- Check the current database. DBCC CHECKALLOC; GO -- Check the AdventureWorks2008R2 database. DBCC CHECKALLOC (AdventureWorks2008R2); GO
DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKDB通过执行下列操作检查指定数据库中所有对象的逻辑和物理完整性
通过执行下列操作检查指定数据库中所有对象的逻辑和物理完整性:
-
对数据库运行 DBCC CHECKALLOC。
-
对数据库中的每个表和视图运行 DBCC CHECKTABLE。
-
对数据库运行 DBCC CHECKCATALOG。
-
验证数据库中每个索引视图的内容。
-
使用 FILESTREAM 在文件系统中存储 varbinary(max) 数据时,验证表元数据和文件系统目录和文件之间的链接级一致性。
-
验证数据库中的 Service broker 数据。
这意味着不必从 DBCC CHECKDB 单独运行 DBCC CHECKALLOC、DBCC CHECKTABLE 或 DBCC CHECKCATALOG 命令。有关这些命令执行的检查的详细信息,请参阅这些命令的说明。
DBCC CHECKDB [ [ (database_name | database_id | 0 [,NOINDEX |,{ REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD } ] ) ] [ WITH { [ ALL_ERRORMSGS ] [,EXTENDED_LOGICAL_CHECKS ] [,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
-
执行不会丢失数据的修复。这包括快速修复(如修复非聚集索引中缺少的行)以及更耗时的修复(如重新生成索引)。
REPAIR_REBUILD 不修复涉及 FILESTREAM 数据的错误。
重要提示仅将 REPAIR 选项作为最后手段使用。若要修复错误,建议您通过备份进行还原。修复操作不会考虑表本身或表之间可能存在的任何约束。如果指定的表与一个或多个约束有关,建议您在修复操作后运行 DBCC CHECKCONSTRAINTS。如果必须使用 REPAIR,则运行不带有修复选项的 DBCC CHECKDB 来查找要使用的修复级别。如果使用 REPAIR_ALLOW_DATA_LOSS 级别,则建议您在运行带有此选项的 DBCC CHECKDB 之前备份数据库。
- ALL_ERRORMSGS
-
显示针对每个对象报告的所有错误。默认情况下显示所有错误消息。指定或省略此选项都不起作用。按对象 ID 对错误消息排序,从 tempdb 数据库生成的那些消息除外。
在 sql Server Management Studio 中,返回的最大错误消息数为 1000。使用 Management Studio 时,如果指定了 ALL_ERRORMSGS,则可能需要多次执行 DBCC CHECKDB 才能得到完整的错误列表。当您指定 ALL_ERRORMSGS 时,我们建议您使用 sqlcmd 实用工具来执行 DBCC 命令,或计划 sql Server 代理作业来执行该命令并将输出定向到文件。这两种方法中的任一种都可以确保执行该命令一次即可报告所有错误消息。
- EXTENDED_LOGICAL_CHECKS
-
如果兼容级别为 100 (sql Server 2008) 或更高,则对索引视图、XML 索引和空间索引(如果存在)执行逻辑一致性检查。
有关详细信息,请参阅本主题后面“备注”部分中的“对索引执行逻辑一致性检查”。
- NO_INFOMSGS
-
取消显示所有信息性消息。
- TABLOCK
-
使 DBCC CHECKDB 获取锁,而不使用内部数据库快照。这包括一个短期数据库排他 (X) 锁。TABLOCK 可使 DBCC CHECKDB 在负荷较重的数据库上运行得更快,但 DBCC CHECKDB 运行时会减少数据库上可获得的并发性。有关锁的详细信息,请参阅锁模式。
TABLOCK 限制执行的检查;DBCC CHECKCATALOG 未对数据库运行并且 Service broker 数据未进行验证。
- ESTIMATEONLY
-
显示运行包含所有其他指定选项的 DBCC CHECKDB 时所需的 tempdb 空间估计数量。不执行实际数据库检查。
- PHYSICAL_ONLY
-
将检查限制为页和记录标头的物理结构完整性以及数据库的分配一致性。设计该检查是为了以较小的开销检查数据库的物理一致性,但它还可以检测会危及用户数据安全的残缺页、校验和错误以及常见的硬件故障。
DBCC CHECKDB 完成运行所需的时间可能比早期版本要长得多。出现此现象的原因是:
-
逻辑检查更加全面。
-
要检查的某些基础结构更为复杂。
-
引入了许多新的检查以包含新增功能。
因此,使用 PHYSICAL_ONLY 选项可能会大幅减少对较大数据库运行 DBCC CHECKDB 所需的时间,所以对需要频繁检查的生产系统,建议使用此选项。我们仍然建议完整地定期执行 DBCC CHECKDB。这些运行的执行频率取决于各业务和生产环境特定的因素。
PHYSICAL_ONLY 始终表示 NO_INFOMSGS,不能与任何一个修复选项一同使用。
注意指定 PHYSICAL_ONLY 会使 DBCC CHECKDB 跳过对 FILESTREAM 数据的所有检查。
-
- 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。
在 sql Server 的早期版本中,用于每个表、每个索引行计数和页计数的值可能不正确。在特定情况下,其中的一个或多个值甚至会变为负值。在 sql Server 2005 及更高版本中,这些值始终会得到正确的维护。因此,在 sql Server 2005 及更高版本中创建的数据库绝不会包含错误的计数;但是升级到 sql Server 2005 及更高版本的数据库则可能包含错误的计数。这不是数据库中存储的任何数据的损坏。DBCC CHECKDB 已得到增强,可以检测计数值之一变为负值这一情况。检测到负计数值之后,DBCC CHECKDB 的输出会包含一个警告和一个建议,建议运行 DBCC UPDATEUSAGE 解决该问题。
DBCC CHECKDB 不检查禁用的索引。有关禁用索引的详细信息,请参阅禁用索引。
如果用户定义类型标记为按字节排序,则该用户定义类型必须只有一个序列化。在 DBCC CHECKDB 运行期间,如果按字节排序的用户定义类型没有一致的序列化,则会导致错误 2537。有关详细信息,请参阅用户定义类型要求。
由于只能以单用户模式修改 Resource 数据库,因此不能直接对其运行 DBCC CHECKDB 命令。但是,当对 master 数据库执行 DBCC CHECKDB 时,也在内部对 Resource 数据库运行另一个 CHECKDB。这意味着 DBCC CHECKDB 可能会返回额外的结果。如果未设置任何选项,或者设置了 PHYSICAL_ONLY 或 ESTIMATEONLY 选项,则命令返回额外的结果集。
在 SP2 以前的 sql Server 2005 版本中,执行 DBCC CHECKDB 将清除 sql Server 实例的计划缓存。清除计划缓存将导致对所有后续执行计划进行重新编译,并可能会导致查询性能暂时性地突然降低。在 SP2 及更高版本中,执行 DBCC CHECKDB 不会清除计划缓存。
对索引执行逻辑一致性检查
对索引进行的逻辑一致性检查因数据库兼容级别而异,如下所示:
-
如果兼容级别为 100 (sql Server 2008) 或更高:
-
除非指定 NOINDEX,否则 DBCC CHECKDB 对单个表及其所有非聚集索引同时执行物理和逻辑一致性检查。但是,在默认情况下,仅对 XML 索引、空间索引和索引视图执行物理一致性检查。
-
如果指定了 WITH EXTENDED_LOGICAL_CHECKS,则将对索引视图、XML 索引和空间索引(如果存在)执行逻辑检查。默认情况下,先执行物理一致性检查,然后执行逻辑一致性检查。如果还指定了 NOINDEX,则仅执行逻辑检查。
这些逻辑一致性检查可对索引对象的内部索引表及其引用的用户表进行交叉检查。为了查找外部行,将构造内部查询来对内部表和用户表的完整交集执行查询。运行此查询可能会对性能产生很大影响,并且无法跟踪其进度。因此,建议您仅在以下情况下才指定 WITH EXTENDED_LOGICAL_CHECKS:怀疑存在与物理损坏无关的索引问题,或者已关闭页级校验并且怀疑存在列级硬件损坏。
-
如果索引为筛选索引,DBCC CHECKDB 将执行一致性检查以验证索引项是否满足筛选谓词的要求。
-
-
如果兼容级别为 90 或更低,则除非指定 NOINDEX,否则 DBCC CHECKDB 将对单个表或索引视图及其所有非聚集索引和 XML 索引同时执行物理和逻辑一致性检查。不支持空间索引。
了解数据库的兼容级别
-
如何查看或更改数据库的兼容级别 (SQL Server Management Studio)
内部数据库快照
对于执行这些检查所需要的事务一致性,DBCC CHECKDB 使用内部数据库快照。这样可以防止在执行这些命令时出现阻塞和并发问题。有关详细信息,请参阅了解数据库快照中的稀疏文件大小以及 DBCC (Transact-SQL) 中的“DBCC 内部数据库快照用法”部分。如果无法创建快照或指定了 TABLOCK,DBCC CHECKDB 将获取锁以获得所需一致性。在这种情况下,需要排他数据库锁才能执行分配检查,需要共享表锁才能执行表检查。
如果无法创建内部数据库快照,则对 master 运行 DBCC CHECKDB 时将失败。
对 tempdb 运行 DBCC CHECKDB 不会执行任何分配或目录检查,并且必须获取共享表锁才能执行表检查。这是因为,为了提高性能,不允许对 tempdb 使用数据库快照。这意味着无法获得所需的事务一致性。
检查和修复 FILESTREAM 数据
对数据库和表启用 FILESTREAM 后,便可选择将 varbinary(max) 二进制大型对象 (BLOB) 存储在文件系统中。对在文件系统中存储 BLOB 的数据库使用 DBCC CHECKDB 时,DBCC 将检查文件系统和数据库之间的链接级一致性。
例如,如果表包含使用 FILESTREAM 属性的 varbinary(max) 列,则 DBCC CHECKDB 将检查文件系统目录和文件与表行、表列和列值之间是否存在一对一映射。如果指定 REPAIR_ALLOW_DATA_LOSS 选项,DBCC CHECKDB 便可修复损坏。为了修复 FILESTREAM 损坏,DBCC 将删除缺少文件系统数据的所有表行。
最佳做法
建议您使用 PHYSICAL_ONLY 选项,以便可以频繁检查生产系统。使用 PHYSICAL_ONLY 可以极大地缩短对大型数据库运行 DBCC CHECKDB 的运行时间。同时建议您定期运行没有选项的 DBCC CHECKDB。应当以什么频率执行这些运行任务将取决于各个企业及其生产环境。
并行检查对象
默认情况下,DBCC CHECKDB 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置与配置并行查询相同。若要限制 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 命令的未知错误。 |
错误报告
一旦 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 不会自动修复这些错误,所以必须手动更新这些列值。如果 CHECKDB 检测到此类错误,CHECKDB 将返回一个警告、错误号 2570 以及标识受影响的行和手动更正错误的信息。
修复操作可以在用户事务下执行,以使用户回滚已做的更改。如果回滚修复,数据库仍会包含错误,因而必须通过备份进行还原。修复完成后,备份数据库。
在数据库紧急模式下纠正错误
如果已通过使用 ALTER DATABASE 语句将数据库设置为紧急模式,那么,假如指定了 REPAIR_ALLOW_DATA_LOSS 选项,则 DBCC CHECKDB 可以对数据库执行某些特殊修复。这些修复可能允许那些在普通情况下无法恢复的数据库在物理一致状态下重新联机。这些修复应当是最后手段,并且只有在无法从备份还原数据库时才采用。如果将数据库设置为紧急模式,则该数据库将标记为 READ_ONLY 并禁用日志记录,而且只有 sysadmin 固定服务器角色的成员才能访问它。
|
---|
不能在紧急模式下在用户事务内部运行 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 命令:
-
停止系统:停止数据库和复制拓扑中所有其他数据库的活动,然后尝试同步所有节点。有关详细信息,请参阅如何停止复制拓扑(复制 Transact-SQL 编程)。
-
执行 DBCC CHECKDB。
-
如果 DBCC CHECKDB 报表包括分发数据库中任何表或用户数据库中任何复制元数据表的修复,则请删除并重新配置复制。有关详细信息,请参阅删除复制。
-
如果 DBCC CHECKDB 报表包括任何已复制表的修复,则请执行数据验证以确定发布数据库和订阅数据库中的数据之间是否存在差异。有关详细信息,请参阅发布服务器和订阅服务器上的数据不匹配。
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,State 1: Service Contracts analyzed: 5.
Service broker Msg 9667,State 1: Services analyzed: 3.
Service broker Msg 9668,State 1: Service Queues analyzed: 3.
Service broker Msg 9669,State 1: Conversation Endpoints analyzed: 0.
Service broker Msg 9674,State 1: Conversation Groups analyzed: 0.
Service broker Msg 9670,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.
要求拥有 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员身份。
A. 检查当前数据库和其他数据库
下面的示例将对当前数据库和 AdventureWorks2008R2 数据库执行 DBCC CHECKDB。
-- Check the current database. DBCC CHECKDB; GO -- Check the AdventureWorks2008R2 database without nonclustered indexes. DBCC CHECKDB (AdventureWorks2008R2,NOINDEX); GO
B. 检查当前数据库,取消信息性消息
以下示例检查当前数据库,并取消所有信息性消息。
DBCC CHECKDB WITH NO_INFOMSGS; GO
DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKTABLE检查组成表或索引视图的所有页和结构的完整性
检查组成表或索引视图的所有页和结构的完整性。
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
-
指定 DBCC CHECKTABLE 修复发现的错误。若要使用修复选项,数据库必须处于单用户模式。
- REPAIR_ALLOW_DATA_LOSS
-
尝试修复报告的所有错误。这些修复可能会导致一些数据丢失。
- REPAIR_FAST
-
保留语法只是为了向后兼容。未执行修复操作。
- REPAIR_REBUILD
-
执行不会丢失数据的修复。这包括快速修复(如修复非聚集索引中缺少的行)以及更耗时的修复(如重新生成索引)。
REPAIR_REBUILD 不修复涉及 FILESTREAM 数据的错误。
@H_301_110@
注意仅将 REPAIR 选项作为最后手段使用。若要修复错误,建议您通过备份进行还原。修复操作不会考虑表本身或表之间可能存在的任何约束。如果指定的表与一个或多个约束有关,建议您在修复操作后运行 DBCC CHECKCONSTRAINTS。如果必须使用 REPAIR,请运行不带有修复选项的 DBCC CHECKTABLE 来查找要使用的修复级别。如果要使用 REPAIR_ALLOW_DATA_LOSS 级别,建议您在运行带有此选项的 DBCC CHECKTABLE 之前备份数据库。
- ALL_ERRORMSGS
-
显示不受限制的错误数。默认情况下显示所有错误消息。指定或省略此选项都不起作用。
- EXTENDED_LOGICAL_CHECKS
-
如果兼容级别为 100 (sql Server 2008) 或更高,则对索引视图、XML 索引和空间索引(如果存在)执行逻辑一致性检查。
有关详细信息,请参阅本主题后面“备注”部分中的“对索引执行逻辑一致性检查”。
- NO_INFOMSGS
-
取消显示所有信息性消息。
- TABLOCK
-
可使 DBCC CHECKTABLE 获得一个共享表锁,而不使用内部数据库快照。TABLOCK 可使 DBCC CHECKTABLE 在负荷较重的表上运行得更快,但 DBCC CHECKTABLE 运行时会减少表上可获得的并发性。
- ESTIMATEONLY
-
显示运行 DBCC CHECKTABLE 和所有其他指定选项时,所需的 tempdb 空间的估计大小。
- PHYSICAL_ONLY
-
限制为检查页、记录标头以及 B 树的物理结构的完整性。此选项旨在以较低的开销检查表的物理一致性,同时,此项检查还可以检测可能危及用户数据安全的残缺页和常见的硬件故障。DBCC CHECKTABLE 完全运行的时间可能比在早期版本中完全运行的时间长得多。导致此行为发生的原因如下:
-
逻辑检查更加全面。
-
要检查的某些基础结构更为复杂。
-
引入了许多新的检查以包含新增功能。
因此,使用 PHYSICAL_ONLY 选项可能会使 DBCC CHECKTABLE 在大型表上运行的时间短得多,所以对需要频繁检查的生产系统,建议使用 DBCC CHECKTABLE。我们仍然建议定期执行 DBCC CHECKTABLE 的完整运行。这些运行的执行频率取决于各业务和生产环境特定的因素。PHYSICAL_ONLY 始终表示 NO_INFOMSGS,不能与任何一个修复选项一同使用。
@H_301_110@
注意指定 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 索引同时执行物理和逻辑一致性检查。不支持空间索引。
了解数据库的兼容级别
-
如何查看或更改数据库的兼容级别 (SQL Server Management Studio)
内部数据库快照
DBCC CHECKTABLE 使用内部数据库快照提供其执行这些检查必需的事务一致性。有关详细信息,请参阅 了解数据库快照中的稀疏文件大小 和 DBCC (Transact-SQL) 中的“DBCC 内部数据库快照用法”部分。
如果无法创建快照,或指定了 TABLOCK,则 DBCC CHECKTABLE 将获取一个共享表锁来获得所需的一致性。
如果对 tempdb 运行 DBCC CHECKTABLE,则必须获取一个共享表锁。这是因为,为了提高性能,不允许对 tempdb 使用数据库快照。这意味着无法获得所需的事务一致性。 |
检查和修复 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 CHECKTABLE 期间时,以字节顺序排列的用户定义类型列中存储的字节必须与用户定义类型值的计算序列相等。否则,DBCC CHECKTABLE 例程将报告一致性错误。 |
了解 DBCC 错误消息
DBCC CHECKTABLE 命令完成后,将向 sql Server 错误日志中写入一条消息。如果 DBCC 命令成功执行,则该消息指示成功完成以及命令运行的时间。如果 DBCC 命令在完成检查之前由于错误而停止,则该消息将指示命令已终止,并指示状态值和命令运行的时间。下表列出并说明了该消息中可包含的状态值。
状态
@H_301_110@说明
0 |
出现错误号 8930。这指示导致 DBCC 命令终止的元数据损坏。 |
1 |
出现错误号 8967。存在一个内部 DBCC 错误。 |
2 |
在紧急模式数据库修复过程中出错。 |
3 |
这指示导致 DBCC 命令终止的元数据损坏。 |
4 |
检测到断言或访问违规。 |
5 |
出现终止了 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 报告了任何错误,那么,我们建议从数据库备份中还原数据库,而不是使用某个 REPAIR 选项来运行 REPAIR。如果没有备份,则运行 REPAIR 也可以更正报告的错误。要使用的修复选项在报告的错误的末尾处指定。但是,使用 REPAIR_ALLOW_DATA_LOSS 选项更正错误可能需要删除一些页面(从而也删除了数据)。
修复操作可以在用户事务下执行,以允许用户回滚所做的更改。如果回滚修复,数据库仍会包含错误,因而必须通过备份进行还原。全部修复完成后,请备份数据库。
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.
用户必须是表的所有者,或者是 sysadmin 固定服务器角色的成员,或 db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。
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);
DBCC CHECKTABLE ( table_name | view_name [,{ 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
-
指定 DBCC CHECKTABLE 修复发现的错误。若要使用修复选项,数据库必须处于单用户模式。
- REPAIR_ALLOW_DATA_LOSS
-
尝试修复报告的所有错误。这些修复可能会导致一些数据丢失。
- REPAIR_FAST
-
保留语法只是为了向后兼容。未执行修复操作。
- REPAIR_REBUILD
-
执行不会丢失数据的修复。这包括快速修复(如修复非聚集索引中缺少的行)以及更耗时的修复(如重新生成索引)。
REPAIR_REBUILD 不修复涉及 FILESTREAM 数据的错误。
@H_301_110@
注意仅将 REPAIR 选项作为最后手段使用。若要修复错误,建议您通过备份进行还原。修复操作不会考虑表本身或表之间可能存在的任何约束。如果指定的表与一个或多个约束有关,建议您在修复操作后运行 DBCC CHECKCONSTRAINTS。如果必须使用 REPAIR,请运行不带有修复选项的 DBCC CHECKTABLE 来查找要使用的修复级别。如果要使用 REPAIR_ALLOW_DATA_LOSS 级别,建议您在运行带有此选项的 DBCC CHECKTABLE 之前备份数据库。
- ALL_ERRORMSGS
-
显示不受限制的错误数。默认情况下显示所有错误消息。指定或省略此选项都不起作用。
- EXTENDED_LOGICAL_CHECKS
-
如果兼容级别为 100 (sql Server 2008) 或更高,则对索引视图、XML 索引和空间索引(如果存在)执行逻辑一致性检查。
有关详细信息,请参阅本主题后面“备注”部分中的“对索引执行逻辑一致性检查”。
- NO_INFOMSGS
-
取消显示所有信息性消息。
- TABLOCK
-
可使 DBCC CHECKTABLE 获得一个共享表锁,而不使用内部数据库快照。TABLOCK 可使 DBCC CHECKTABLE 在负荷较重的表上运行得更快,但 DBCC CHECKTABLE 运行时会减少表上可获得的并发性。
- ESTIMATEONLY
-
显示运行 DBCC CHECKTABLE 和所有其他指定选项时,所需的 tempdb 空间的估计大小。
- PHYSICAL_ONLY
-
限制为检查页、记录标头以及 B 树的物理结构的完整性。此选项旨在以较低的开销检查表的物理一致性,同时,此项检查还可以检测可能危及用户数据安全的残缺页和常见的硬件故障。DBCC CHECKTABLE 完全运行的时间可能比在早期版本中完全运行的时间长得多。导致此行为发生的原因如下:
-
逻辑检查更加全面。
-
要检查的某些基础结构更为复杂。
-
引入了许多新的检查以包含新增功能。
因此,使用 PHYSICAL_ONLY 选项可能会使 DBCC CHECKTABLE 在大型表上运行的时间短得多,所以对需要频繁检查的生产系统,建议使用 DBCC CHECKTABLE。我们仍然建议定期执行 DBCC CHECKTABLE 的完整运行。这些运行的执行频率取决于各业务和生产环境特定的因素。PHYSICAL_ONLY 始终表示 NO_INFOMSGS,不能与任何一个修复选项一同使用。
@H_301_110@
注意指定 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 索引同时执行物理和逻辑一致性检查。不支持空间索引。
了解数据库的兼容级别
-
如何查看或更改数据库的兼容级别 (SQL Server Management Studio)
内部数据库快照
DBCC CHECKTABLE 使用内部数据库快照提供其执行这些检查必需的事务一致性。有关详细信息,请参阅 了解数据库快照中的稀疏文件大小 和 DBCC (Transact-SQL) 中的“DBCC 内部数据库快照用法”部分。
如果无法创建快照,或指定了 TABLOCK,则 DBCC CHECKTABLE 将获取一个共享表锁来获得所需的一致性。
如果对 tempdb 运行 DBCC CHECKTABLE,则必须获取一个共享表锁。这是因为,为了提高性能,不允许对 tempdb 使用数据库快照。这意味着无法获得所需的事务一致性。 |
检查和修复 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 CHECKTABLE 期间时,以字节顺序排列的用户定义类型列中存储的字节必须与用户定义类型值的计算序列相等。否则,DBCC CHECKTABLE 例程将报告一致性错误。 |
了解 DBCC 错误消息
DBCC CHECKTABLE 命令完成后,将向 sql Server 错误日志中写入一条消息。如果 DBCC 命令成功执行,则该消息指示成功完成以及命令运行的时间。如果 DBCC 命令在完成检查之前由于错误而停止,则该消息将指示命令已终止,并指示状态值和命令运行的时间。下表列出并说明了该消息中可包含的状态值。
状态
@H_301_110@说明
0 |
出现错误号 8930。这指示导致 DBCC 命令终止的元数据损坏。 |
1 |
出现错误号 8967。存在一个内部 DBCC 错误。 |
2 |
在紧急模式数据库修复过程中出错。 |
3 |
这指示导致 DBCC 命令终止的元数据损坏。 |
4 |
检测到断言或访问违规。 |
5 |
出现终止了 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 报告了任何错误,那么,我们建议从数据库备份中还原数据库,而不是使用某个 REPAIR 选项来运行 REPAIR。如果没有备份,则运行 REPAIR 也可以更正报告的错误。要使用的修复选项在报告的错误的末尾处指定。但是,使用 REPAIR_ALLOW_DATA_LOSS 选项更正错误可能需要删除一些页面(从而也删除了数据)。
修复操作可以在用户事务下执行,以允许用户回滚所做的更改。如果回滚修复,数据库仍会包含错误,因而必须通过备份进行还原。全部修复完成后,请备份数据库。
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.
用户必须是表的所有者,或者是 sysadmin 固定服务器角色的成员,或 db_owner 固定数据库角色或 db_ddladmin 固定数据库角色的成员。
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);
DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CLEANTABLE回收表或索引视图中已删除的可变长度列的空间
回收表或索引视图中已删除的可变长度列的空间。
DBCC CLEANTABLE ( { database_name | database_id | 0 } ,{ table_name | table_id | view_name | view_id } [,batch_size ] ) [ WITH NO_INFOMSGS ]
- database_name| database_id | 0
-
要清除的表所在的数据库。如果指定 0,则使用当前数据库。数据库名称必须符合标识符规则。
- table_name| table_id | view_name| view_id
-
要清除的表或索引视图。
- batch_size
-
每个事务处理的行数。如果未指定,或指定为 0,则该语句将在一个事务中处理整个表。
- WITH NO_INFOMSGS
-
取消显示所有信息性消息。
DBCC CLEANTABLE 用于在删除可变长度列之后回收空间。可变长度列可以属于下列数据类型之一:varchar、nvarchar、varchar(max)、nvarchar(max)、varbinary、varbinary(max)、text、ntext、image、sql_variant 和 xml。该命令不回收删除固定长度列后的空间。
如果删除的列存储在行内,则 DBCC CLEANTABLE 将从表的 IN_ROW_DATA 分配单元回收空间。如果列存储在行外,则将根据已删除列的数据类型从 ROW_OVERFLOW_DATA 或 LOB_DATA 分配单元回收空间。如果从 ROW_OVERFLOW_DATA 或 LOB_DATA 页回收空间时产生空页,DBCC CLEANTABLE 将删除该页。有关分配单元和数据类型的详细信息,请参阅表和索引数据结构体系结构。
DBCC CLEANTABLE 作为一个或多个事务运行。如果未指定批大小,则该命令将在一个事务中处理整个表,并在操作过程中以独占方式锁定该表。对于某些大型表,单个事务的长度和所需的日志空间可能太大。如果指定批大小,则该命令将在一系列事务中运行,每个事务包括指定的行数。DBCC CLEANTABLE 不能作为其他事务内的事务运行。
该操作将被完整地记入日志。
系统表或临时表不支持使用 DBCC CLEANTABLE。
最佳做法
不应将 DBCC CLEANTABLE 作为日常维护任务来执行。而应在对表或索引视图中的可变长度列进行重要更改之后并且需要立即回收未使用空间时使用 DBCC CLEANTABLE。或者,也可以重新生成表或视图的索引;但是,此操作会耗费更多资源。
关于SQLSERVER DBCC命令大全和sql server dbcc的介绍已经告一段落,感谢您的耐心阅读,如果想了解更多关于DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKALLOC检查指定数据库的磁盘空间分配结构的一致性、DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKDB通过执行下列操作检查指定数据库中所有对象的逻辑和物理完整性、DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CHECKTABLE检查组成表或索引视图的所有页和结构的完整性、DBCC大全集之(适用版本MS SQLServer 2008 R2)----DBCC CLEANTABLE回收表或索引视图中已删除的可变长度列的空间的相关信息,请在本站寻找。
本文标签: