掌桥专利:专业的专利平台
掌桥专利
首页

基于IAM页的数据库恢复的方法、系统及存储介质

文献发布时间:2023-06-19 12:18:04


基于IAM页的数据库恢复的方法、系统及存储介质

技术领域

本发明属于数据恢复领域,涉及一种基于IAM页的数据库恢复的方法、系统及存储介质。

背景技术

SQL Sever是Microsoft 公司推出的关系型数据库管理系统,全称为MicrosoftSQL Sever,简称MSSQL。SQL Sever是一种闭源数据库产品,SQL Sever为广大的用户提供程序,不提供源代码,使得SQL Sever具有安全性高、可用性强和运行性能佳的特点。

SQL Sever的数据文件分为MDF文件(Primary Data File)、NDF文件(SecondaryData Files)以及LDF文件(Log Data Files),其中MDF文件和LDF文件为每个数据库都有,NDF文件只有在数据库发生拆分时才会出现。MDF和NDF文件主要用于储存数据,两者具有相似的结构,而LDF文件为数据库日志,储存了数据库的所有事务操作,主要用于记录以及回滚事务。

SQL Sever的数据文件是由若干页组成的,页的类型包括索引页、IAM页、系统表页和用户表页。其中,IAM页(Index Allocation Map)是一种特殊的页,又称为索引分配映射页。由于IAM页中包含着表的数据页面的索引,故IAM页可以用来跟踪表。

目前,由于SQL Sever的闭源特性,使用IAM页在SQL Sever中恢复数据的技术几乎没有。另外,若SQL Sever处于非正常状态,例如整个数据库无法正常启动,所有的页都只剩元数据,IAM页根据无法被正常解析和识别,导致使用IAM页恢复数据更加困难。

因此,如何帮助用户通过IAM页快速恢复数据,成为当前急需解决的技术问题。

发明内容

为了解决上述背景技术中的技术问题,本发明提供一种基于IAM页的数据库恢复的方法、系统及存储介质。所述技术方案如下:

第一个方面,提供了一种基于IAM页的数据库恢复的方法,所述方法包括步骤:

S1.从数据文件中获取IAM页;

S2.确定所述IAM页内的映射区域索引;

S3.根据所述映射区域索引储存的偏移确定所述IAM页内全部的数据槽;

S4.判断所述全部的数据槽是否填满,若数据槽未填满,则执行步骤S5;若数据槽填满,则执行步骤S6至步骤S9;

S5.解析步骤S4的所述全部的数据槽,获得第二对象信息,所述第二对象信息包括页码和文件号;

S6.确定所述IAM页内的统一区位图,并确定所述统一区位图内的保留字节;

S7.遍历所述IAM页,并标记出所有不为零的比特;

S8.根据步骤S2的所述映射区域索引储存的偏移和步骤S7的所述不为零的比特确定全部的统一区;

S9.解析步骤S4的所述全部的数据槽和步骤S8的所述全部的统一区,获得第三对象信息,所述第三对象信息包括页码和文件号;

S10.根据步骤S5的所述第二对象信息或步骤S9的所述第三对象信息查询到用户表页,并从所述用户表页中获得第四对象信息;

S11.将第四对象信息进行解码处理,恢复出用户表数据。

可以理解的是,所述第四对象信息是指未解码的用户表数据。

在其中一个实施例中,步骤S1,包括:

S1001.获取存储系统中的数据文件;

S1002.根据系统表页标识符和系统表页组织结构解析数据文件中的系统表页,从系统表页中获取用户所需要恢复的表的第一对象信息,其中,第一对象信息包括表名称、表字段、表的主键和IAM页的索引;

S1003.根据所述第一对象信息获取IAM页。

在其中一个实施例中,步骤S11之后,还包括:

S12.对所述IAM页和所述用户表页进行校验,并将未通过校验的页进行标记。

在其中一个实施例中,步骤S11之后,还包括:

S13.记录用户表数据中每条数据的首地址偏移;

S14.将所述用户表数据中每条数据的首地址偏移与行目录中的地址进行对比,并将未找到的匹配项标记为已删除数据。

第二个方面,提供了一种基于IAM页的数据库恢复的系统,所述系统包括:

IAM页获取模块,用于从数据文件中获取IAM页;

映射区域索引确定模块,用于确定所述IAM页内的映射区域索引;

数据槽确定模块,用于根据所述映射区域索引储存的偏移确定所述IAM页内全部的数据槽;

数据槽判断模块,用于判断所述全部的数据槽是否填满;

第一解析模块,用于解析所述数据槽,获得第二对象信息,所述第二对象信息包括页码和文件号;

