-4006-505-646

SQL server数据库的数据无法读取案例


【故障情况描述】

SQL server数据库文件无法被读取,是由于底层File Record被截断为0,无法找到文件开头,数据表结构也被损坏。镜像文件的前面80M左后的空间,还有中间一部分被覆盖掉,导致系统表被损坏,所以无法读取,考虑用自动备份文件来提取表结构。

 日志中的操作记录:

图片1.png

图片一:

由于系统表被损坏,有大量数据表的结构无法被确定,只能靠工程师根据经验进行恢复工作。

【数据恢复过程-概述】

根据前期的故障分析结果,总结出以下解决方案:

1)备份用户数据,对丢失数据的硬盘。做全盘备份,以确保数据的安全性。

2)分析备份文件中旧数据的数据库。

3)从旧数据库中寻找数据表的结构。

4)从日志中提取一部分数据表的结构。

5)从日志中和残留数据中提取完好的数据。

6)根据日志恢复对应的数据,并检查数据是否正确。

7)核对数据没问题后恢复所有数据。

【数据恢复过程-详解】

1、备份用户数据

由于数据全部都放在客户的原盘中,先交给硬件部门检测硬盘是否存在物理故障。经检测没问题后对每块硬盘做全盘镜像,使用专用工具(Winhex)将硬盘中所有扇区镜像到一块备份硬盘中。

如下图:使用专业工具备份所有硬盘数据

图片2.png

图片二:

2、扫描镜像文件

用winhex打开残留文件,仔细分析硬盘底层数据,发现硬盘底层中还残留着许多以前SQL server的日志和备份文件。经过细心察看和分析,发现日志中有数据库很多包括插入语句的操作记录,这些记录可以考虑提取出来。还有备份文件,打开备份文件可以发现有建表语句,还有一部分旧数据。

但由于整个硬盘太大,人工去搜索SQL server相关数据部分会很慢,因此编写一个提取数据库相关数据的小程序,对整个硬盘中所有存在的数据库残留做扫描,提取所有数据。

3、分析扫描数据

对扫描到的所有日志文件进行分析,发现日志文件中也分数据页,有着固定的开头和结尾,其中每条数据都在固定的位置有自己的object ID号,在接下来的扫描文件中,继续搜寻有同样的object Id的数据记录,发现结构相同,可以确定这是完好的数据,可以提取。

再对扫描到的备份文件进行分析,发现可以从中提取出很多建表语句,可以得到一部分表结构。剩余的表结构,由于截断为0的部分刚好在系统表,没有办法提取表结构,只能从日志中提取的数据来猜测表结构和数据类型。

4、提取数据

根据之前分析的结论,先编写程序从备份文件中提取建表语句,根据建表语句分析出表结构与各种数据类型,同时在残留的系统表中寻找22H、07H、05H表,根据这些建立表与OBJECT_ID的对应关系。然后编写新的程序对日志中的记录进行提取(我是在这一步无法把numeric类型的字节码解析成数据,所以卡住的),根据object ID来对数据和表进行对应,并插入到新表中。

【数据验证及结果】

经验证,数据恢复出来的新表与人工用winhex观察到的数据基本一致,数据恢复成功。


北京北亚数据恢复中心:4006-505-646