服务器非正常关机后突然出现数据库无法访问,但SSMS里看到数据库能正常挂载,只是一个表读取到某条数据后就发生错误,折腾了半天无果,只能用DBCC修复。
语法:
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 } ]
}
]
参数说明:
REPAIR_ALLOW_DATA_LOSS | REPAIR_FAST | REPAIR_REBUILD
指定 DBCC CHECKTABLE 修复发现的错误。若要使用修复选项,数据库必须处于单用户模式。
REPAIR_ALLOW_DATA_LOSS
尝试修复报告的所有错误。这些修复可能会导致一些数据丢失。
REPAIR_FAST
保留语法只是为了向后兼容。未执行修复操作。
REPAIR_REBUILD
既执行次要且不耗时的修复操作(如修复非聚集索引中的额外关键字),也执行耗时的修复操作(如重新生成索引)。执行这些修复时不会有丢失数据的危险。
注意:
仅将 REPAIR 选项作为最后手段使用。若要修复错误,建议您通过备份进行还原。修复操作不会考虑表本身或表之间可能存在的任何约束。如果指定的表与一个或多个约束有关,建议您在修复操作后运行 DBCC CHECKCONSTRAINTS。如果必须使用 REPAIR,则运行不带有修复选项的 DBCC CHECKDB 来查找要使用的修复级别。如果要使用 REPAIR_ALLOW_DATA_LOSS 级别,建议您在运行带有此选项的 DBCC CHECKDB 之前备份数据库。
示例:
EXEC sp_dboption '数据库名', 'single user', 'TRUE' -- 更改数据库选项,获取独占访问权限,每次只能有一个用户访问数据库。
GO
USE 数据库名
GO
DBCC CHECKTABLE('表名', REPAIR_ALLOW_DATA_LOSS)
GO
EXEC sp_dboption '数据库名', 'single user', 'TRUE'
GO
参考链接:http://msdn.microsoft.com/zh-cn/library/ms174338(SQL.90).aspx