简介
ibd2sql 是一个使用纯 Python 3 编写的工具,用于离线解析 MySQL InnoDB 存储引擎的 IBD 文件,并将其转换为 SQL 语句。该工具无需任何第三方依赖包,使用 GPL-3.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
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
[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 是一个值得推荐的工具,特别适合数据恢复、迁移和审计等任务。