MySQL 灾难恢复利器:ibd2sql

 https://github.com/ddcw/ibd2sql

 

目录

1. 简介

2. 优缺点

3. 参数详解

4. 环境依赖

5. 安装

6. 解析ibd文件

7. 使用示例

8. 总结

 

简介ibd2sql 是一个使用纯 Python 3 编写的工具,用于离线解析 MySQL InnoDB 存储引擎的 IBD 文件,并将其转换为 SQL 语句。该工具无需任何第三方依赖包,使用 GPL-3.0 许可证发布。优点
  1. 方便: 提取表的 DDL(数据定义语言)。
  2. 实用: 支持替换库名(--schema)和表名(--table),可以在 SQL 语句中输出完整的字段(--complete)。
  3. 简单: 纯 Python 3 代码编写,无依赖包。
  4. 支持众多数据类型: 支持所有 MySQL 数据类型。
  5. 支持复杂的表结构: 支持分区表、注释、主键、外键、约束、自增、普通索引、前缀索引、主键前缀索引、唯一索引、复合索引、默认值、符号、虚拟字段、INSTANT、无主键等情况的表。
  6. 数据误删恢复: 可以输出被标记为已删除的数据。
  7. 安全: 离线解析 IBD 文件,仅需读取权限。
  8. IBD文件强制解析:IBD文件如果损坏,可以恢复部分数据。
  9. 支持范围广: 支持 MySQL 5.6、5.7、8.0、8.4、9.0。
缺点
  1. 性能: 对于大型表,解析和生成 SQL 语句的过程可能较慢。
  2. 数据完整性: 如果 IBD 文件本身已经严重损坏,恢复的数据可能不完整。
  3. 资源消耗: 生成的 SQL 文件可能较大,需要足够的磁盘空间和内存。
