汪中夏,张京生
(北京信息科技大学数据恢复研究所 北京 邮政编码100101)
摘 要:数据库的安全是信息系统安全的核心,一旦数据库文件受到意外破坏或丢失,损失将难以避免。本文通过SQL Server数据库文件数据页结构的分析,提出了逆向重建丢失和损坏的数据库的非常规方法,恢复数据库中用户所需要的数据。
关键词: 数据恢复;数据库文件;数据页
Technology of SQL Server Database Reverse Reconstruction
Wang Zhongxia,Zhang Jingsheng
Abstract:SQL Server database files through the data page structure analysis, reverse reconstruction of the database is lost and damage of non-conventional methods to recover the database the data needed by users.
Keywords: Data Recovery; DataBase file; Data Page
安全保障体系对每个信息系统而言都是重要的和不可或缺的,但任何一种安全措施都不可能百分之百的保证信息系统免受犯罪行为的攻击和破坏,也更难防范系统管理者的错误操作。数据损坏或丢失的现象时有发生,不可避免。
数据库的安全是信息系统安全的核心,Microsoft SQL Server 数据库的广泛应用决定了它在信息系统中的重要地位, 一旦数据库文件受到意外破坏或丢失,将会造成重大的损失。文件系统的彻底毁坏(如:NTFS 的MFT被错误的完全覆盖, 硬盘被部分低级格式化等), 将导致 SQL Server 数据库 .MDF文件的丢失,用常规的数据恢复方法和现有的数据恢复软件都无法恢复,因此有必要对.MDF文件的非常规的恢复方法进行深入的研究和探讨。
1.数据库文件数据页结构分析
SQL Server的MDF文件是页式存储格式。文件被划分成若干数据页。数据页是包含所有非文本或图像的数据的结构。就像使用SQL Server中的其他类型的页面一样,数据页面具有8KB(或8192字节)的固定大小。它们由三个主要部分组成:页面标题、数据行和行偏移量数组,如图 1所示。
正如在图1中看到的,在每个数据页中,页面标题占用了前96个字节(剩下的8096字节用于数据和行偏移量)。表1显示的是页面标题所包含的主要信息。
表1 页面标题所包含的主要信息
数据页的页号pageID是从0开始, 顺序排列。
2.文件RAW恢复方法
通过对整个磁盘按扇区逐一扫描,找出文件头和文件脚信息的这种恢复技术叫做RAW文件恢复。RAW文件恢复方式可恢复一些特定类型的文件,也经常用于恢复SQL Server 数据库 .MDF文件。
RAW文件恢复程序按以下工作步骤;
在硬盘上按扇区同步搜索一种或多种文件类型的文件头。如果找到任何一个文件头,则保存这些数据到一个文件,同时检查下面4个条件,关闭和保存该文件。
1)找到该文件的文件头;
2) 找到相同文件类型的另一个文件头;
3) 找到另一个文件类型的一个文件头;
4) 当找不到文件脚或其他此类文件头时,计算文件长度(某些类型的文件,其长度保存在文件前部或按预先设定的文件长度的最大值)。
然后将我们找到的这些文件的文件头和文件脚之间的硬盘扇区数据,保存到一个文件中即可。这种恢复方法对文件无 ”碎片” 的情况是有效的, 但对于恢复SQL Server 数据库 .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, 当然这是有损修复。
如果重建的数据库文件缺页太多或缺页在文件的系统表的位置上,数据库文件就不可能被数据库直接使用,因此必须通过直接提取用户表的数据。SQL Server 主要有4张系统表记录了数据文件的头信息、系统表信息和用户表信息,它们是 sysobjects、sysindexes、syscolumns 和systypes, 通过这4张表记录的信息再结合数据页的objID 就能将指定的用户表的数据完整的或部分的提取出来,转换成文本文件格式或其他数据格式。
利用本文介绍的方法,重建成功了一个大小为17.1GB 的SQL Server数据库数据文件。对于Oracle数据库的数据文件也可以采用本文介绍的方法恢复数据,由于每个Oracle数据库的数据文件的数据页的页头信息都含有唯一的文件id 号,所以Oracle 数据库的数据文件的逆向重建过程要比SQL Server数据库数据文件逆向重建过程简单的多。
5.结束语
本文通过对Microsoft SQL Server 数据库文件数据页结构的分析,提出了对数据库低层的逆向重建的方法。在对数据库的实际恢复过程中,当数据库相关文件遭到严重破坏时,要修复数据库相关文件使其回复原样几乎是不可能的。但对用户而言,最重要的是重新取回数据库中存储的数据,因此在对数据库进行非常规恢复时,主要恢复对象是数据库中用户所需要的重要数据。
参考文献
[1]汪中夏、刘伟.数据恢复高级技术.电子工业出版社,2006
[2] (美)KALEN DELANEY. Microsoft SQL Server™ 2000技术内幕.北京大学出版社.2002
[3]万锋,龚正良,杨辛宝.MS SQL Server数据库数据恢复的研究[J].计算机工程,2005,6(31):84-86