在 Microsoft® SQL Server™ 2000 中,可以在用户使用数据库时运行 DBCC CHECKDB,因为 DBCC CHECKDB 在检查每个数据库表时在表上控制的锁的类型均更改。 在 SQL Server 7.0 和早期版本中,DBCC CHECKDB(依次在数据库的每个表上运行 DBCC CHECKTABLE 和 CHECKALLOC)常常在表上控制共享锁 (S),因而阻塞了所有的数据修改语言 (DML) 语句。 在 SQL Server 2000 中,当检查表时 DBCC CHECKDB 在表上控制架构锁以防止元数据的更改,因而允许在正在检查的表上使用除任何数据定义语言 (DDL) 语句之外的 DML 语句。该变化对于决定何时运行 DBCC CHECKDB 提供了更大的灵活性,因为 DBCC CHECKDB 并不完全拒绝用户对系统的使用。 DBCC CHECKDB 是大量占用 CPU 和磁盘的操作。每一个需要检查的数据页都必须首先从磁盘读入内存。另外,DBCC CHECKDB 使用 tempdb 排序。 如果在 DBCC CHECKDB 运行时动态执行事务,那么事务日志会继续增长,因为 DBCC 命令在完成日志的读取之前阻塞日志截断。 建议在服务器负荷较少的时候运行 DBCC CHECKDB。如果在负荷高峰期运行 DBCC CHECKDB,那么事务吞吐量性能和 DBCC CHECKDB 完成时间性能都会受到影响。 要获得好的 DBCC 性能的一些建议
考虑使用带有 PHYSICAL_ONLY 选项的 DBCC CHECKDB 来检查页和记录首部的物理结构。当硬件导致的错误被置疑时,这个操作将执行快速检查。 SQL2000数据修复命令DBCC用法
MS Sql Server 提供了很多数据库修复的命令,当数据库质疑或是有的无法完成读取时可以尝试这些修复命令。
4.DBCC SHRINKFILE (设备文件名或id, 目标大小) DBCC SHRINKFILE (tempdev, 200)
例:将tempdb文件设定大小为50M: |
检查指定数据库中的所有对象的分配和结构完整性。
DBCC CHECKDB
( 'database_name'
[ , NOINDEX
| { REPAIR_ALLOW_DATA_LOSS
| REPAIR_FAST
| REPAIR_REBUILD
} ]
) [ WITH { [ ALL_ERRORMSGS ]
[ , [ NO_INFOMSGS ] ]
[ , [ TABLOCK ] ]
[ , [ ESTIMATEONLY ] ]
[ , [ PHYSICAL_ONLY ] ]
}
]
'database_name'
是要对其中的所有对象分配和结构完整性进行检查的数据库。如果未指定,则默认为当前数据库。数据库名称必须符合标识符的规则。有关更多信息,请参见使用标识符。
NOINDEX
指定不检查非系统表的非聚集索引。NOINDEX 减少执行总时间,因为它不对用户定义的表的非聚集索引进行检查。NOINDEX 对系统表没有影响,因为 DBCC CHECKDB 总是对所有系统表索引进行检查。
REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD
指定 DBCC CHECKDB 修复发现的错误。给定的 database_name 必须在单用户模式下以使用修复选项,它可以是下列值之一。
值 | 描述 |
---|---|
REPAIR_ALLOW_DATA_LOSS | 执行由 REPAIR_REBUILD 完成的所有修复,包括对行和页进行分配和取消分配以改正分配错误、结构行或页的错误,以及删除已损坏的文本对象。这些修复可能会导致一些数据丢失。修复操作可以在用户事务下完成以允许用户回滚所做的更改。如果回滚修复,则数据库仍会含有错误,应该从备份进行恢复。如果由于所提供修复等级的缘故遗漏某个错误的修复,则将遗漏任何取决于该修复的修复。修复完成后,备份数据库。 |
REPAIR_FAST | 进行小的、不耗时的修复操作,如修复非聚集索引中的附加键。这些修复可以很快完成,并且不会有丢失数据的危险。 |
REPAIR_REBUILD | 执行由 REPAIR_FAST 完成的所有修复,包括需要较长时间的修复(如重建索引)。执行这些修复时不会有丢失数据的危险。 |
WITH
指定有关下列内容的选项:返回错误信息的数量、获得的锁或估计的 tempdb 要求。
ALL_ERRORMSGS
显示每个对象不受限制的错误数。如果没有指定 ALL_ERRORMSGS,每个对象至多显示 200 个错误信息。按对象 ID 对错误信息进行排序(从tempdb中生成的消息除外)。
NO_INFOMSGS
禁止显示所有信息性消息(严重级别 10)和关于所用空间的报告。
TABLOCK
导致 DBCC CHECKDB 获得共享表锁。TABLOCK 可使 DBCC CHECKDB 在负荷较重的数据库上运行得更快,但 DBCC CHECKDB 运行时会减少数据库上可获得的并发性。
ESTIMATE ONLY
显示估计的 tempdb 空间大小,要运行带有所有其它指定选项的 DBCC CHECKDB 则需要该空间。不执行该检查。
PHYSICAL_ONLY
仅限于检查页和记录标题物理结构的完整性,以及页对象 ID 和索引 ID 与分配结构之间的一致性。该检查旨在以较低的开销检查数据库的物理一致性,同时还检测会危及用户数据安全的残缺页和常见的硬件故障。PHYSICAL_ONLY 始终意味着 NO_INFOMSGS,并且不能与任何修复选项一起使用。
DBCC CHECKDB 对索引视图执行物理一致性检查。只用于向后兼容的 NOINDEX 选项也适用于索引视图上的任何辅助索引。
DBCC CHECKDB 是最安全的修复语句,因为它对最多的可能出现的各种错误进行标识和修复。如果只报告数据库中有分配错误,请执行带修复选项的 DBCC CHECKALLOC 以对这些错误进行修复。然而,若要确保正确修复所有错误(包括分配错误),请执行带修复选项的 DBCC CHECKDB,而不要执行带修复选项的 DBCC CHECKALLOC。
DBCC CHECKDB 对数据库中所有内容的完整性进行验证。如果当前正在执行或最近已执行 DBCC CHECKDB,则不需要运行 DBCC CHECKALLOC 或 DBCC CHECKTABLE。
DBCC CHECKDB 执行同样的检查,仿佛是对数据库中的每个表执行 DBCC CHECKALLOC 语句和 DBCC CHECKTABLE 语句。
默认情况下,DBCC CHECKDB 不获取表锁。但它获取架构锁,该锁防止对元数据进行更改,但允许更改数据。获取的架构锁将防止用户得到排它表锁,在生成聚集索引、除去任何索引或截断表时需要排它表锁。
DBCC 语句收集信息,然后扫描日志以查找所做的任何其它更改,并在扫描的结尾将两组信息合并在一起以产生数据的一致视图。
如果指定 TABLOCK 选项,DBCC CHECKDB 将获取共享表锁。这样可允许某些类别的错误有更详细的错误信息,并通过避免使用事务日志数据而将所要求的tempdb 空间大小降为最低。TABLOCK 选项不阻止日志截断并使命令可以更快地运行。
DBCC CHECKDB 对数据库中每个表的 text、ntext 和 image 页的链接和大小及数据库中所有页的分配进行检查。
对于数据库中每个表,DBCC CHECKDB 检查其:
错误表示数据库中的潜在问题,应该立即改正。
默认情况下,DBCC CHECKDB 对对象执行并行检查。并行度由查询处理器自动确定。最大并行度的配置方式与并行查询相同。使用 sp_configure 系统存储过程限制可用于 DBCC 检查的最大处理器数。有关更多信息,请参见max degree of parallelism 选项。
使用跟踪标记 2528 可禁用并行检查。有关更多信息,请参见跟踪标记。
不管是否指定任何选项(NO_INFOMSGS 或 NOINDEX 选项除外),如果未指定数据库,DBCC CHECKDB 返回当前数据库的以下结果集(值可能会变化):
DBCC results for 'master'. DBCC results for 'sysobjects'. There are 862 rows in 13 pages for object 'sysobjects'. DBCC results for 'sysindexes'. There are 80 rows in 3 pages for object 'sysindexes'. '...' DBCC results for 'spt_provider_types'. There are 23 rows in 1 pages for object 'spt_provider_types'. CHECKDB found 0 allocation errors and 0 consistency errors in database 'master'. DBCC execution completed. If DBCC printed error messages, contact your system administrator.
如果指定 NO_INFOMSGS 选项,DBCC CHECKDB 将返回以下结果集(消息):
The command(s) completed successfully.
如果指定 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.
DBCC CHECKDB 权限默认授予 sysadmin 固定服务器角色或 db_owner 固定数据库角色的成员且不可转让。
下例对当前数据库和 pubs 数据库执行 DBCC CHECKDB。
-- Check the current database. DBCC CHECKDB GO -- Check the pubs database without nonclustered indexes. DBCC CHECKDB ('pubs', NOINDEX) GO
下例检查当前数据库,并禁止显示所有信息性消息。
DBCC CHECKDB WITH NO_INFOMSGS GO