保留字节确定模块,用于确定所述IAM页内的统一区位图,并确定所述统一区位图内的保留字节;

遍历记录模块,用于遍历所述IAM页,并标记出所有不为零的比特;

统一区确定模块,用于根据所述映射区域索引储存的偏移和所述不为零的比特确定全部的统一区;

第二解析模块,用于解析所述全部的数据槽和所述全部的统一区,获得第三对象信息,所述第三对象信息包括页码和文件号;

用户表查询模块,用于根据所述第二对象信息或所述第三对象信息查询到用户表页,并从所述用户表页中获得第四对象信息;

解码模块,用于将第四对象信息进行解码处理,恢复出用户表数据。

在其中一个实施例中,所述IAM页获取模块,包括:

文件获取单元,用于获取存储系统中的数据文件;

系统表解析单元,用于根据系统表页标识符和系统表页组织结构解析数据文件中的系统表页,从系统表页中获取用户所需要恢复的表的第一对象信息,其中,第一对象信息包括表名称、表字段和表的主键;

IAM页获取单元,用于根据所述第一对象信息获取IAM页。

在其中一个实施例中,所述系统,还包括:

校验标记模块,用于对所述IAM页和所述用户表页进行校验,并将未通过校验的页进行标记。

在其中一个实施例中,所述系统,还包括:

偏移记录模块,用于记录用户表数据中每条数据的首地址偏移;

对比标记模块,用于将所述用户表数据中每条数据的首地址偏移与行目录中的地址进行对比,并将未找到的匹配项标记为已删除数据。

第三个方面,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述的基于IAM页的数据库恢复的方法。

本发明的有益效果:

(1)本发明可以解析处于二进制状态下的IAM页,从而使IAM页能够正常跟踪表,避免遍历整个文件,大大提高了数据的恢复速度;

(2)本发明对MSSQL数据库进行恢复的过程,不依赖于MSSQL状态,不需要挂载启动虚拟磁盘内系统,也不用借助日志文件,大大简化了操作流程,使用更加灵活。

附图说明

为了更清楚地说明本发明实施例中的技术方案,下面将对实施例描述中所需要使用的附图作简单地介绍,显而易见地,下面描述中的附图仅仅是本发明 的一些实施例,对于本领域普通技术人员来讲,在不付出创造性劳动的前提下, 还可以根据这些附图获得其他的附图。

图1为本发明实施例一中数据库恢复方法的流程图。

图2为本发明实施例一中系统表页的结构示意图。

图3为本发明实施例一中IAM页混合区的物理结构图。

图4为本发明实施例一中IAM页统一区的物理结构图图。

图5为本发明实施例一中IAM页链表结构示意图。

图6为本发明实施例二中数据库恢复方法的流程图。

图7为本发明实施例三中数据库恢复方法的流程图。

图8为本发明实施例四中数据库恢复的系统的结构示意图。

图9为本发明实施例四中IAM页获取模块的结构示意图。

具体实施方式

为了使本发明的目的、技术方案及优点更加清楚明白,以下结合附图及实施例,对本发明进行进一步详细说明。应当理解,此处描述的具体实施例仅仅用以解释本发明,并不用于限定本发明。

本发明提供的方法,应用范围包括但不限于下述环境:含有SQL Server的虚拟磁盘映像中,解析过程由JAVA编写,虚拟磁盘为VMware Workstation的VMDK格式。

实施例一

如图1所示,在一个实施例中,提供一种基于IAM页的数据库恢复的方法,所述方法包括步骤:

S101.从数据文件中获取IAM页。

可选的,所述步骤S101,包括:

S1001.获取存储系统中的数据文件。

数据文件是指MDF文件和NDF文件,即后缀为MDF的文件和后缀为NDF的文件。MDF文件的组织结构和NDF文件的组织结构均是以页作为基本单元,每页由若干字节组成。MDF文件和NDF文件主要用于储存数据,因此通过对页结构和字节信息进行解析,为恢复被删除的用户数据提供了可能性。

为了便于理解,具体的,提供一个操作实例:读取虚拟磁盘,并加载注册表文件;获取到MSSQL14.MSSQLSERVER节点下名为DefaultData节点的值,其具体值为C:\ProgramFiles\Microsoft SQL Server\MSSQL14.MSSQL SERVER\MSSQL\ DATA;由于数据库未选择拆分,通过上述路径,获取到名为sample.mdf数据库数据文件,并将其加载到由java实现的恢复程序中。

S1002.根据系统表页标识符和系统表页组织结构解析数据文件中的系统表页,从系统表页中获取用户所需要恢复的表的第一对象信息,其中,第一对象信息包括表名称、表字段、表的主键和IAM页的索引。

