一种恢复MySQL数据库的innodb压缩数据的方法技术

技术编号:20221735 阅读:19 留言:0更新日期:2019-01-28 20:15
本发明专利技术公开了一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于包括以下步骤:S100:判断当前数据是否为压缩数据,如果是,执行步骤S200,否则,结束流程;S200:计算当前压缩数据的页大小;S300:根据压缩数据的页结构和表结构,计算当前压缩数据的起始地址;S400:采用ZLIB解压压缩数据后,根据所述压缩数据的页结构确定每一记录条目的地址;S500:采用非压缩数据页格式恢复MySQL数据库的innodb压缩数据。

【技术实现步骤摘要】
一种恢复MySQL数据库的innodb压缩数据的方法
本专利技术属于数据恢复领域,涉及一种恢复MySQL数据库的innodb压缩数据的方法。
技术介绍
MySQL数据库由于其免费和开源的原因,使其拥有大量的使用者。而innodb作为MySQL默认的使用引擎,在存放大量数据之后,数据文件膨胀,消耗大量的空间资源。此时,绝大多数用户会选择对表数据进行压缩处理。压缩处理解决了空间消耗问题,同时又引出了压缩数据恢复的问题。在数据库文件正常的情况下,MySQL数据库的innodb引擎能很好的支持压缩数据的恢复。但在数据文件被破坏、人为或病毒修改等情况下,不仅MySQL数据库的innodb引擎无能为力,传统的数据库恢复软件也存在以外问题:1.对MySQL数据库的innodb压缩数据研究不深,不能查找压缩数据的准确起始地址。2.对压缩数据解压后,无法定位记录头,提取数据无望。因此,在现有技术中,尚无一种恢复MySQL数据库的innodb压缩数据的方法。
技术实现思路
本专利技术针对现有技术的不足问题,提出了一种恢复MySQL数据库的innodb压缩数据的方法,通过计算压缩数据的页大小、计算压缩数据的起始地址及确定每一记录条目的地址,最终实现解析并恢复MySQL数据库的innodb压缩数据,包括以下步骤:S100:判断当前数据是否为压缩数据,如果是,执行步骤S200,否则,结束流程;S200:计算当前压缩数据的页大小;S300:根据压缩数据的页结构和表结构,计算当前压缩数据的起始地址;S400:采用ZLIB解压压缩数据后,根据所述压缩数据的页结构确定每一记录条目的地址;S500:采用非压缩数据页格式恢复MySQL数据库的innodb压缩数据。优选地,所述压缩数据的页结构如下表1所示。表1:压缩数据的页结构文件头页头ZLIB头原压缩数据压缩数据校验和未删除数据压缩页修改日志空闲空间外部存储页的列记录指针数组事务id和回滚指针页目录优选地,所述文件头具有如下表2所示的数据结构。表2:文件头的数据结构优选地,所述页头具有如下表3所示的数据结构。优选地,所述步骤S100中的具体步骤如下:S101:根据所述表2的数据结构,读取当前文件头第25、第26字节的内容作为页类型,判断当前页类型是否为压缩数据,如果是,执行步骤S102,否则执行步骤S103;S102:以页起始地址为首地址,向后偏移0x36字节,连续读取4字节内容作为标志字节,将所述4字节内容与0x00000020进行逻辑与运算,判断结果是否等于0x00000020,如果是,执行步骤S103,否则,结束流程;S103:读取ZLIB压缩标志并与0x80进行逻辑与运算,判断结果是否等于0x80,如果是,执行步骤S200,否则,结束流程,其中,所述ZLIB压缩标志为当前页第0x60字节的内容。优选地,所述步骤S200的具体步骤如下:S201:设置当前压缩数据的页大小,所述页大小为不大于0x4000的正整数;S202:从当前页的起始地址向后偏移,偏移的字节长度为一个页大小,读取字节长度为0x5E的数据,将所读取的数据按所述表1、表2的数据结构中各项进行一一对应,判断所读取的数据是否满足所述表1、表2的数据结构,如果是,执行步骤S204,否则,执行步骤S203;S203:将页大小重新赋值并判断是否大于0x4000:页大小=当前页大小*2,判断页大小是否大于0x4000,如果是,结束流程,否则执行步骤S202;S204:从当前页的起始地址向后偏移,偏移的字节长度为当前页大小-2,读取2字节的内容作为当前页的第一条数据的起始地址,判断起始地址是否不小于0x63且不大于阀值,所述阀值=当前页大小-页内记录总数*(页目录中单个槽的长度+单条事务ID长度+单条回滚指针长度),如果是,执行步骤S300,否则,执行步骤S203。优选地,所述步骤S300的具体步骤如下:S301:计算ZLIB头的字节长度,所述ZLIB头的字节长度=表字段数+表主键所占字段数+17,所述表字段数及表主键所占字段数包含于表结构;S302:从当前页的起始地址向后偏移,偏移的字节长度为0x5E,读取ZLIB头,ZLIB头的字节长度为步骤S301所计算的ZLIB头的字节长度,采用ZLIB库解压所读取的ZLIB头并获取解压后ZLIB头的字节长度,判断所获取的解压后ZLIB头的字节长度是否等于解压后ZLIB头的字节长度的理论值,如果是,表示当前页无压缩数据,结束流程,否则,执行步骤S303,其中,所述理论值=表字段数-表主键所占字段数+3;S303:以ZLIB头的首地址为起始地址,以当前页的末地址为结束地址,读取当前页的数据并采用ZLIB库进行解压;S304:采用解压的数据与解压后的数据长度,用以计算压缩数据校验和;S305:将解压的数据采用ZLIB库压缩并获取压缩后的数据长度;306:以所述步骤S305中所述数据长度-32为起始地址、以所述步骤S305中所述数据长度+32为结束地址,以4字节为一组,读取各组的内容并与步骤S304中所述压缩数据校验和进行比较,查找相等的一组并获取当前组的地址,作为当前页的innodb压缩数据的结束地址。优选地,所述步骤S400的具体步骤如下:S401:根据页头中的页内记录总数,从当前页的结束地址向前偏移,偏移的字节长度为页内记录总数*2,读取所述字节长度的内容作为页目录;S402:计算未删除记录的相对于当前页首地址的起始地址=当前压缩数据的页大小-2;S403:计算删除记录的相对于当前页首地址的起始地址=当前压缩数据的页大小-页内记录总数*2;S404:计算事务id和回滚指针的相对于当前页首地址的起始地址=所述删除记录的起始地址-13;S405:以所述事务id和回滚指针的相对于当前页首地址的起始地址开始连续读取13字节的内容,判断所述13字节的内容是否为全零,如果是,执行步骤S406,否则,执行步骤S407;S406:寻址至删除记录的相对于当前页首地址的起始地址并顺序读取2字节的内容,作为记录在非压缩页中的相对地址,并将当前删除记录的相对于当前页首地址的起始地址+2,执行步骤S408;S407:寻址至未删除记录的相对于当前页首地址的起始地址并顺序读取2字节的内容,作为记录在非压缩页中的相对地址,并将当前未删除记录的相对于当前页首地址的起始地址-2;S408:计算记录的起始地址=(记录在非压缩页中的相对地址&0x3FFF)-0x78-(页内记录总数*18)+步骤S303中所述理论值-步骤S301中所述ZLIB头的字节长度-跨页记录数*20,其中,所述跨页记录数初始值为0,每增加一个跨页记录,则跨页记录数=跨页记录数+1;S409:存储解压后的记录条目的地址,将事务id和回滚指针的相对于当前页首地址的起始地址-13并判断是否存在其他记录条目,如果是,执行步骤S405,否则,结束流程。优选地,所述步骤S500包括以下步骤:S501:根据表结构计算出NULL标志所占字节数;S502:寻址至记录在非压缩页中的相对地址,从后往前分别读取NULL标志所占字节数,得到NULL标志;S503:根据表结构计算出变长字段个数;S504:获取变长字段长度,包括以下步骤:S5041:寻址至记录的起始地址+NUL本文档来自技高网...

