目录
MySQL恢复的难点
本文研究范围
MySQL InnoDB引擎存储结构分析
MySQL数据碎片抽取代码实现
MySQL数据碎片恢复实践
MySQL一旦出现误删除(drop整个库、delete表、truncate 表、清空表)、误覆盖(老备份恢复新数据)、勒索病毒恶意破坏等,如PLEASE_READ_ME_VVV病毒,一般用文件级恢复工具(比如DiskGen、UFS Explorer等)都无法恢复较大的表空间,这是因为对大于4MB的文件,不管是在Linux内核还是Windows内核,都很容易被新的文件覆盖。
而特别对于数据库,因为表空间的缓慢增长的,这列导致其数据块在磁盘上呈离散碎片化分布,用常规文件方案,不可能完整恢复。
MySQL常用的存储引擎为MyISAM和InnoDB,对应的存储文件后缀名分别是.MYD和.IBD。MySQL5.5版本开始Innodb已经成为Mysql的默认引擎(之前是MyISAM)。
本文主要讨论在InnoDB引擎下,不依赖文件系统,直接从磁盘扇区中,抽取恢复MySQL数据行碎片的技术方案及工具实现。
表空间层级结构为:
一个MySQL系统中,可创建多个数据库实例,对应为data目录下以数据库名命名的目录
多个Tablespace组成一个数据库实例
多个Segment组成一个Tablespace
多个Extent组成一个Segment
多个Page组成一个Extent
多行Row组成一个Page
一行数据的所有Field组成一行Row,
如下图所示:
根据MySQL IBD文件结构,我们构建了智能分析IBD碎片页的代码,核心代码如下:
打开源文件代码:仅申请了READ权限,以确保对源文件是只读访问,杜绝二次破坏!
主体功能实现类:此类实现了从源路径中搜索所有SQL碎片,以及输出SQL碎片到本地文件,并且最后自动将碎片文件转化为INSERT INTO 语句,以便可以导入到生产数据库中:
裸磁盘(整个磁盘):直接输入磁盘序号,如下图,以管理员权限运行工具,输入数字2,则扫描磁盘2。注意windows的磁盘从0开始编号
分区:以管理员身份运行工具,输入盘符,如D
注意本工具不支持加密的文件、加密的分区、压缩包。
按下回车开始扫描,工具自动输出搜索中找到的碎片及碎片中记录的数量,并同步输出到PAGE_FILE目录下:
免费版会将所有数据碎片保存在PAGE_FILE/page.bin,frm碎片保存在PAGE_FILE/frm.bin,以及恢复日志保存在PAGE_FILE/search.log中,如需要进一步恢复,请将以上3个文件压缩打包后,发送到作者的邮箱,紧急情况可联系作者QQ:568229095,工作时间8小时内反馈初步结论。
更新记录:
2020-1-6:
1、支持从裸磁盘、分区、文件中搜索所有IBD page碎片
2、修复打开磁盘、分区提示被占用的问题
3、工具运行自动创建工作目录,ibd和日志文件输出到工作目录
4、优化显示提示信息
2020-2-28:
1、全新的日志输出对象
2、支持指定源文件的起止搜索范围
3、支持跳过磁盘错误
4、修复磁盘大小获取不正确的bug
5、修复逻辑卷大小获取不正确的bug
2020-03-2 :
1、支持识别ibdata1的page
2、完善输出日志,搜索完成后输出所有表的page数和record数
3、修复磁盘故障时不会返回的bug
2020-03-10:
1、修复磁盘异常时会循环读一处位置的bug
2、支持搜索zip文件
3、支持搜索frm文件
4、默认单文件输出
2020-03-16:
1、可单独指定搜索zip/frm
DATAUNIT_MYSQL_RESTORE v2.3.1 ( 2020-03-19 ,by data-unit.com )
1、可指定搜索输出的缓冲区大小,默认100MB
DATAUNIT_MYSQL_RESTORE v3.0 ( 2020-04-14 ,by data-unit.com )
1、支持共享表空间恢复
DATAUNIT_MYSQL_RESTORE_v4.0 (2020-05-26 ,by data-unit.com)
1、支持解析完整表名,并输出到日志文件
2、完善ibd文件头结构FILE_HEADER
下载链接:
链接:https://pan.baidu.com/s/1BzixbsZYplC-M1eSrSw7Ag
提取码:9ibf
温馨提示:如重要数据丢失,建议在行动前咨询专业工程师,以免数据遭到二次破坏。
恢复支持:https://item.taobao.com/item.htm?id=577090061943
官方网站:http://www.data-unit.com/