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,
如下图所示:
我们可以从page这个级别尝试恢复数据,page的结构如下图:
MySQL数据碎片抽取代码实现
根据IBD文件结构,我们构建了抽取IBD碎片页的代码,核心代码如下:
打开源文件代码:仅申请了READ权限,以确保对源文件是只读访问,杜绝二次破坏!
主体功能实现类:此类实现了从源路径中搜索所有碎片,以及输出碎片到本地文件。
主函数调用代码:
MySQL数据碎片恢复实践
- 将DATAUNIT_MySQL_INNODB_PAGE_RESTORE.exe工具放在有足够可用空间的目录下。如果需要从某分区中搜索碎片,如D盘,则一定不能将工具放在D盘,切记!
- 运行DATAUNIT_MySQL_INNODB_PAGE_RESTORE.exe工具,如果提示缺少dll,请安装vc_redist.2015x64.exe
- 支持以下4种数据源:
-
裸磁盘(整个磁盘):直接输入磁盘序号,如下图,以管理员权限运行工具,输入数字2,则扫描磁盘2。注意windows的磁盘从0开始编号
-
分区:以管理员身份运行工具,输入盘符,如D
- 镜像文件(裸磁盘或分区的镜像文件,支持任意文件系统,如ext3、ext4、XFS、NTFS、VMFS5、VMFS6、vmdk、VHD文件,等等):用鼠标,直接将文件拖入cmd窗口即可
- 残缺的ibd文件:用鼠标,直接将文件拖入cmd窗口即可
注意本工具不支持加密的文件、加密的分区、压缩包。
按下回车开始扫描,工具自动输出搜索中找到的碎片及碎片中记录的数量,并同步输出到工具目录下:
用WinHex打开所有ibd,然后搜索需要恢复的表的关键字符串,比如某个电话号码 :
在工具中导入ibd和表结构,即可解析出所有数据行,不再赘述。
免费版会加密一部分数据,并且将所有找到的数据放在sql_page.bin中,如需要进一步恢复,请将sql_page.bin压缩打包后,发送到作者的邮箱,紧急情况可联系作者QQ,工作时间2小时内反馈解析。
工具下载:
MySQL_INNODB_PAGE_RESTORE下载链接:
https://pan.baidu.com/s/1MScdCZPMF6eXO0VVCgBDrw
提取码: i1ag