数据恢复
技术资料
 
 

SQL Server 数据库逆向重建技术

-PC3000中国总代理   2011-08-07 14:49:22 作者:北京数据恢复 来源:www.jundacheng.com 文字大小:[][][]

  摘要:数据库的安全是信息系统安全的核心,一旦数据库文件受到意外破坏或丢失,损失将难以避免。本文通过SQLServer数据库文件数据页结构的分析,提出了逆向重建丢失和损坏的数据库的非常规方法,恢复数据库中用户所需要的数据。

  关键词:数据恢复;数据库文件;数据页

  安全保障体系对每个信息系统而言都是重要的和不可或缺的,但任何一种安全措施都不可能百分之百的保证信息系统免受犯罪行为的攻击和破坏,也更难防范系统管理者的错误操作。数据损坏或丢失的现象时有发生,不可避免。

  数据库的安全是信息系统安全的核心,Microsoft SQLServer数据库的广泛应用决定了它在信息系统中的重要地位,一旦数据库文件受到意外破坏或丢失,将会造成重大的损失。文件系统的彻底毁坏(如:NTFS的MFT被错误的完全覆盖,硬盘被部分低级格式化等),将导致SQLServer数据库.MDF文件的丢失,用常规的数据恢复方法和现有的数据恢复软件都无法恢复,因此有必要对.MDF文件的非常规的恢复方法进行深入的研究和探讨。

  1.数据库文件数据页结构分析

  SQLServer的MDF文件是页式存储格式。文件被划分成若干数据页。数据页是包含所有非文本或图像的数据的结构。就像使用SQLServer中的其他类型的页面一样,数据页面具有8KB(或8192字节)的固定大小。它们由三个主要部分组成:页面标题、数据行和行偏移量数组,如图1所示。

  正如在图1中看到的,在每个数据页中,页面标题占用了前96个字节(剩下的8096字节用于数据和行偏移量)。表1显示的是页面标题所包含的主要信息。

  字段涵义

  headerVersion页头版本号。从7.0版本开始,这个值就一直是1。

  pageType

  页类型标志,它的值可能是下面列出的页类型之一:

  1-数据页。记录在堆中或簇中数据。

  2-索引页。存放上层的群集索引和各级非群集索引。

  3-文本混合页。

  4-文本树页。

  7-排序页。用于存放在排序操作中存储的页。

  8-GAM页。这些页面记录了已经将哪些扩展盘区分配用于任意类型。对于它所覆盖的间隔内的每个扩展盘区,GAM都有一位;如果该位为0,那么说明相应的扩展盘区正在被使用;如果该位为1,那么说明扩展盘区是自由的。

  9-SGAM页。这些页记录了哪些扩展盘区目前被用作混合扩展盘区,并且至少有一个未用页面。对于它所覆盖的每个扩展盘区,SGAM都有一位。如果该位为1,那么说明该扩展盘区正被用作混合扩展盘区,并且具有自由页面;如果该为为0,那么说明该扩展盘区没有被用作混合扩展盘区,或者被用作混合扩展盘区,但它所有的页面都正在被使用。

  10-IAM页。映射由堆或索引使用的数据库文件中的扩展盘区。对于每个扩展盘区的文件,一个堆或索引至少有一个IAM。

  11-PFS页。记录了一个页面是否已经得到分配,以及每个页面自由空间的数量。13-根页。保存着数据库的信息。每个数据库中只有一个,在主数据库的第9页。15-文件头页。保存着文件的信息。每个文件有一页,在文件的第0页。

  16-差异映射页。

  17-ML映射页。

  pageID该页面在数据库中的文件编号和页码

  nextPage如果该页面处于一个页面链中,那么该字段表示下一个页面的文件编号和页码

  prePage如果该页面处于一个页面链中,那么该字段表示上一个页面的文件编号和页码

  objID该页面所属的对象的ID

  表1页面标题所包含的主要信息

  数据页的页号pageID是从0开始,顺序排列。

  2.文件RAW恢复方法

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

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

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

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

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

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

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

  然后将我们找到的这些文件的文件头和文件脚之间的硬盘扇区数据,保存到一个文件中即可。这种恢复方法对文件无”碎片”的情况是有效的,但对于恢复SQLServer数据库.MDF文件而言,成功率非常低。

  3.基于数据库文件页式存储格式的恢复方法

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

  则F=(n=总页数)

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

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

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

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

  2)Si不唯一;

  对于情况1)有以下两种可能:

  ①原数据库的第i页可能是被删除页或者是“脏页”,如果对数据库做收缩操作就会自动被清除,不会影响还原结果。

  ②由于数据损坏造成“缺页”,“缺页”的多少可能会决定文件重建的成败。

  对于情况2)也有以下两种可能:

  ①硬盘上曾经有其他数据库文件,可以通过数据页的内容判断,将其他数据库文件的Si排除。

  ②硬盘上曾经有要恢复的数据库文件其他版本,只能用人工测试的方法将其他版本数据库文件的Si排除。

  4.数据库文件的低层恢复

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

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

  利用本文介绍的方法,重建成功了一个大小为17.1GB的SQLServer数据库数据文件。对于Oracle数据库的数据文件也可以采用本文介绍的方法恢复数据,由于每个Oracle数据库的数据文件的数据页的页头信息都含有唯一的文件id号,所以Oracle数据库的数据文件的逆向重建过程要比SQLServer数据库数据文件逆向重建过程简单的多。

  5.结束语

  本文通过对MicrosoftSQLServer数据库文件数据页结构的分析,提出了对数据库低层的逆向重建的方法。在对数据库的实际恢复过程中,当数据库相关文件遭到严重破坏时,要修复数据库相关文件使其回复原样几乎是不可能的。但对用户而言,最重要的是重新取回数据库中存储的数据,因此在对数据库进行非常规恢复时,主要恢复对象是数据库中用户所需要的重要数据。

 
如何恢复被摔坏的移动硬盘 9/23
硬盘驱动器数据恢复恢复 9/20
军达成讲解特殊块结构U盘 8/19
数据恢复实战技术总结 8/15
SQL Server 数 8/7


关于我们 联系方式
地址:北京海淀区中关村E世界财富中心A-627
电话:010-82628688   82887388              传真:010-82887388
免费服务电话:400-650-7550       24小时手机:17319153073/13331038895   
邮箱:china2005zbz@live.cn  QQ:2440248146/QQ: 3049573632  
京ICP备09023376号-4   京公网安备11010802008890号

pc3000  数据恢复培训  U盘数据恢复  服务器-RAID数据恢复