页是组成数据文件的基本单元,页的类型包括索引页、IAM页、系统表页和用户表页。其中,系统表页内含有众多类型的系统表,系统表的前缀一般为sys,每个系统表中储存有不同的元数据,例如Sysobjects,它存放该数据库内创建的所有对象信息,如约束、默认值、日志、规则、存储过程、用户表,每个对象在表中占一行。

不同类型的页具有不同的组织结构,如图2所示,一个完整的系统表页至少包含:页头区、数据区、行目录区(插槽区)和空闲区,其中,页头区大小为固定96字节,其余三个区大小不固定。页头区主要储存该页面的标识符、页面类型、Objid、插槽数、固定段长度、本页ID和下一页 ID 等重要信息,通过页头区可确认页面的位置、页面储存内容以及页面完整性等信息。其中,标识符为一个48比特的数字,在整个数据库数据文件中是唯一的,其高位的32比特为页面号,低16位为文件号,通过这两个编号,可唯一确定一个页。同时,同一个系统表的所有数据页间呈双链表储存,当找到其中一个页,便可根据指针找到剩下所有页。

因此,通过标识符和组织结构,可以快速检索出全部系统表页所在的页面id,为从系统表页中获取所需要恢复的对象信息奠定基础。

为了便于理解,具体的,提供一个操作实例:对页按8192字节进行切割,并检索数据文件内系统表页;读取用于储存表信息的系统表页,筛选出所有type 为U的用户表信息,选定所需要恢复的表id为251147940;读取用于储存表字段的系统表页,筛选出表id为251147940所有字段,结果如下表1所示:

表1 表字段信息筛选结果

S1003.根据所述第一对象信息获取IAM页。

S102.确定所述IAM页内的映射区域索引。

IAM页内的映射区域索引是指当前IAM页所映射数据文件区域的第一位。在IAM页中,映射区域索引固定在第136个字节处,映射区域索引之后每六个字节为一个数据槽,因此,通过确定映射区域索引能够帮助用户定位数据槽的位置。

S103.根据所述映射区域索引储存的偏移确定所述IAM页内全部的数据槽。

在数据文件中,IAM页的页头type为10,IAM页被分为了混合区和统一区,混合区具有八个槽位(即数据槽),小端模式,每个槽位对应一个混合区页面,每个所述槽位占六个字节,前两个字节为文件号,后四个字节为页码和目录号。

为了便于理解,下面我们提供IAM页混合区的说明,具体如下:

如图3所示,在 hugerow表 IAM页混合区的物理结构中,其中第一个划线部分表示此IAM页所对应的页面区域的开始部分,可以看出页面 ID为0,文件号为1,所以这个IAM页对应从第0页开始的511232个页面,第二个划线部分为混合区的第一个槽位,其文件号为1,页面ID为175(小端模式),表明表被分配进了175开始的连续 8个页面组成的统一区中。

S104.判断所述全部的数据槽是否填满,若数据槽未填满,则执行步骤S105;若数据槽填满,则执行步骤S106至步骤S109。

S105.解析步骤S104的所述全部的数据槽,获得第二对象信息,所述第二对象信息包括页码和文件号。

S106.确定所述IAM页内的统一区位图,并确定所述统一区位图内的保留字节。

统一区位图提供了当前IAM页所映射区域索引中页面的使用情况,若为1,则表明该统一区分配给了目标表。在IAM页中,统一区位图固定在第192个字节处,而保留字节是统一区位图开头前两位,因此,通过确定保留字节为用户定位统一区提供了可能性。

S107.遍历所述IAM页,并标记出所有不为零的比特。

保留字节之后的每一比特代表目标表是否被分配到了对应的统一区,因此通过标记出所有不为零的比特,能够反映出统一区的分配状况。

为了便于理解,下面我们提供IAM页统一区的说明,具体如下:

如图4所示,在 hugerow表 IAM页统一区的物理结构中,前两个字节为状态字节,之后的字节则代表的是统一区分配情况为0则是该区没有分配给目标表,图4中统一区第8个字节的第6位为1,则可以得知统一区第 62个区被分配给了hugerow页面,由于一个区由8个连续页面组成,所以可以计算得出从488页开始的连续8个页面,都属于表hugerows,一个IAM页的混合区有7988个字节,也就是63904个区,511232个页面,当页面大于这个值时,就会出现在第二个IAM页上,一个IAM页管理着大约 4G的数据。

S108.根据步骤S102的所述映射区域索引储存的偏移和步骤S207的所述不为零的比特确定全部的统一区。

