4.8 使用 DBCC 修复数据库
4.8.1 DBCC CHECKDB
某些情况下,数据库变成了“可疑”状态,如果直接访问这个数据库则会报错“无法访问数据库db01。”
DBCC CHECKDB用于检查指定数据库中所有对象的逻辑和物理完整性。
4.8.2 修复级别
指定的数据库必须处于单用户模式,才能使用以下修复选项之一。
(1)REPAIR_ALLOW_DATA_LOSS
如果已通过使用 ALTER DATABASE 语句将数据库设置为紧急模式,那么,假如指定了 REPAIR_ALLOW_DATA_LOSS 选项,则 DBCC CHECKDB 可以对数据库尝试修复报告的所有错误。数据库在紧急模式时,将标记为 READ_ONLY 并禁用日志记录,而且只有 sysadmin 固定服务器角色的成员才能访问它。
ALTER DATABASE db01 SET EMERGENCY GO ALTER DATABASE db01 SET SINGLE_USER GO DBCC CHECKDB ('db01',REPAIR_ALLOW_DATA_LOSS) GO |
这些修复可能会导致一些数据丢失,建议在运行带有此选项的 DBCC CHECKDB 之前备份数据库。这些修复可能修复那些在普通情况下无法恢复的数据库,如果 DBCC CHECKDB 命令成功,则数据库将在物理上是一致的,并且数据库状态将设置为 ONLINE。
(2)REPAIR_FAST
保留该语法只是为了向后兼容。 未执行修复操作。
(3)REPAIR_REBUILD
执行不会丢失数据的修复。 这包括快速修复(如修复非聚集索引中缺少的行)以及更耗时的修复(如重新生成索引)。
DBCC CHECKDB ('db01',REPAIR_REBUILD) GO ALTER DATABASE db01 SET MULTI_USER GO |
提示:
这些修复应当是最后手段,并且只有在无法从备份还原数据库时才采用。若要修复错误,建议通过备份进行还原。
修复操作不会考虑表本身或表之间可能存在的任何约束。如果指定的表与一个或多个约束有关,建议在修复操作后运行 DBCC CHECKCONSTRAINTS。
如果必须使用 REPAIR,则运行不带有修复选项的 DBCC CHECKDB 来查找要使用的修复级别。
4.8.3 选项
可以为扫描和修复过程指定更多的选项。
(1)NOINDEX
指定对用户表的非聚集索引不执行检查,这将降低系统开销,从而减少总执行时间。
NOINDEX 不影响系统表,因为总是对系统表索引执行完整性检查。
DBCC CHECKDB 不检查禁用的索引。
(2)ALL_ERRORMSGS
显示针对每个对象报告的所有错误。 默认情况下显示所有错误消息。 指定或省略此选项都不起作用。
输出的错误消息按照对象 ID 排序,但是从 tempdb 数据库生成的那些消息除外。
提示:
在 SQL Server Management Studio 中,返回的最大错误消息数为 1000。 当您指定 ALL_ERRORMSGS 时,我们建议您使用 sqlcmd 实用工具来执行 DBCC 命令,或计划 SQL Server 代理作业来执行该命令并将输出定向到文件。 这两种方法中的任一种都可以确保执行该命令一次即可报告所有错误消息。
(2)NO_INFOMSGS
禁止显示所有信息性消息。
(3)TABLOCK
对于执行这些检查所需要的事务一致性,DBCC CHECKDB 使用内部数据库快照。这样可以防止在执行这些命令时出现阻塞和并发问题。TABLOCK 选项使 DBCC CHECKDB 获取锁,而不使用内部数据库快照。 这包括一个短期数据库排他 (X) 锁。 TABLOCK 可使 DBCC CHECKDB 在负荷较重的数据库上运行得更快,但 DBCC CHECKDB 运行时会减少数据库上可获得的并发性。
(4)ESTIMATEONLY
显示运行包含所有其他指定选项的 DBCC CHECKDB 时所需的 tempdb 空间估计数量。 不执行实际数据库检查。
(5)PHYSICAL_ONLY
将检查限制为页和记录标头的物理结构完整性以及数据库的分配一致性。 设计该检查是为了以较小的开销检查数据库的物理一致性,但它还可以检测会危及用户数据安全的残缺页、校验和错误以及常见的硬件故障。
PHYSICAL_ONLY 始终表示 NO_INFOMSGS,不能与任何一个修复选项一同使用。
(6)EXTENDED_LOGICAL_CHECKS
对于 SQL Server 2008 及后续版本的数据库,对索引视图、XML 索引和空间索引(如果存在)执行逻辑一致性检查。
(7)DATA_PURITY
检查数据库中是否存在无效或越界的列值。 例如,检测日期和时间值是否属于 datetime 数据类型的可接受范围,或者小数位数或精度值是否属于有效的 decimal 或近似 numeric 数据类型。
默认情况下将启用列值完整性检查,并且不需要使用 DATA_PURITY 选项。 对于从 SQL Server 的早期版本升级的数据库,默认情况下不启用列值检查,直到 DBCC CHECKDB WITH DATA_PURITY 已在数据库中正确运行为止。 然后,DBCC CHECKDB 将默认检查列值完整性。
最佳实践
建议您使用 PHYSICAL_ONLY 选项,以便可以频繁检查生产系统。 使用 PHYSICAL_ONLY 可以极大地缩短对大型数据库运行 DBCC CHECKDB 的运行时间。 同时建议您定期运行没有选项的 DBCC CHECKDB。 应当以什么频率执行这些运行任务将取决于各个企业及其生产环境。
本文出自 “SQLServer2014丛书” 博客,谢绝转载!