【技术保护点】
1.一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于包括以下步骤:S100:判断当前数据是否为压缩数据,如果是,执行步骤S200,否则,结束流程;S200:计算当前压缩数据的页大小;S300:根据压缩数据的页结构和表结构,计算当前压缩数据的起始地址;S400:采用ZLIB解压压缩数据后,根据所述压缩数据的页结构确定每一记录条目的地址;S500:采用非压缩数据页格式恢复MySQL数据库的innodb压缩数据。

【技术特征摘要】
1.一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于包括以下步骤:S100:判断当前数据是否为压缩数据,如果是,执行步骤S200,否则,结束流程;S200:计算当前压缩数据的页大小;S300:根据压缩数据的页结构和表结构,计算当前压缩数据的起始地址;S400:采用ZLIB解压压缩数据后,根据所述压缩数据的页结构确定每一记录条目的地址;S500:采用非压缩数据页格式恢复MySQL数据库的innodb压缩数据。2.根据权利要求1所述的一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于,所述压缩数据的页结构如下表1所示。表1:压缩数据的页结构文件头页头ZLIB头原压缩数据压缩数据校验和未删除数据压缩页修改日志空闲空间外部存储页的列记录指针数组事务id和回滚指针页目录3.根据权利要求2所述的一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于,所述文件头具有如下表2所示的数据结构。表2:文件头的数据结构4.根据权利要求3所述的一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于,所述页头具有如下表3所示的数据结构。表3:页头的数据结构5.根据权利要求4所述的一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于,所述步骤S100中的具体步骤如下:S101:根据所述表2的数据结构,读取当前文件头第25、第26字节的内容作为页类型,判断当前页类型是否为压缩数据,如果是,执行步骤S102,否则执行步骤S103;S102:以页起始地址为首地址,向后偏移0x36字节,连续读取4字节内容作为标志字节,将所述4字节内容与0x00000020进行逻辑与运算,判断结果是否等于0x00000020,如果是,执行步骤S103,否则,结束流程;S103:读取ZLIB压缩标志并与0x80进行逻辑与运算,判断结果是否等于0x80,如果是,执行步骤S200,否则,结束流程,其中,所述ZLIB压缩标志为当前页第0x60字节的内容。6.根据权利要求5所述的一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于,所述步骤S200的具体步骤如下:S201:设置当前压缩数据的页大小,所述页大小为不大于0x4000的正整数;S202:从当前页的起始地址向后偏移,偏移的字节长度为一个页大小,读取字节长度为0x5E的数据,将所读取的数据按所述表1、表2的数据结构中各项进行一一对应,判断所读取的数据是否满足所述表1、表2的数据结构,如果是,执行步骤S204,否则,执行步骤S203;S203:将页大小重新赋值并判断是否大于0x4000:页大小=当前页大小*2,判断页大小是否大于0x4000,如果是,结束流程,否则执行步骤S202;S204:从当前页的起始地址向后偏移,偏移的字节长度为当前页大小-2,读取2字节的内容作为当前页的第一条数据的起始地址,判断起始地址是否不小于0x63且不大于阀值,所述阀值=当前页大小-页内记录总数*(页目录中单个槽的长度+单条事务ID长度+单条回滚指针长度),如果是,执行步骤S300,否则,执行步骤S203。7.根据权利要求6所述的一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于,所述步骤S300的具体步骤如下:S301:计算ZLIB头的字节长度,所述ZLIB头的字节长度=表字段数+表主键所占字段数+17,所述表字段数及表主键所占字段数包含于表结构;S302:从当前页的起始地址向后偏移,偏移的字节长度为0x5E,读取ZLIB头,ZLIB头的字节长度为步骤S301所计算的ZLIB头的字节长度,采用ZLIB库解压所读取的ZLIB头并获取解压后ZLIB头的字节长度,判断所获取的解压后ZLIB头的字节长度是否等于解压后ZLIB头的字节长度的理论值,如果是,表示当前页无压缩数据,结束流程,否则,执行步...

【专利技术属性】
技术研发人员:梁效宁许超明张强朱星海董超刘涛
申请(专利权)人:四川巧夺天工信息安全智能设备有限公司
类型:发明
国别省市:四川,51

网友询问留言 已有0条评论
  • 还没有人留言评论。发表了对其他浏览者有用的留言会获得科技券。

1