[ibd2sql] ibd2sql v1.0 发布

2024年 1月 10日 98.5k 0

介绍

ibd2sql 可以提取innodb ibd文件的元数据信息, 并拼接为 DDL , 还可以根据元数据信息解析ibd文件中的数据insert/replace SQL语句.

仅支持mysql 8.0 .

功能特点

  1. 提取DDL
  2. 提取SQL为insert/replace语句
  3. 提取标记为delete的数据
  4. 根据条件过滤相关数据行
  5. 可使用DEBUG来查看解析过程
  6. 无第三方依赖包, 纯python3代码写的.
  7. 支持分区表,前缀索引等

下载和使用方法

下载

源码下载:

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

相关文章

Oracle如何使用授予和撤销权限的语法和示例
Awesome Project: 探索 MatrixOrigin 云原生分布式数据库
下载丨66页PDF,云和恩墨技术通讯(2024年7月刊)
社区版oceanbase安装
Oracle 导出CSV工具-sqluldr2
ETL数据集成丨快速将MySQL数据迁移至Doris数据库

发布评论