MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布

目录

MySQL恢复的难点

本文研究范围

MySQL InnoDB引擎存储结构分析

MySQL数据碎片抽取代码实现

MySQL数据碎片恢复实践


MySQL恢复的难点

MySQL一旦出现误删除(drop整个库、delete表truncate 表、清空表)、误覆盖(老备份恢复新数据)、勒索病毒恶意破坏等,如果没有定期备份,而binlog通常会7天循环删除,从而导致数据难以恢复。


本文研究范围

MySQL常用的存储引擎为MyISAM和InnoDB,对应的存储文件后缀名分别是.MYD和.IBD。MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM)。

本文主要讨论在InnoDB引擎下,不依赖binlog,直接从磁盘扇区或残缺ibd文件中恢复MySQL数据。


MySQL InnoDB引擎存储结构分析

表空间层级结构为:

一个MySQL系统中,可创建多个数据库实例,对应为data目录下以数据库名命名的目录

多个Tablespace组成一个数据库实例

多个Segment组成一个Tablespace

多个Extent组成一个Segment

多个Page组成一个Extent

多行Row组成一个Page

一行数据的所有Field组成一行Row,

如下图所示:

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布

我们可以从page这个级别尝试恢复数据,page的结构如下图:

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布


MySQL数据碎片抽取代码实现

根据IBD文件结构,我们构建了抽取IBD碎片页的代码,核心代码如下:

打开源文件代码:仅申请了READ权限,以确保对源文件是只读访问,杜绝二次破坏!

 

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布

主体功能实现类:此类实现了从源路径中搜索所有碎片,以及输出碎片到本地文件。

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布

主函数调用代码:

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布


MySQL数据碎片恢复实践

  1. 将DATAUNIT_MySQL_INNODB_PAGE_RESTORE.exe工具放在有足够可用空间的目录下。如果需要从某分区中搜索碎片,如D盘,则一定不能将工具放在D盘,切记!
  2. 运行DATAUNIT_MySQL_INNODB_PAGE_RESTORE.exe工具,如果提示缺少dll,请安装vc_redist.2015x64.exe
  3. 支持以下4种数据源:
  • 裸磁盘(整个磁盘):直接输入磁盘序号,如下图,以管理员权限运行工具,输入数字2,则扫描磁盘2。注意windows的磁盘从0开始编号

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布

  • 分区:以管理员身份运行工具,输入盘符,如D

  • 镜像文件(裸磁盘或分区的镜像文件,支持任意文件系统,如ext3、ext4、XFS、NTFS、VMFS5、VMFS6、vmdk、VHD文件,等等):用鼠标,直接将文件拖入cmd窗口即可
  • 残缺的ibd文件:用鼠标,直接将文件拖入cmd窗口即可

注意本工具不支持加密的文件、加密的分区、压缩包。

 

按下回车开始扫描,工具自动输出搜索中找到的碎片及碎片中记录的数量,并同步输出到工具目录下:

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布

 

用WinHex打开所有ibd,然后搜索需要恢复的表的关键字符串,比如某个电话号码 :

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布

在工具中导入ibd和表结构,即可解析出所有数据行,不再赘述。

MySQL数据库 碎片抽取 / 数据页恢复 定制工具发布

免费版会加密一部分数据,并且将所有找到的数据放在sql_page.bin中,如需要进一步恢复,请将sql_page.bin压缩打包后,发送到作者的邮箱,紧急情况可联系作者QQ,工作时间2小时内反馈解析。


 

工具下载:

MySQL_INNODB_PAGE_RESTORE下载链接:

https://pan.baidu.com/s/1MScdCZPMF6eXO0VVCgBDrw

提取码: i1ag