一种对MySQL数据库全库的恢复方法与流程

文档序号:15492180发布日期:2018-09-21 20:50阅读:204来源:国知局

本发明属于数据恢复领域,具体涉及一种对mysql数据库全库的恢复方法。



背景技术:

随着信息时代的来临,对数据的管理和应用都离不开数据库。而mysql作为一款免费、开源的数据库,深受许多人的钟爱。在mysql的使用过程中,难免会遇到误操作、人为恶意破坏、软硬件故障等原因对数据库造成损坏,丢失重要数据。此时,对mysql数据库进行恢复并找回重要数据就至关重要。目前,现有技术中的恢复方案是通过数据库备份和日志的方式进行恢复,更深层次一些的恢复方案是利用文件雕复技术从磁盘中恢复数据库,但这些方法都面临以下一些缺陷:

1.需要在备份文件、日志文件或者表结构定义文件完整的情况下做恢复,一旦文件缺失或者损坏将无能为力;

2.只能针对特定的mysql引擎进行恢复;

3.针对mysql压缩数据的恢复显得心有余而力不足;

4.很多时候只能针对某个固定表进行恢复。



技术实现要素:

本发明针对现有技术的不足问题,提出了一种对mysql数据库全库的恢复方法,通过雕复mysql数据库文件、关联数据库文件、恢复表结构并最终恢复数据库文件,达到恢复mysql数据库全库的目的,包括以下步骤:

s100:雕复mysql数据库文件:扫描磁盘,查找文件特征并获取具有所述文件特征的表数据文件及表结构文件,根据数据页编号和表空间标识重组文件,保存表定义文件,其中,所述文件特征包括表结构文件特征和表数据文件特征;

s200:关联所述数据库文件:将雕复mysql数据库文件与mysql数据库的引擎种类进行匹配,将表结构文件与相应的表数据文件关联;

s300:恢复表结构:判断表数据文件是否与相应的表结构文件关联,如果是,则执行步骤s400;否则,根据所述引擎种类恢复表结构;

s400:恢复所述数据库文件:提取表数据文件和表结构文件中各字段数据并组合为表记录,所述表记录为恢复的数据库文件;

对于不存在关联表结构的表空间文件进行模糊处理并组合为表记录,所述表记录为恢复的数据库文件。

优选地,步骤s100包括以下步骤:

s101:扫描所述磁盘并查找表结构文件特征和表数据文件特征;

s102:判断文件特征是否为所述表结构文件特征,如果是,执行步骤s103,否则为所述表数据文件特征,执行步骤s104;

s103:保存表结构文件,然执行步骤s107;

s104:根据表数据文件中的表空间标识判断是否存在表空间队列,如果是,执行步骤s106;否则,执行步骤s105;

s105:以所述表数据文件的表空间标识为关键字,创建新的表空间队列,将新的表数据文件加入到当前创建的表空间队列中,执行步骤s107;

s106:将新的表数据文件加入到当前表空间队列中;

s107:判断是否完成磁盘扫描,如果是,执行s108;否则,执行步骤s101;

s108:将表空间队列中的表数据文件按数据页中的编号从小到大排序为有序的表数据文件,所述有序的表数据文件称为表空间文件。

优选地,所述步骤s200包括以下步骤:

s201:加载步骤s100所获取的表空间文件;

s202:匹配表空间文件的引擎种类;

s203:匹配表空间文件的表结构文件:根据表空间文件的行数据格式匹配表结构文件,具体地,根据表空间文件中行数据包含的字段数、各个字段的类型及各个字段的顺序与表结构文件匹配,不能匹配则执行步骤s204;

s204:判断是否所有的表空间文件都已完成引擎种类的匹配,如果是,则执行步骤s300,否则,执行步骤s201。

优选地,所述s300包括以下步骤:

s301:加载步骤s200所获取的表空间文件;

s302:判断表空间文件是否已与表结构文件关联;如果是,则执行步骤s400,否则,执行步骤303;

s303:根据引擎种类,针对尚未与表结构文件关联的表空间文件,恢复表结构;

s304:判断是否所有的表空间文件已经检查关联文件,如果是,则执行步骤s400;否则,执行步骤301。