S109.解析步骤S104的所述全部的数据槽和步骤S108的所述全部的统一区,获得第三对象信息,所述第三对象信息包括页码和文件号。

S110.根据步骤S105的所述第二对象信息或步骤S209的所述第三对象信息查询到用户表页,并从所述用户表页中获得第四对象信息。

如图5所示,IAM页在数据文件中是链式储存的,每个IAM页都有指向下一个IAM页以及前一个IAM页的指针。通过文件号和页码可以唯一确定一个数据页面。因此,结合IAM页的链式结构和第二对象信息或第三对象信息能够快速找到所有的用户表页,为恢复用户表数据奠定基础。

S111.将第四对象信息进行解码处理,恢复出用户表数据。

本实施例的技术方案,通过解析处于二进制状态下的IAM页,从而使IAM页能够正常跟踪表,避免遍历整个文件,大大提高了数据的恢复速度。另外,本实施例对MSSQL数据库进行恢复的过程,不依赖于MSSQL状态,不需要挂载启动虚拟磁盘内系统,也不用借助日志文件,大大简化了操作流程,使用更加灵活。

实施例二

如图6所示,在一个实施例中,提供一种基于IAM页的数据库恢复的方法,所述方法包括步骤:

S201.从数据文件中获取IAM页;

S202.确定所述IAM页内的映射区域索引;

S203.根据所述映射区域索引储存的偏移确定所述IAM页内全部的数据槽;

S204.判断所述全部的数据槽是否填满,若数据槽未填满,则执行步骤S205;若数据槽填满,则执行步骤S206至步骤S209;

S205.解析步骤S204的所述全部的数据槽,获得第二对象信息,所述第二对象信息包括页码和文件号;

S206.确定所述IAM页内的统一区位图,并确定所述统一区位图内的保留字节;

S207.遍历所述IAM页,并标记出所有不为零的比特;

S208.根据步骤S202的所述映射区域索引储存的偏移和步骤S207的所述不为零的比特确定全部的统一区;

S209.解析步骤S204的所述全部的数据槽和步骤S208的所述全部的统一区,获得第三对象信息,所述第三对象信息包括页码和文件号;

S210.根据步骤S205的所述第二对象信息或步骤S209的所述第三对象信息查询到用户表页,并从所述用户表页中获得第四对象信息;

S211.将第四对象信息进行解码处理,恢复出用户表数据;

S212.对所述IAM页和所述用户表页进行校验,并将未通过校验的页进行标记。

本实施例的技术方案,SQL Server具有对每个页都会进行校验和计算,并将其计算的结果储存在页头中的功能,因此,通过对页进行校验和计算,并与页头内校验和数据对比,便可确定数据页有没有发生损坏或篡改,简单有效,提高了恢复数据的准确性。

实施例三

如图7所示,在一个实施例中,提供一种基于IAM页的数据库恢复的方法,所述方法包括步骤:

S301.从数据文件中获取IAM页;

S302.确定所述IAM页内的映射区域索引;

S303.根据所述映射区域索引储存的偏移确定所述IAM页内全部的数据槽;

S304.判断所述全部的数据槽是否填满,若数据槽未填满,则执行步骤S305;若数据槽填满,则执行步骤S306至步骤S309;

S305.解析步骤S304的所述全部的数据槽,获得第二对象信息,所述第二对象信息包括页码和文件号;

S306.确定所述IAM页内的统一区位图,并确定所述统一区位图内的保留字节;

S307.遍历所述IAM页,并标记出所有不为零的比特;

S308.根据步骤S302的所述映射区域索引储存的偏移和步骤S307的所述不为零的比特确定全部的统一区;

S309.解析步骤S304的所述全部的数据槽和步骤S308的所述全部的统一区,获得第三对象信息,所述第三对象信息包括页码和文件号;

S310.根据步骤S305的所述第二对象信息或步骤S309的所述第三对象信息查询到用户表页,并从所述用户表页中获得第四对象信息;

S311.将第四对象信息进行解码处理,恢复出用户表数据;

S312.对所述IAM页和所述用户表页进行校验,并将未通过校验的页进行标记;

S313.记录用户表数据中每条数据的首地址偏移;

S314.将所述用户表数据中每条数据的首地址偏移与行目录中的地址进行对比,并将未找到的匹配项标记为已删除数据。

本实施例的技术方案,由于行目录只记录未删除数据,当数据被删除时,其行目录将会被置空,所以无法定位行目录。因此,通过数据前后两条数据行目录间差值确定被删除数据所在范围,以便实现对删除数据的恢复。

