前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >MySQL 灾难恢复利器:ibd2sql

MySQL 灾难恢复利器:ibd2sql

作者头像
DBA实战
发布2024-10-10 19:26:55
发布2024-10-10 19:26:55
18400
代码可运行
举报
文章被收录于专栏:DBA实战DBA实战
运行总次数:0
代码可运行

简介

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 文件可能较大,需要足够的磁盘空间和内存。

参数说明

代码语言:javascript
代码运行次数:0
运行
复制
--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

代码语言:javascript
代码运行次数:0
运行
复制
tar xvf Python-3.6.1.tgz
cd Python-3.6.1
mkdir -p /usr/local/python3
./configure --prefix=/usr/local/python3
make && make install
ln -s /usr/local/python3/bin/python3 /usr/bin/python3

安装ibd2sql

代码语言:javascript
代码运行次数:0
运行
复制
[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文件

代码语言:javascript
代码运行次数:0
运行
复制
[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

使用示例

代码语言:javascript
代码运行次数:0
运行
复制
##仅打印被标记为已删除的数据
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 是一个值得推荐的工具,特别适合数据恢复、迁移和审计等任务。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA实战 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档