介绍
ibd2sql 可以提取innodb ibd文件的元数据信息, 并拼接为 DDL , 还可以根据元数据信息解析ibd文件中的数据insert/replace SQL语句.
仅支持mysql 8.0 .
功能特点
- 提取DDL
- 提取SQL为insert/replace语句
- 提取标记为delete的数据
- 根据条件过滤相关数据行
- 可使用DEBUG来查看解析过程
- 无第三方依赖包, 纯python3代码写的.
- 支持分区表,前缀索引等
下载和使用方法
下载
源码下载:
下载
源码下载:
wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip
二进制下载:
github : https://github.com/ddcw/ibd2sql/releases
ibd2sql 是纯python3代码写的, 无任何第三方依赖, 建议使用源码.
项目地址: https://github.com/ddcw/ibd2sql
二进制下载地址: linux : https://github.com/ddcw/ibd2sql/releases/download/v1.0/ibd2sql_v1.0_linux_x86_64.tar.gz
二进制下载地址: win: https://github.com/ddcw/ibd2sql/releases/download/v1.0/ibd2sql_v1.0_win_x86_64.zip
某盘:https://pan.baidu.com/s/1IP5ZDXIOMwlzW6QTp0b_UA提取码: ddcw
使用
由于无第三方依赖包, 建议使用源码
SHELL> python3 main.py --help
usage: main.py [-h] [--version] [--ddl] [--sql] [--delete] [--complete-insert]
[--force] [--set] [--multi-value] [--replace]
[--table TABLE_NAME] [--schema SCHEMA_NAME]
[--sdi-table SDI_TABLE] [--where-trx WHERE_TRX]
[--where-rollptr WHERE_ROLLPTR] [--where WHERE] [--limit LIMIT]
[--debug] [--debug-file DEBUG_FILE] [--page-min PAGE_MIN]
[--page-max PAGE_MAX] [--page-start PAGE_START]
[--page-count PAGE_COUNT] [--page-skip PAGE_SKIP]
[--parallel PARALLEL]
FILENAME
解析mysql8.0的ibd文件 https://github.com/ddcw/ibd2sql
positional arguments:
FILENAME ibd filename
optional arguments:
-h, --help show this help message and exit
--version, -v, -V show version
--ddl, -d print ddl
--sql print data by sql
--delete print data only for flag of deleted
--complete-insert use complete insert statements for sql
--force, -f force pasrser file when Error Page
--set set/enum to fill in actual data instead of strings
--multi-value single sql if data belong to one page
--replace "REPLACE INTO" replace to "INSERT INTO" (default)
--table TABLE_NAME replace table name except ddl
--schema SCHEMA_NAME replace table name except ddl
--sdi-table SDI_TABLE
read SDI PAGE from this file(ibd)(partition table)
--where-trx WHERE_TRX
default (0,281474976710656)
--where-rollptr WHERE_ROLLPTR
default (0,72057594037927936)
--where WHERE filter data(TODO)
--limit LIMIT limit rows
--debug, -D will DEBUG (it's too big)
--debug-file DEBUG_FILE
default sys.stdout if DEBUG
--page-min PAGE_MIN if PAGE NO less than it, will break
--page-max PAGE_MAX if PAGE NO great than it, will break
--page-start PAGE_START
INDEX PAGE START NO
--page-count PAGE_COUNT
page count NO
--page-skip PAGE_SKIP
skip some pages when start parse index page
--parallel PARALLEL, -p PARALLEL
parse to data/sql with N threads.(default 4) TODO
使用例子
提取DDL
说明: DDL不包含row_format
SHELL> python main.py /data/mysql_3314/mysqldata/ibd2sql/t20240102_js.ibd --ddl
CREATE TABLE IF NOT EXISTS `ibd2sql`.`t20240102_js`(
`id` int NOT NULL,
`name` varchar(200) NULL,
`aa` json NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;
提取SQL
如果有溢出页, 就将溢出页字段置为Null
binary类型默认为 base64
SHELL> python main.py /data/mysql_3314/mysqldata/ibd2sql/AllTypesExample.ibd --sql
REPLACE INTO `ibd2sql`.`AllTypesExample` VALUES (3, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, '2000-2-29', '2000-2-29 0:0:0', '2023-8-30 14:32:35.', '0:0:0', 2001, '00000', 'Zero', 0x3030303030, '00000', 0, C, X,Z, '{"AA": {"BB": true, "CC": [{"dd": null}]}}');
提取被标记为deleted的行
SHELL> python main.py /data/mysql_3314/mysqldata/ibd2sql/AllTypesExample.ibd --sql --delete --complete
REPLACE INTO `ibd2sql`.`AllTypesExample`(`id`,`int_col`,`tinyint_col`,`smallint_col`,`mediumint_col`,`bigint_col`,`float_col`,`double_col`,`decimal_col`,`date_col`,`datetime_col`,`timestamp_col`,`time_col`,`year_col`,`char_col`,`varchar_col`,`binary_col`,`varbinary_col`,`bit_col`,`enum_col`,`set_col`,`josn_type`) VALUES (4, 0, 0, 0, 0, 0, 0.0, 0.0, 0.0, '2000-2-29', '2000-2-29 0:0:0', '2023-8-30 14:32:35.', '0:0:0', 2001, '00000', 'Zero', 0x3030303030, '00000', 0, 'C', 'X,Z', '{"AA": {"BB": true, "CC": [{"dd": null}]}}');
解析分区表
要使用–sdi-table指定元数据信息所在的第一个分区
SHELL> python main.py /data/mysql_3314/mysqldata/ibd2sql/t20240105_hash#p#p2.ibd --sdi-table /data/mysql_3314/mysqldata/ibd2sql/t20240105_hash#p#p0.ibd --sql --ddl
CREATE TABLE IF NOT EXISTS `ibd2sql`.`t20240105_hash`(
`id` int NULL,
`name` varchar(20) NULL,
`bt` date NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
/*!50100 PARTITION BY HASH (year(`bt`))
PARTITIONS 4 */;
INSERT INTO `ibd2sql`.`t20240105_hash` VALUES (1, 'aa', '1998-1-1');
支持内容
表属性
对象 | 是否支持 | 描述 |
---|---|---|
存储引擎 | 支持 | 仅支持innodb |
字符集 | 支持 | |
排序规则 | 支持 | |
分区表(仅一级分区) | 支持 | |
表和schema名字替换 | 支持 | |
注释 | 支持 | |
row_format | 不支持 | only DYNAMIC or COMPACT |
字段属性
对象 | 是否支持 | 描述 |
---|---|---|
是否为空 | 支持 | |
虚拟列 | 支持 | 虚拟列不参与行解析 |
默认值 | 支持 | |
自增 | 支持 | |
注释 | 支持 | |
符号 | 支持 | 数字类型存在符号 |
索引相关
对象 | 是否支持 | 描述 |
---|---|---|
主键索引 | 支持 | |
唯一索引 | 支持 | |
普通索引 | 支持 | |
虚拟列的索引 | 支持 | |
前缀索引 | 支持 | 前缀索引KEY数据不完整. |
复合索引 | 支持 |
数据类型
基本上除了空间类型外, 都支持, 但对于blob等大对象, 仅支持非溢出页的情况
参考:https://dev.mysql.com/doc/refman/8.0/en/storage-requirements.html
数据类型
整型均支持符号, 第一bit位为符号位(如果有符号的话) 取值方式为:
_t 是数据
_s 是字节数
(_t&((1