优选地,所述s400包括以下步骤:

s401:加载步骤s300所获取的表空间文件;

s402:判断表空间文件是否有关联的表结构文件或者已存在表结构,如果是,则执行步骤s403,否则执行步骤s404;

s403:对于存在关联表结构文件的表空间文件,解析表结构文件,根据表结构文件格式提取表结构,执行步骤s405;

s404:对于不存在关联表结构的表空间文件进行模糊处理:先从表空间文件中提取一条表记录,根据记录中数据特征分析表结构,包括表字段数、表字段类型,将表结构作为表空间文件的关联表结构;

s405:按照表结构的字段数、字段类型、主键信息,在表空间文件中提取表字段数据;

s406:根据表结构中字段名称、字段顺序,将s405中提取的表字段数据插入到相应位置,获得完整的表记录;

s407:判断是否所有表空间文件都已恢复,如果是,则结束流程,否则,执行步骤s401。

本发明的有益效果是:

1.在没有备份文件、日志文件或表结构文件的情况下能够对mysql数据库全库进行恢复;

2.可以对mysql官方当前支持的引擎进行恢复;

3.可以对mysql压缩数据做到无损恢复;

4.可以对mysql数据库全库而不是特定表进行恢复;

5.拥有多种途径对mysql进行恢复,增加成功恢复的机率。

附图说明

图1为本发明的主流程图;

图2为本发明中步骤s100的详细流程图;

图3为本发明中步骤s200的详细流程图;

图4为本发明中步骤s300的详细流程图;

图5为本发明中步骤s400的详细流程图。

具体实施方式

下面结合附图和实施例对本发明作进一步阐述。如图1所示,本发明的方法包括以下步骤:

s100:雕复mysql数据库文件:扫描磁盘,查找文件特征并获取具有所述文件特征的表数据文件及表结构文件,根据数据页编号和表空间标识重组文件,保存表定义文件,其中,所述文件特征包括表结构文件特征和表数据文件特征,包括如图2所示的以下步骤:

s101:扫描磁盘并查找表结构文件特征和表数据文件特征;

本实施例中,表结构文件特征为0xfe01。

对于表数据文件特征,分为如下情况:

引擎种类为innodb的表数据文件特征:innodb数据按页存储,页大小分为16k、8k、4k、2k、1k。在每页的起始位置向后偏移0x18字节的连续两字节内容为0x45bf且在每页的起始位置向后偏移0x40字节的一字节内容为0x00的页即为innodb数据文件页;

引擎种类为myisam的表数据文件特征:myisam数据不按页存储,文件大小随着数据的增多而增多;文件开头按表的行类型分为:

fixed行:以0xff开头;

dynamic行:以0x00到0x0d这14个数值中的任一开头;

compressed行:以0xfefe0802开头;

引擎种类为archive的表数据文件特征:以0xfe03开头;

引擎种类为csv的表数据文件特征:csv引擎以纯文本存储数据,以0x0a作为行结束标记,以0x2c作为表字段分隔符;

s102:判断文件特征是否为表结构文件特征,如果是,执行步骤s103,否则为表数据文件特征,执行步骤s104;

s103:保存表结构文件,然执行步骤s107;

s104:根据表数据文件中的表空间标识判断是否存在表空间队列,如果是,执行步骤s106;否则,执行步骤s105;

s105:以表数据文件的表空间标识为关键字,创建新的表空间队列,将新的表数据文件加入到当前创建的表空间队列中,执行步骤s107;

s106:将新的表数据文件加入到当前表空间队列中;

s107:判断是否完成磁盘扫描,如果是,执行s108;否则,执行步骤s101;s108:将表空间队列中的表数据文件按数据页中的编号从小到大排序为有序的表数据文件,有序的表数据文件称为表空间文件。

s200:关联数据库文件:将雕复mysql数据库文件与mysql数据库的引擎种类进行匹配,将表结构文件与相应的表数据文件关联,包括如图3所示的以下步骤:

s201:加载步骤s100所获取的表空间文件;

