某客户单位,一台运行服务器突然出现故障不能进入系统,里面有运行的用友数据库,出现故障后自己公司DBA以及运维折腾了将近一星期后来能够进入系统了发现数据库已经无法正常使用,且所有之前6月份备份都损坏了,最近的备份也只有4月30号的,询问那边做过什么操作时,客户已经描述不清,无奈只能让客户发库过来看,客户是用友U8数据库运行平台为2008r2.
对数据MDF文件进行损坏发现很多物理页面损坏,先直接重建日志DBCC检测一下看看,在2008R2平台下重建日志之后发现DBCC语句根本无法查询跟运行,直接报错
消息 8921,级别 16,状态 1,第 1 行
检查已终止。收集事实数据时检测到错误。可能是 tempdb 空间用尽或某个系统表不一致。请检查前面的错误消息。
出现这个错误不管是DBCC查询还是修复语句都无法正常执行,一般此错误都是系统表损坏导致,之前已经检测到页面损坏的情况了,先将页面损坏全部修复,客户提供l了一个4月30号数据备份,因此可以参照备份尝试修复,修复之后开始查找损坏的表数据看看是哪些表损坏,把损坏的表记录下来进行单独对表修复,DBCC checktable(XX,repair_allow_data_loss),但是对损坏厉害的表发现修复语句依然报错不能正常修复,报错结果为:修复失败 如需修复此错误 请先修复其他错误。
一般为表所在页面或许系统表有错乱或损坏导致,大家可以借鉴下百度一篇修复系统表帖子:http://wenku.baidu.com/link?url=HJukdgSFmEEb-_FxsjoUUKx7xUviC_kF2tLISI7cgG8sICWmMZH3tNumFV7Jqhuw-1wa1-2CP5-eEno_kErTusQv2LcuRkWiOPeoYQQyj-y
此方法太过繁琐,最后研究发现可以通过直接修改其他参数之后再次进行DBCC语句修复即可顺利执行进行修复。
最后再次进行DBCC库检测发现全部OK没有数据报错!