实施例四

如图8所示,在一个实施例中,提供了一种基于IAM页的数据库恢复的系统,所述系统包括:

IAM页获取模块401,用于从数据文件中获取IAM页;

映射区域索引确定模块402,用于确定所述IAM页内的映射区域索引;

数据槽确定模块403,用于根据所述映射区域索引储存的偏移确定所述IAM页内全部的数据槽;

数据槽判断模块404,用于判断所述全部的数据槽是否填满;

第一解析模块405,用于解析所述数据槽,获得第二对象信息,所述第二对象信息包括页码和文件号;

保留字节确定模块406,用于确定所述IAM页内的统一区位图,并确定所述统一区位图内的保留字节;

遍历记录模块407,用于遍历所述IAM页,并标记出所有不为零的比特;

统一区确定模块408,用于根据所述映射区域索引储存的偏移和所述不为零的比特确定全部的统一区;

第二解析模块409,用于解析所述全部的数据槽和所述全部的统一区,获得第三对象信息,所述第三对象信息包括页码和文件号;

用户表查询模块410,用于根据所述第二对象信息或所述第三对象信息查询到用户表页,并从所述用户表页中获得第四对象信息;

解码模块411,用于将第四对象信息进行解码处理,恢复出用户表数据。

可选的,在本实施例的基础上,如图9所示,所述IAM页获取模块401,包括:

文件获取单元4001,用于获取存储系统中的数据文件;

系统表解析单元4002,用于根据系统表页标识符和系统表页组织结构解析数据文件中的系统表页,从系统表页中获取用户所需要恢复的表的第一对象信息,其中,第一对象信息包括表名称、表字段和表的主键;

IAM页获取单元4003,用于根据所述第一对象信息获取IAM页。

可选的,在本实施例的基础上,所述系统,还包括:

校验标记模块412,用于对所述IAM页和所述用户表页进行校验,并将未通过校验的页进行标记。

可选的,在本实施例的基础上,所述系统,还包括:

偏移记录模块413,用于记录用户表数据中每条数据的首地址偏移;

对比标记模块414,用于将所述用户表数据中每条数据的首地址偏移与行目录中的地址进行对比,并将未找到的匹配项标记为已删除数据。

本实施例的技术方案,通过IAM页获取模块401,用于从数据文件中获取IAM页;映射区域索引确定模块402能够确定所述IAM页内的映射区域索引;数据槽确定模块403,用于根据所述映射区域索引储存的偏移确定所述IAM页内全部的数据槽;数据槽判断模块404能够判断所述全部的数据槽是否填满;第一解析模块405解析所述数据槽,获得页码和文件号;用户表查询模块410,用于根据所述第二对象信息查询到用户表页,并从所述用户表页中获得第四对象信息;解码模块411能够将第四对象信息进行解码处理,恢复出用户表数据。解决了现在技术中,在MSSQL处于非正常状态的情况下,用户无法通过IAM页快速恢复数据技术问题,基于二进制解析,使IAM页能够正常跟踪表,避免遍历整个文件,操作流程简便有效。

实施例五

在一个实施例中,提供了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现实施例一至实施例四所述的基于IAM页的数据库恢复的方法。

本发明实施例的计算机存储介质,可以采用一个或多个计算机可读的介质的任意组合。计算机可读介质可以是计算机可读信号介质或者计算机可读存储介质。计算机可读存储介质例如可以是——但不限于——电、磁、光、电磁、红外线、或半导体的系统、装置或器件,或者任意以上的组合。计算机可读存储介质的更具体的例子(非穷举的列表)包括:具有一个或多个导线的电连接、便携式计算机磁盘、硬盘、随机存取存储器(RAM)、只读存储器(ROM)、可擦式可编程只读存储器(EPROM或闪存)、光纤、便携式紧凑磁盘只读存储器(CD-ROM)、光存储器件、磁存储器件、或者上述的任意合适的组合。在本文件中,计算机可读存储介质可以是任何包含或存储程序的有形介质,该程序可以被指令执行系统、装置或者器件使用或者与其结合使用。

以上所述实施例仅表达了本发明的几种实施方式,其描述较为具体和详细,但并不能因此而理解为对本发明专利范围的限制。应当指出的是,对于本领域的普通技术人员来说,在不脱离本发明构思的前提下,还可以做出若干变形和改进,这些都属于本发明的保护范围。因此,本发明专利的保护范围应以所附权利要求为准。

相关技术
  • 基于IAM页的数据库恢复的方法、系统及存储介质
  • 基于H5网页的授权方法、存储介质、电子设备及系统
技术分类

06120113240708