CN109271463A - 一种恢复MySQL数据库的innodb压缩数据的方法 - Google Patents

一种恢复MySQL数据库的innodb压缩数据的方法 Download PDF

Info

Publication number
CN109271463A
CN109271463A CN201811453262.8A CN201811453262A CN109271463A CN 109271463 A CN109271463 A CN 109271463A CN 201811453262 A CN201811453262 A CN 201811453262A CN 109271463 A CN109271463 A CN 109271463A
Authority
CN
China
Prior art keywords
page
address
data
current
byte
Prior art date
Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
Granted
Application number
CN201811453262.8A
Other languages
English (en)
Other versions
CN109271463B (zh
Inventor
梁效宁
许超明
张强
朱星海
董超
刘涛
Current Assignee (The listed assignees may be inaccurate. Google has not performed a legal analysis and makes no representation or warranty as to the accuracy of the list.)
Sichuan Art Beats Nature Information Security Intelligent Equipment Co Ltd
Original Assignee
Sichuan Art Beats Nature Information Security Intelligent Equipment Co Ltd
Priority date (The priority date is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the date listed.)
Filing date
Publication date
Application filed by Sichuan Art Beats Nature Information Security Intelligent Equipment Co Ltd filed Critical Sichuan Art Beats Nature Information Security Intelligent Equipment Co Ltd
Priority to CN201811453262.8A priority Critical patent/CN109271463B/zh
Publication of CN109271463A publication Critical patent/CN109271463A/zh
Application granted granted Critical
Publication of CN109271463B publication Critical patent/CN109271463B/zh
Active legal-status Critical Current
Anticipated expiration legal-status Critical

Links

Classifications

    • YGENERAL TAGGING OF NEW TECHNOLOGICAL DEVELOPMENTS; GENERAL TAGGING OF CROSS-SECTIONAL TECHNOLOGIES SPANNING OVER SEVERAL SECTIONS OF THE IPC; TECHNICAL SUBJECTS COVERED BY FORMER USPC CROSS-REFERENCE ART COLLECTIONS [XRACs] AND DIGESTS
    • Y02TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
    • Y02DCLIMATE CHANGE MITIGATION TECHNOLOGIES IN INFORMATION AND COMMUNICATION TECHNOLOGIES [ICT], I.E. INFORMATION AND COMMUNICATION TECHNOLOGIES AIMING AT THE REDUCTION OF THEIR OWN ENERGY USE
    • Y02D10/00Energy efficient computing, e.g. low power processors, power management or thermal management

Landscapes

  • Information Retrieval, Db Structures And Fs Structures Therefor (AREA)

Abstract

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

Description

一种恢复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:寻址至记录的起始地址+NULL标志所占字节数,读取并存储当前地址中1字节的内容作为变长字段长度,cnt赋初值为所述变长字段个数;
S5042:所读取1字节的内容与0x80进行逻辑与运算,判断结果是否为0x80,如果是,执行步骤S5044,否则,执行步骤S5043;
S5043:当前地址=当前地址-1,cnt=cnt-1,执行步骤S5046;
S5044:当前地址=当前地址-2;
S5045:读取并存储当前地址中2字节的内容作为变长字段长度,cnt=cnt-1;
S5046:判断当前cnt是否为0,如果是,执行步骤S505,否则,执行步骤S5041。
S505:寻址至记录的起始地址并根据表结构、NULL标志以及步骤S504中所获取的各个变长字段长度,对数据进行解析;
S506:重复执行步骤S501到步骤S505,直至所有记录解析完毕并存储为恢复的所述MySQL数据库的innodb压缩数据。
本发明的有益效果是:
1.能够查找压缩数据准确的起始地址,不丢失数据,也不破坏未压缩数据;
2.对数据解压后,根据算法还原数据未压缩前的结构,使压缩数据的恢复与未压缩数据的提取一样方便,解决了现有技术中尚无一种恢复MySQL数据库的innodb压缩数据的方法的技术问题。
附图说明
图1为本发明所提供的方法的总流程图;
图2为本发明一个实施例中压缩数据用ZLIB库解压后的数据格式;
图3为本发明一个实施例中获取变长字段长度的流程图。
具体实施方式
MySQL数据库的innodb以页为基本单位来存储数据,每一个页大小相同,页大小可以为16k、8k、4k、2k以及1k,MySQL数据库的innodb压缩数据的页结构如下表1所示,
表1:压缩数据的页结构
其中,
文件头表示为FILE_HEADER;
页头表示为PAGE_HEADER;
ZLIB头表示为ZLIB_HEADER
原压缩数据表示为Compressed data
压缩数据校验和表示为alder32
未删除数据表示为normal data
压缩页修改日志表示为mlog
空闲空间表示为Freespace
外部存储页的列记录指针数组表示为external_ptr
事务id和回滚指针表示为trx_id和roll_ptr
页目录表示为Pagedirectory
每一个页最前面有固定大小(例如,0x26字节)的文件头(FILE_HEADER),文件头具有如下表2所示的数据结构:
表2:文件头的数据结构
页头具有如下表3所示的数据结构:
表3:页头的数据结构
下面结合附图和实施例对本发明作进一步阐述。
图1示出了本发明所提供的方法的总流程图,如图1所示,本发明的方法包括以下步骤:
S100:判断当前数据是否为压缩数据,如果是,执行步骤S200,否则,结束流程;包括如下具体步骤:
S101:根据表2的数据结构,读取当前文件头FILE_HEADER第25、第26字节的内容作为页类型FIL_PAGE_TYPE,判断当前页类型FIL_PAGE_TYPE是否为压缩数据,如果是,执行步骤S102,否则执行步骤S103;本实施例中,页类型FIL_PAGE_TYPE的值为0x0008,即,需要判断当前页类型FIL_PAGE_TYPE是否等于0x0008;
S102:以页起始地址为首地址,向后偏移0x36字节,连续读取4字节内容作为标志字节flag,将4字节内容与0x00000020进行逻辑与运算,判断结果是否等于0x00000020,如果是,执行步骤S103,否则,结束流程;
S103:读取ZLIB压缩标志FLG并与0x80进行逻辑与运算,判断结果是否等于0x80,如果是,执行步骤S200,否则,结束流程,其中,ZLIB压缩标志FLG为当前页第0x60字节的内容。
S200:计算当前压缩数据的页大小;
由于压缩页的数据结构有所改变,体现在末尾与页头PAGE_HEADER相关联的校验信息被删除,通过校验和确定页大小mPageSize的传统方式及现有技术已不再可取(其中,mPageSize表示页大小,以下同),本发明提出以下方式确定mPageSize,包括以下步骤:
S201:设置当前压缩数据的mPageSize,mPageSize为不大于0x4000的正整数;本实施例中,将mPageSize设为0x400;
S202:从当前页的起始地址向后偏移,偏移的字节长度为一个页大小,即0x400,读取字节长度为0x5E的数据,将所读取的数据按表1、表2的数据结构中各项进行一一对应,判断所读取的数据是否满足表1、表2的数据结构,如果是,执行步骤S204,否则,执行步骤S203;
S203:将mPageSize重新赋值并判断是否大于0x4000:即,mPageSize=当前mPageSize*2,判断mPageSize是否大于0x4000,如果是,结束流程,否则执行步骤S202;
S204:从当前页的起始地址向后偏移,偏移的字节长度为当前mPageSize-2,读取2字节的内容作为当前页的第一条数据的起始地址,判断起始地址是否不小于0x63且不大于阀值,阀值=当前mPageSize-rec*(slot+trxIdLen+rollPtrLen),如果是,执行步骤S300,否则,执行步骤S203;其中,
rec是页内记录总数,包括删除记录数;
slotLen为页目录中单个槽的长度,本实施例中为2字节;
trxIdLen为单条事务ID长度,本实施例中为6字节;
rollPtrLen为单条回滚指针长度,本实施例中为7字节。
S300:根据压缩数据的页结构和表结构,计算当前压缩数据的起始地址;
S301:计算ZLIB_HEADER的字节长度,ZLIB_HEADER的字节长度=fields+primary_fields+17,其中,
fields为表字段数;
primary_fields为表主键所占字段数,以下同。
由公知技术可知,fields及primary_fields包含于表结构,具体方法不再赘述;
S302:从当前页的起始地址向后偏移,偏移的字节长度为0x5E,读取ZLIB_HEADER,ZLIB_HEADER的字节长度为步骤S301所计算的ZLIB_HEADER的字节长度,采用ZLIB库解压所读取的ZLIB_HEADER并获取解压后ZLIB_HEADER的字节长度,判断所获取的解压后ZLIB_HEADER的字节长度是否等于解压后ZLIB_HEADER的字节长度的理论值,如果是,表示当前页无压缩数据,结束流程,否则,执行步骤S303,其中,理论值=fields-primary_fields+3;
由于ZLIB解压时,检测到末尾的alder32(即压缩数据校验和,以下同),则不管后面是否还有数据,都自动结束解压,且alder32存在于压缩数据中。本发明利用这一特性来确定压缩数据的结束地址,即,首先将ZLIB_HEADER开始到本页末尾的所有数据都读取出来并用ZLIB库进行解压。然后,将解压出来的数据和解压后的数据长度一起计算alder32值;其次,再把解压的数据又用ZLIB库压缩回去并得到压缩后的数据长度comLen。由于恢复MySQL数据库的innodb压缩数据时采用的压缩算法与ZLIB标准算法有一定差距,故comLen并不是准确的原压缩数据的长度,经研究发现,comLen的值与真实压缩数据长度相差在32(0x20)个字节以内。因此,本发明以comLen为中心点,前后扩充32个字节作为一个查询的范围。而我们可以确定原压缩数据的alder32值必定在该范围内,据此,利用计算出来的alder32值在该范围中查找与原压缩数据的alder32值相同的值的地址,该地址即为压缩数据的结束地址,具体如下步骤S303至S306所述:
S303:以ZLIB_HEADER的首地址为起始地址,以当前页的末地址为结束地址,读取当前页的数据并采用ZLIB库进行解压;
S304:采用解压的数据与解压后的数据长度,用以计算alder32值;
S305:将解压的数据采用ZLIB库压缩并获取压缩后的数据长度comLen;
306:以comLen-32为起始地址、以comLen+32为结束地址,以4字节为一组,读取各组的内容并与步骤S304中alder32进行比较,查找相等的一组并获取当前组的地址,作为当前页的innodb压缩数据的结束地址。
S400:采用ZLIB解压压缩数据后,根据所述压缩数据的页结构确定每一记录条目的地址;
步骤300中,压缩数据用ZLIB库解压后的数据格式如图2所示,
图2中,NULL标志部分和变长字段列表部分都是变长且逆序存储,变长字段列表中表示一个变长字段的值所占用的字节数也是不定的,可能是1个字节,也可能是2个字节,而字段数据的还原又必须依赖于NULL标志和变长字段列表。因此,数据虽然已经解压出来,但数据的恢复提取还是无法进行。本发明提出以下方法来重新确定数据起始位置,并逆序计算出NULL标志和变长字段列表,使得数据恢复与MySQL数据库的innodb未压缩数据页一样简单,包括以下具体步骤:
S401:根据页头中的页内记录总数(即rec,以下同),从当前页的结束地址向前偏移,偏移的字节长度为rec*2,读取字节长度的内容作为页目录Page directory;
S402:计算未删除记录的相对于当前页首地址的起始地址slot_offset=mPageSize-2;
S403:计算删除记录的相对于当前页首地址的起始地址del_offset=mPageSize-recs*2;
S404:计算事务id和回滚指针的相对于当前页首地址的起始地址rs_offset=del_offset-13;
S405:以地址rs_offset开始连续读取13字节的内容,判断13字节的内容是否为全零,如果是,执行步骤S406,否则,执行步骤S407;
S406:寻址至del_offset并顺序读取2字节的内容,作为记录在非压缩页中的相对地址,记为rec_tpos,对del_offset重新赋值为del_offset+2,执行步骤S408;
S407:寻址至slot_offset并顺序读取2字节的内容,作为记录在非压缩页中的相对地址,记为rec_tpos,对slot_offset重新赋值为slot_offset-2;
S408:计算记录的起始地址rec_rpos:
rec_rpos=(rec_tpos&0x3fff)-0x78-(curRecs*18)+zlib_uncommpressed_header-rec_head_len-over_page_cnt*20
其中,curRecs为当前页确定的记录数,初始值为0,每确定一个记录的起始地址,其值加1;
rec_head_len为MySQL数据库的innodb中压缩数据的头长度;
over_page_cnt为跨页记录数,其初始值为0,每增加一个跨页记录,则over_page_cnt=over_page_cnt+1;
S409:存储解压后的记录条目的地址,将rs_offset-13并判断是否存在其他记录条目,如果是,执行步骤S405,否则,结束流程。
S500:采用非压缩数据页格式恢复MySQL数据库的innodb压缩数据:
根据步骤400确定的每一条记录的起始地址rec_rpos去解析解压后数据,以恢复整个压缩数据页,包括以下具体步骤:
S501:根据表结构计算出NULL标志所占字节数null_bytes;
S502:寻址至rec_tpos,从后往前分别读取null_bytes,得到NULL标志null_flags;
S503:根据表结构计算出变长度字段个数var_cnts;
S504:获取变长字段长度varlen,包括以下步骤:
S5041:寻址至rec_rpos+null_bytes,读取并存储当前地址中1字节的内容作为变长字段长度varlen,将cnt赋初值为var_cnts;
S5042:所读取1字节的内容与0x80进行逻辑与运算,判断结果是否为0x80,如果是,执行步骤S5044,否则,执行步骤S5043;
S5043:当前地址=当前地址-1,cnt=cnt-1,执行步骤S5046;
S5044:当前地址=当前地址-2;
S5045:读取并存储当前地址中2字节的内容作为varlen,cnt=cnt-1;
S5046:判断当前cnt是否为0,如果是,执行步骤S505,否则,执行步骤S5041。
S505:寻址至rec_rpos并根据表结构、NULL标志null_flags以及步骤S504中所获取的各个变长字段长度varlen,对数据进行解析;
S506:重复执行步骤S501到步骤S505,直至所有记录解析完毕并存储为恢复的MySQL数据库的innodb压缩数据。
通过本发明提供的方法,解决了现有技术中尚无一种恢复MySQL数据库的innodb压缩数据的方法的技术问题。
应当理解的是,本发明不限于上述的举例,对本领域普通技术人员来说,可以根据上述说明加以改进或变换,所有这些改进和变换都应属于本发明所附权利要求的保护范围。

Claims (9)

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头的字节长度的理论值,如果是,表示当前页无压缩数据,结束流程,否则,执行步骤S303,其中,所述理论值=表字段数-表主键所占字段数+3;
S303:以ZLIB头的首地址为起始地址,以当前页的末地址为结束地址,读取当前页的数据并采用ZLIB库进行解压;
S304:采用解压的数据与解压后的数据长度,用以计算压缩数据校验和;
S305:将解压的数据采用ZLIB库压缩并获取压缩后的数据长度;
306:以所述步骤S305中所述数据长度-32为起始地址、以所述步骤S305中所述数据长度+32为地址,以4字节为一组,读取各组的内容并与步骤S304中所述压缩数据校验和进行比较,查找相等的一组并获取当前组的地址,作为当前页的innodb压缩数据的结束地址。
8.根据权利要求7所述的一种恢复MySQL数据库的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,否则,结束流程。
9.根据权利要求8所述的一种恢复MySQL数据库的innodb压缩数据的方法,其特征在于,所述步骤S500包括以下步骤:
S501:根据表结构计算出NULL标志所占字节数;
S502:寻址至记录在非压缩页中的相对地址,从后往前分别读取NULL标志所占字节数,得到NULL标志;
S503:根据表结构计算出变长度字段个数;
S504:获取变长字段长度,包括以下步骤:
S5041:寻址至记录的起始地址+NULL标志所占字节数,读取并存储当前地址中1字节的内容作为变长字段长度,cnt赋初值为所述变长字段个数;
S5042:所读取1字节的内容与0x80进行逻辑与运算,判断结果是否为0x80,如果是,执行步骤S5044,否则,执行步骤S5043;
S5043:当前地址=当前地址-1,cnt=cnt-1,执行步骤S5046;
S5044:当前地址=当前地址-2;
S5045:读取并存储当前地址中2字节的内容作为变长字段长度,cnt=cnt-1;
S5046:判断当前cnt是否为0,如果是,执行步骤S505,否则,执行步骤S5041;
S505:寻址至记录的起始地址并根据表结构、NULL标志以及步骤S504中所获取的各个变长字段长度,对数据进行解析;
S506:重复执行步骤S501到步骤S505,直至所有记录解析完毕并存储为恢复的所述MySQL数据库的innodb压缩数据。
CN201811453262.8A 2018-11-30 2018-11-30 一种恢复MySQL数据库的innodb压缩数据的方法 Active CN109271463B (zh)

Priority Applications (1)

Application Number Priority Date Filing Date Title
CN201811453262.8A CN109271463B (zh) 2018-11-30 2018-11-30 一种恢复MySQL数据库的innodb压缩数据的方法

Applications Claiming Priority (1)

Application Number Priority Date Filing Date Title
CN201811453262.8A CN109271463B (zh) 2018-11-30 2018-11-30 一种恢复MySQL数据库的innodb压缩数据的方法

Publications (2)

Publication Number Publication Date
CN109271463A true CN109271463A (zh) 2019-01-25
CN109271463B CN109271463B (zh) 2022-06-07

Family

ID=65186062

Family Applications (1)

Application Number Title Priority Date Filing Date
CN201811453262.8A Active CN109271463B (zh) 2018-11-30 2018-11-30 一种恢复MySQL数据库的innodb压缩数据的方法

Country Status (1)

Country Link
CN (1) CN109271463B (zh)

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113282592A (zh) * 2021-07-22 2021-08-20 成都云祺科技有限公司 对mssql数据库进行恢复的方法、系统及存储介质

Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2013039420A2 (en) * 2011-09-16 2013-03-21 Andrey Evgenevich Vasilev Relational database and operation mode of relational database
CN105677509A (zh) * 2015-12-25 2016-06-15 北京奇虎科技有限公司 数据库中数据的恢复方法及装置
KR101670473B1 (ko) * 2015-11-30 2016-10-31 고려대학교 산학협력단 MySQL InnoDB 데이터베이스에서 삭제된 데이터를 복원하는 방법
CN106528896A (zh) * 2016-12-29 2017-03-22 网易(杭州)网络有限公司 一种数据库优化方法和装置
CN107391306A (zh) * 2017-07-27 2017-11-24 国家电网公司 一种异构数据库备份文件恢复方法
WO2018051696A1 (ja) * 2016-09-14 2018-03-22 株式会社ターボデータラボラトリー データ圧縮方法、データ圧縮装置、コンピュータプログラム及びデータベースシステム
CN108009049A (zh) * 2017-11-28 2018-05-08 厦门市美亚柏科信息股份有限公司 Myisam存储引擎删除记录离线恢复方法、存储介质
CN108563535A (zh) * 2018-04-27 2018-09-21 四川巧夺天工信息安全智能设备有限公司 一种对MySQL数据库全库的恢复方法

Patent Citations (8)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
WO2013039420A2 (en) * 2011-09-16 2013-03-21 Andrey Evgenevich Vasilev Relational database and operation mode of relational database
KR101670473B1 (ko) * 2015-11-30 2016-10-31 고려대학교 산학협력단 MySQL InnoDB 데이터베이스에서 삭제된 데이터를 복원하는 방법
CN105677509A (zh) * 2015-12-25 2016-06-15 北京奇虎科技有限公司 数据库中数据的恢复方法及装置
WO2018051696A1 (ja) * 2016-09-14 2018-03-22 株式会社ターボデータラボラトリー データ圧縮方法、データ圧縮装置、コンピュータプログラム及びデータベースシステム
CN106528896A (zh) * 2016-12-29 2017-03-22 网易(杭州)网络有限公司 一种数据库优化方法和装置
CN107391306A (zh) * 2017-07-27 2017-11-24 国家电网公司 一种异构数据库备份文件恢复方法
CN108009049A (zh) * 2017-11-28 2018-05-08 厦门市美亚柏科信息股份有限公司 Myisam存储引擎删除记录离线恢复方法、存储介质
CN108563535A (zh) * 2018-04-27 2018-09-21 四川巧夺天工信息安全智能设备有限公司 一种对MySQL数据库全库的恢复方法

Non-Patent Citations (3)

* Cited by examiner, † Cited by third party
Title
便当君(小白): ""MySQL Innodb数据页结构分析"", 《博客园--HTTPS://WWW.CNBLOGS.COM/BDSIR/P/8745553.HTML》 *
加载水草丰茂的地方: ""mysql innodb表数据压缩"", 《CSDN-HTTPS://BLOG.CSDN.NET/LINGHAOWONENG/ARTICLE/DETAILS/51491800》 *
胡雯、李燕: ""MySQL数据库存储引擎探析"", 《软件导刊》 *

Cited By (1)

* Cited by examiner, † Cited by third party
Publication number Priority date Publication date Assignee Title
CN113282592A (zh) * 2021-07-22 2021-08-20 成都云祺科技有限公司 对mssql数据库进行恢复的方法、系统及存储介质

Also Published As

Publication number Publication date
CN109271463B (zh) 2022-06-07

Similar Documents

Publication Publication Date Title
US9509334B2 (en) Non-transitory computer-readable recording medium, compression method, decompression method, compression device and decompression device
CN107577436B (zh) 一种数据存储方法及装置
CN107305586B (zh) 索引生成方法、索引生成装置及搜索方法
CN104657362A (zh) 数据存储、查询方法和装置
CN105009067A (zh) 管理对存储数据单元的操作
CN107729406B (zh) 一种数据分类存储方法及装置
CN105027071A (zh) 管理对存储数据单元的操作
CN110413711B (zh) 一种差异数据获取方法及其存储介质
JPWO2014147671A1 (ja) 圧縮装置、圧縮方法、伸張装置、伸張方法および情報処理システム
Li et al. Database management strategy and recovery methods of Android
US9397696B2 (en) Compression method, compression device, and computer-readable recording medium
JP6032292B2 (ja) 圧縮プログラム、圧縮装置、伸張プログラムおよび伸張装置
CN109271463A (zh) 一种恢复MySQL数据库的innodb压缩数据的方法
CN105009068A (zh) 管理对存储数据单元的操作
US9479195B2 (en) Non-transitory computer-readable recording medium, compression method, decompression method, compression device, and decompression device
US9219497B2 (en) Compression device, compression method, and recording medium
JPWO2014097353A1 (ja) 圧縮装置、圧縮方法、圧縮プログラム、伸張装置、伸張方法、伸張プログラム、および圧縮伸張システム
CN111078652A (zh) 物流箱码的归档压缩方法及装置
US9496895B2 (en) Compression method and decompression method
CN109271209A (zh) 一种解析并提取qcow2及qcow3镜像文件的方法
JPH10261969A (ja) データ圧縮方法および装置
US20150193462A1 (en) Control method and control device
CN112579546B (zh) 文件压缩方法、系统、存储介质及终端
CN108776578A (zh) 一种快速合并对象的方法和系统
JP5595957B2 (ja) アクセスログ処理システム及び方法及びプログラム、アクセスログ格納検索装置

Legal Events

Date Code Title Description
PB01 Publication
PB01 Publication
SE01 Entry into force of request for substantive examination
SE01 Entry into force of request for substantive examination
GR01 Patent grant
GR01 Patent grant