MS SQL SERVER数据库恢复方法实例

2017-09-22 10:09李宁
进出口经理人 2017年9期
关键词:还原恢复数据库

李宁

摘 要:MS SQL SERVER的数据库恢复的案件实例和恢复还原的方法和原理。笔者在2011年曾经协助我院自侦部门办理过一件贪污案件,在案件中涉及恢复一个MS SQL SERVER的数据库。在经过常规的数据恢复方法无法正常恢复的情况下,经专家指点使用数据库逆向还原的方法恢复了数据。

关键词:MS SQL SERVER 数据库;恢复;还原

一、恢复数据的过程

笔者拿到证据硬盘后首先对硬盘做了镜像拷贝,保证证据硬盘没有收到污染和破坏。其次,使用常用数据恢复软件对镜像硬盘进行扫描,试图恢复数据库的MDF文件或者备份文件。但是扫描结果是多个备份文件已经被删除,并在硬盘上找不到任何删除的数据库的文件名和存储位置信息。显然常规方法行不通,笔者经过多方查找资料和联系专家,经专家指点找到一种恢复数据库的方法即利用数据库MDF文件的数据硬盘页式存储结构信息,逆向还原MDF 文件。实际做法如下:

1、首先定义数据页特征:MDF文件的数据页大小为8K,应该符合以下几个条件:第0字节为1, 0x40字节至0x60字节全为0。当数据库只有一个mdf文件時,属于该mdf文件的页0x24字节为1, 0x25字节为0, 页号记录在0x20 处,从0开始。

2、建立一个日志文件1.log,对镜像硬盘进行遍历. 然后读取每一个扇区,检查是否符合数据页要求。如符合,输出0x20处,长度为4的页id, 同时输出当前扇区号到1.log文件。到这样就能够得到一个记录了格式符合SQL数据页的位置和页号的日志。

3、对1.log中,上下两行页号的差等于扇区的差除以16(数据页大小为16个扇区)的话, 可以认为这两个数据页连续。这样,当遇到数据页不连续时,可以将上一页作为一个文件碎片的结束,而不连续的那个页作为下一个文件碎片的开始。记录下每一个碎片的开始扇区, 结束扇区,开始数据页号,结束数据页号, 以及包含页数量。将这些信息记录在2.log文件中。

4、第0号页中包含了数据库文件的总页数, 其位置在0xAF到0xB2中。根据这个长度创建一个空文件1.mdf。

5、如果镜像硬盘中只包含一个数据库,2.log中的数据可以直接使用,将记录的对应扇区中的数据页拷贝到1.mdf中。如果包含多个数据库,可以手工调整,例如只保留其中物理位置比较接近,较完整,且能够逆向还原整个数据库。

二、逆向还原数据库的原理

(一)数据库文件数据页结构分析

SQL Server的MDF文件是页式存储格式。文件被划分成若干数据页。数据页是包含所有非文本或图像的数据的结构。就像使用SQL Server中的其他类型的页面一样,数据页面具有8KB(或8192字节)的固定大小。它们由三个主要部分组成:页面标题、数据行和行偏移量数组,在每个数据页中,页面标题占用了前96个字节(剩下的8096字节用于数据和行偏移量)数据页的页号pageID是从0开始, 顺序排列。

(二)文件RAW恢复方法

通过对整个磁盘按扇区逐一扫描,找出文件头和文件脚信息的这种恢复技术叫做RAW文件恢复。RAW文件恢复方式可恢复一些特定类型的文件,也经常用于恢复SQL Server 数据库 .MDF文件。

RAW文件恢复程序按以下工作步骤;

在硬盘上按扇区同步搜索一种或多种文件类型的文件头。如果找到任何一个文件头,则保存这些数据到一个文件,同时检查下面4个条件,关闭和保存该文件。

1、找到该文件的文件头;

2、找到相同文件类型的另一个文件头;

3、找到另一个文件类型的一个文件头;

4、当找不到文件脚或其他此类文件头时,计算文件长度(某些类型的文件,其长度保存在文件前部或按预先设定的文件长度的最大值)。

(三)基于数据库文件页式存储格式的恢复方法

利用数据库文件的页式存储格式重建.mdf文件,首先确定要恢复的数据库文件在硬盘上的第0页的位置,即查找pageType = 0F的页。在第0页可获取文件的总页数,根据总页数创建一个与要重建的文件等长度的空文件(文件的内容全为0)。遍历整个硬盘,根据页号pageID提取数据页,将数据页写入已经创建好的空文件的对应位置。写入所有的页数据或硬盘遍历完毕后,文件的重建即可完成。设新创建的空文件为 F,

则 F =(n=总页数)

Fi 为新建空文件的第i页,用 Si 表示在硬盘上查找到的pageID = i的数据页,

令 Fi = Si ,文件F 将被重建成数据库文件。

但在实际恢复过程中将会遇到以下两种情况:

1、Si = { },即Si 不存在;

2、Si 不唯一;

(四)数据库文件的低层恢复

重建的数据库文件可能不能直接使用,主要原因是由于数据库文件有缺页。如果有缺页Si在文件的用户表的位置上,可以通过修改 Si-1 和 Si+1 的 nextPage 和 prePage修复,即 Si-1 的 nextPage = i+1, Si+1 的prePage = i-1, 当然这是有损修复。

如果重建的数据库文件缺页太多或缺页在文件的系统表的位置上,数据库文件就不可能被数据库直接使用,因此必须通过直接提取用户表的数据。SQL Server 主要有4张系统表记录了数据文件的头信息、系统表信息和用户表信息,它们是 sysobjects、sysindexes、syscolumns 和systypes, 通过这4张表记录的信息再结合数据页的objID 就能将指定的用户表的数据完整的或部分的提取出来,转换成文本文件格式或其他数据格式。endprint

猜你喜欢
还原恢复数据库
收藏在“还原”中添趣
简析梅洛庞蒂的身体现象学