CN109271463A - 一种恢复MySQL数据库的innodb压缩数据的方法 - Google Patents
一种恢复MySQL数据库的innodb压缩数据的方法 Download PDFInfo
- 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
Links
Classifications
-
- Y—GENERAL 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
- Y02—TECHNOLOGIES OR APPLICATIONS FOR MITIGATION OR ADAPTATION AGAINST CLIMATE CHANGE
- Y02D—CLIMATE 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/00—Energy 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默认的使用引擎,在存放大量数据之后,数据文件膨胀,消耗大量的空间资源。此时,绝大多数用户会选择对表数据进行压缩处理。压缩处理解决了空间消耗问题,同时又引出了压缩数据恢复的问题。在数据库文件正常的情况下,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:压缩数据的页结构
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压缩数据。
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)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN113282592A (zh) * | 2021-07-22 | 2021-08-20 | 成都云祺科技有限公司 | 对mssql数据库进行恢复的方法、系统及存储介质 |
Citations (8)
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数据库全库的恢复方法 |
-
2018
- 2018-11-30 CN CN201811453262.8A patent/CN109271463B/zh active Active
Patent Citations (8)
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)
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)
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 |