s202:匹配表空间文件的引擎种类,引擎种类分别是mysql的存储数据的引擎种类innodb、myisam、archive及csv;

s203:匹配表空间文件的表结构文件:根据表空间文件的行数据格式匹配表结构文件,具体地,根据表空间文件中行数据包含的字段数、各个字段的类型及各个字段的顺序与表结构文件匹配,不能匹配则执行步骤s204;

s204:判断是否所有的表空间文件都已完成引擎种类的匹配,如果是,则执行步骤s300,否则,执行步骤s201。

s300:恢复表结构:判断表数据文件是否与相应的表结构文件关联,如果是,则执行步骤s400;否则,根据引擎种类恢复表结构,包括如图4所示的以下步骤:

s301:加载步骤s200所获取的表空间文件;

s302:判断表空间文件是否已与表结构文件关联;如果是,则执行步骤s400,否则,执行步骤303;

s303:根据引擎种类,针对尚未与表结构文件关联的表空间文件,恢复表结构,具体地:

s3031:表空间文件的引擎种类为innodb,在缺失表结构文件的情况下,从以下部分恢复表结构:

s30311:从mysql数据字典中恢复:表空间标识值为0x01,0x02,0x03,0x04的表空间为mysql数据字典页,其中分别存放了表名信息、表列信息、表索引信息、表索引字段信息,根据这4类信息恢复表结构;

s30312:从系统二进制日志中恢复,二进制日志中记录所有的用户操作。二进制日志包含40种事件类型,提取其中的query事件。query事件中记录了表的定义语句,解析语句可恢复表结构;

s30313:在用户知道表结构的情况下,还可以新建空表,将产生的表结构文件作为解析表数据文件所需的表结构文件;

s3032:表空间文件的引擎种类为myisam:在缺失表结构文件的情况下,从以下部分恢复表结构:

s30321:从表索引文件恢复,myisam引擎的表索引文件相当于innodb的数据字典,其中包含了表的基本信息,可以解析索引文件恢复表结构;

s30322:与步骤s30312的方法相同;

s30323:与步骤s30313的方法相同;

s3033:表空间文件的引擎种类为archive:在缺失表结构文件的情况下,从以下部分恢复表结构:

s30331:从表数据文件本身恢复,archive引擎在表数据文件中有一份表结构文件的备份,可以从中恢复表结构;

s30332:与步骤s30312的方法相同;

s30333:与步骤s30313的方法相同;

s3034:如果表空间所属引擎为csv,在缺失表结构文件的情况下,可以尝试着从以下部分恢复表结构:

s30341:与步骤s30312的方法相同;

s30342:与步骤s30313的方法相同;;

s304:判断是否所有的表空间文件已经检查关联文件,如果是,则执行步骤s400;否则,执行步骤301。

s400:恢复数据库文件:提取表数据文件和表结构文件中各字段数据并组合为表记录,表记录为恢复的数据库文件,包括如图5所示的以下步骤:

s401:加载步骤s300所获取的表空间文件;

s402:判断表空间文件是否有关联的表结构文件或者已存在表结构,如果是,则执行步骤s403,否则执行步骤s404;

s403:对于存在关联表结构文件的表空间文件,解析表结构文件,根据表结构文件格式提取表结构,执行步骤s405;

s404:对于不存在关联表结构的表空间文件进行模糊处理:先从表空间文件中提取一条表记录,根据记录中数据特征(例如,int型数据占用4个字节并以0x80开头)来分析表结构,包括表字段数、表字段类型,将表结构作为表空间文件的关联表结构;

s405:按照表结构的字段数、字段类型、主键信息,在表空间文件中提取表字段数据;

s406:根据表结构中字段名称、字段顺序,将s405中提取的表字段数据插入到相应位置,获得完整的表记录;

s407:判断是否所有表空间文件都已恢复,如果是,则结束流程,否则,执行步骤s401。

通过本发明提供的方法,能够在没有备份文件、日志文件或表结构文件的情况下对mysql数据库全库进行恢复、对mysql官方当前支持的引擎进行恢复、对mysql压缩数据做到无损恢复以及对mysql数据库全库而不是特定表进行恢复。

应当理解的是,本发明不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1