2008年1月20日,安信数据恢复中心接到上海浦东孙先生的电话,称其公司sql数据库出错,表记录能正常读取,但其中一个字段却读出来的为null,这个字段记录了欠款额 ,到年底了忙于和其他公司结算货款,出了这问题现在款项都无法结算了。
当天下午收到孙先生送来过来的数据库mdf文件, 进行数据库分析。
1. dbcc checkdb('mzbo2008') 检查文件完整性
返回错误信息
数据库 'mzbo2008' 在 sysobjects、sysindexes、syscolumns 或 systypes 中存在一致性错误,妨碍了进一步的 CHECKDB 处理。
DBCC 执行完毕。如果 DBCC 输出了错误信息,请与系统管理员联系。
2. 对上述系统表进行一一检查,当执行dbcc checktable('syscolumns') 有报错,其他几个表均正常。 一般syscolumns这个字段不容易出错。
服务器: 消息 2511,级别 16,状态 2,行 1
表错误: 对象 ID 3,索引 ID 0。在页 (1:33) 上的槽 28 和 29 处发生键次序错误。
'syscolumns' 的 DBCC 结果。
对象 'syscolumns' 有 362 行,这些行位于 6 页中。
CHECKTABLE 发现了 0 个分配错误和 1 个一致性错误(在表 'syscolumns' 中,该表的对象 ID 为 3)。
repair_rebuild 是最低的修复级别(对于由 DBCC CHECKTABLE (mzbo2008.dbo.syscolumns ) 发现的错误而言)。
3. 使用dbcc checktable('syscolumns',REPAIR_ALLOW_DATA_LOSS) 尝试性修复,仍然提示错误信息。
服务器: 消息 2594,级别 16,状态 1,行 1
指定的索引 ID(0)无效。
服务器: 消息 2511,级别 16,状态 1,行 1
表错误: 对象 ID 3,索引 ID 0。在页 (1:33) 上的槽 28 和 29 处发生键次序错误。
'syscolumns' 的 DBCC 结果。
未能修复此错误。
对象 'syscolumns' 有 362 行,这些行位于 6 页中。
CHECKTABLE 发现了 0 个分配错误和 1 个一致性错误(在表 'syscolumns' 中,该表的对象 ID 为 3)。
repair_rebuild 是最低的修复级别(对于由 DBCC CHECKTABLE (mzbo2008.dbo.syscolumns repair_allow_data_loss) 发现的错误而言)。
4.查询 syscolumns 提示错误
[microsoft][ODBC SQL Server Driver][SQL Server]未能在索引也(1:33)中找到RID'16782e50152000300'的索引条目(索引 ID 0,数据库'mzbo2008')。
5.通过分析, 提取syscolumns系统表记录, 重新修正字段值。 重新查询该表,成功可以看到字段内容,数据修复完成。