参数说明
--version, -v, -V: 显示版本信息。--ddl, -d: 打印 DDL。--sql: 打印数据的 SQL 语句。--delete: 仅打印被标记为已删除的数据。--complete-insert: 使用完整的插入语句。--force, -f: 在遇到错误页面时强制解析文件。--set: 用实际数据填充 set/enum 而不是字符串。--multi-value: 如果数据属于同一页面,则使用单个 SQL 语句。--replace: 使用 "REPLACE INTO" 替换 "INSERT INTO"(默认)。--table TABLE_NAME: 替换表名(不包括 DDL)。--schema SCHEMA_NAME: 替换库名(不包括 DDL)。--sdi-table SDI_TABLE: 从这个 IBD 文件(分区表)读取 SDI 页面。--where-trx WHERE_TRX: 事务过滤范围,默认 (0,281474976710656)。--where-rollptr WHERE_ROLLPTR: 回滚指针过滤范围,默认 (0,72057594037927936)。--limit LIMIT: 限制行数。--debug, -D: 调试模式(输出非常大)。--debug-file DEBUG_FILE: 调试输出文件,默认为 sys.stdout。--page-min PAGE_MIN: 如果页面编号小于此值,则终止。--page-max PAGE_MAX: 如果页面编号大于此值,则终止。--page-start PAGE_START: 索引页面起始编号。--page-count PAGE_COUNT: 页面计数编号。--page-skip PAGE_SKIP: 解析索引页面时跳过某些页面。--mysql5: 适用于 MySQL 5.7 标志。
环境依赖python3
tar xvf Python-3.6.1.tgzcd Python-3.6.1mkdir -p /usr/local/python3./configure --prefix=/usr/local/python3make && make installln -s /usr/local/python3/bin/python3 /usr/bin/python3
安装ibd2sql
[root@idc opt]# wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip[root@idc opt]# unzip main.zip[root@idc opt]# cd ibd2sql-main
解析ibd文件
[root@idc ibd2sql-main]# cp /jesong/mysql/qaqdb/inner_announcement.ibd  /opt/ibd2sql-main/[[root@idc-mongo55 ibd2sql-main]# python3 main.py ./inner_announcement.ibd --sql --ddlCREATE TABLE IF NOT EXISTS `qaqdb`.`inner_announcement`(    `id` int NOT NULL AUTO_INCREMENT COMMENT 'id',    `title` varchar(50) NULL COMMENT '公告',    `create_author` varchar(20) NULL COMMENT '发布人/创建人user_id',    `state` tinyint(1) NOT NULL COMMENT '状态',    `release_time` datetime NULL COMMENT '时间',    `column_id` int NULL COMMENT '所属栏目',    `receive_type` tinyint(1) NOT NULL COMMENT '接收人员类别',    `create_date` datetime NULL COMMENT '创建时间',    `detail` text NULL COMMENT '公告详情',    `update_date` datetime NULL COMMENT '修改时间',    `update_author` varchar(20) NULL COMMENT '修改人id',    `exist` tinyint(1) NOT NULL COMMENT '是否存在',    `query_condition` text NULL COMMENT '条件',    `img_url` varchar(500) NULL COMMENT '地址',    PRIMARY KEY  (`id` )) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;INSERT INTO `qaqdb`.`inner_announcement` VALUES (1, '测试通知', '125', 3, '2020-10-30 15:34:40', 1, 1, '2020-10-30 15:34:40', '<p>尊敬的用户:</p><p>   以下为测试信息。</p>', NULL, NULL, 1, '10793', 'https://oss.oss.aliyuncs.com/ss/prod/his/download/2021/02/25/9167f8b74352955fcb51bb374f93013e.jpg');INSERT INTO `qaqdb`.`inner_announcement` VALUES (5, '测试通知', '125', 3, '2020-10-30 15:34:40', 1, 1, '2020-10-30 15:34:40', '<p>尊敬的用户:</p><p>   以下为测试信息。</p>', NULL, NULL, 1, '10793', 'https://oss.oss.aliyuncs.com/ss/prod/his/download/2021/02/25/9167f8b74352955fcb51bb374f93013e.jpg');INSERT INTO `qaqdb`.`inner_announcement` VALUES (6, '测试通知', '125', 3, '2020-10-30 15:34:40', 1, 1, '2020-10-30 15:34:40', '<p>尊敬的用户:</p><p>   以下为测试信息。</p>', NULL, NULL, 1, '10793', 'https://oss.oss.aliyuncs.com/ss/prod/his/download/2021/02/25/9167f8b74352955fcb51bb374f93013e.jpg');# or use redirection to save data[[root@idc ibd2sql-main]# python3 main.py ./inner_announcement.ibd --sql --ddl >inner_announcement.sql
使用示例
##仅打印被标记为已删除的数据python3 main.py /jesong/mysql/qaqdb/el_inner_announcement.ibd --sql --ddl --delete##使用完整的插入语句python3 main.py /jesong/mysql/qaqdb/el_inner_announcement.ibd --sql --ddl --delete --complete-insert##在遇到错误页面时强制解析文件python3 main.py /jesong/mysql/qaqdb/el_inner_announcement.ibd --sql --ddl --force##替换表名python3 main.py /jesong/mysql/qaqdb/el_inner_announcement.ibd --sql --ddl --complete-insert --table xxbox##数据属于同一页面,则使用单个 SQL 语句(合并insert)python3 main.py /jesong/mysql/qaqdb/el_inner_announcement.ibd --sql --ddl --complete-insert --table xxbox --multi-value
总结ibd2sql 是一个强大的工具,适用于多种 MySQL 数据管理和恢复场景。它的无依赖包、广泛支持的 MySQL 版本和灵活的输出选项使其成为处理 IBD 文件的有力工具。然而,对于大型表和严重损坏的 IBD 文件,使用时需要注意性能和数据完整性问题。总体来说,ibd2sql 是一个值得推荐的工具,特别适合数据恢复、迁移和审计等任务。
posted @ 2024-10-11 12:42  技术颜良  阅读(97)  评论(0编辑  收藏  举报