Skip to content

Commit

Permalink
v1.2
Browse files Browse the repository at this point in the history
  • Loading branch information
ddcw committed Apr 25, 2024
1 parent fbafa1b commit e1814c0
Showing 1 changed file with 34 additions and 118 deletions.
152 changes: 34 additions & 118 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -18,40 +18,17 @@
2. **实用**: 可替换库(--schema)/表(--table)名, 可在sql语句中输出完整的字段(--complete)
3. **简单**: 纯python3代码编写, **无依赖包**. 还可以使用**--debug**查看解析过程
4. **选择性强**: 可以根据条件过滤符合要求的数据 --where , --limit
5. **支持众多数据类型**: 支持**所有mysql数据类型** (比如 int, decimal, date, varchar, char, **json**, binary, enum, set, blob/text, longblob等).
5. **支持众多数据类型**: 支持**所有mysql数据类型** (比如 int, decimal, date, varchar, char, **json**, binary, enum, set, blob/text, longblob,空间坐标等).
6. **支持复杂的表结构**: 分区表, 注释, 主键, 外键, 约束, 自增, 普通索引, 前缀索引, 主键前缀索引, 唯一索引, 复合索引, 默认值, 符号, 虚拟字段, INSTANT, 无主键等情况的表
7. **数据误删恢复**: 可以输出被标记为deleted的数据
8. **安全**: 离线解析ibd文件, 仅可读权限即可



# 安装下载

## Linux 环境下载

```
wget https://codeload.github.com/ddcw/ibd2sql/zip/refs/heads/main
```

或者

```
wget https://github.com/ddcw/ibd2sql/releases/download/v1.0/ibd2sql_v1.0_linux_x86_64.tar.gz
```


最新版: [https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip](https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip)

## windows 环境下载

https://codeload.github.com/ddcw/ibd2sql/zip/refs/heads/main

或者

https://github.com/ddcw/ibd2sql/releases/download/v1.0/ibd2sql_v1.0_win_x86_64.zip

或者

某盘:[https://pan.baidu.com/s/1IP5ZDXIOMwlzW6QTp0b_UA](https://cloud.tencent.com/developer/tools/blog-entry?target=https%3A%2F%2Fpan.baidu.com%2Fs%2F1IP5ZDXIOMwlzW6QTp0b_UA&source=article&objectId=2377921)提取码: ddcw
次新版: [https://github.com/ddcw/ibd2sql/archive/refs/tags/v1.2.tar.gz](https://github.com/ddcw/ibd2sql/archive/refs/tags/v1.2.tar.gz)



Expand All @@ -60,12 +37,11 @@ https://github.com/ddcw/ibd2sql/releases/download/v1.0/ibd2sql_v1.0_win_x86_64.z
可使用 `python3 main.py -h` 查看帮助信息

```shell
SHELL> python3 main.py -h
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]
SHELL>python3 main.py -h
usage: main.py [--help] [--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] [--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]
[FILENAME]

解析mysql8.0的ibd文件 https://github.com/ddcw/ibd2sql
Expand All @@ -74,7 +50,7 @@ positional arguments:
FILENAME ibd filename

options:
-h, --help show this help message and exit
--help, -h show help
--version, -v, -V show version
--ddl, -d print ddl
--sql print data by sql
Expand All @@ -92,7 +68,6 @@ options:
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
Expand All @@ -105,73 +80,30 @@ options:
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
Example:
ibd2sql /data/db1/xxx.ibd --ddl --sql
ibd2sql /data/db1/xxx.ibd --delete --sql
ibd2sql /data/db1/xxx#p#p1.ibd --sdi-table /data/db1/xxx#p#p0.ibd --delete --sql
```
## 提取DDL
## 提取建表语句 DDL
--ddl 提取ddl
**--ddl**
```shell
SHELL> python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_alltype_table.ibd --ddl
CREATE TABLE IF NOT EXISTS `ibd2sql`.`ddcw_alltype_table`(
`id` int NOT NULL AUTO_INCREMENT,
`int_col` int NULL,
`tinyint_col` tinyint NULL DEFAULT '1',
`smallint_col` smallint NULL,
`mediumint_col` mediumint NULL,
`bigint_col` bigint NULL,
`float_col` float NULL,
`double_col` double NULL,
`decimal_col` decimal(10,2) NULL,
`date_col` date NULL,
`datetime_col` datetime NULL,
`timestamp_col` timestamp NULL,
`time_col` time NULL,
`year_col` year NULL,
`char_col` char(100) NULL,
`varchar_col` varchar(100) NULL,
`binary_col` binary(10) NULL,
`varbinary_col` varbinary(20) NULL,
`bit_col` bit(4) NULL,
`enum_col` enum('A','B','C') NULL,
`set_col` set('X','Y','Z') NULL,
`josn_type` json NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;
python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_alltype_table.ibd --ddl
```
```shell
SHELL> python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_blob7.ibd
CREATE TABLE IF NOT EXISTS `ibd2sql`.`ddcw_blob7`(
`id` int NULL,
`c_lb` longblob NULL,
`c_lt` longtext NULL,
`c_ml` mediumblob NULL,
`c_mb` mediumtext NULL,
`c_t` text NULL,
`c_b` blob NULL,
`c_tb` tinyblob NULL,
`c_tt` tinytext NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;
```
## 提取为SQL
## 提取数据 DML/INSERT
--sql
**--sql**
```shell
SHELL> python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_alltype_table.ibd --sql --limit 1
INSERT INTO `ibd2sql`.`ddcw_alltype_table` VALUES (2, 5267711, 89, -3652, 5951, 7237, 703.0, 7002.0, 3127.0, '2009-3-23', '2013-7-15 2:17:10', '1997-4-4 21:22:22.', '22:57:11', 2004, 'HucLseQCOUgEvXuBrDoOGcKvWaNRYSbDmQRQJVlYqZeEoPIcLlxUqwFHcgPMMqBBPLteFZluWLQGpKCcUjnzFubtVjI', 'lpRwpchqJAlQtiVfWFvtNyRVijXcEkYwGXkQRcBlIGlohXSiFFMyhdVFwmLgMQIYYhRvbBkdgWwSBtbo', 0x36390000000000000000, '30', 1, 'B', 'Y', '{"aa": "c", "bb": {"dd": 1}}');
python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_alltype_table.ibd --sql
```
binary数据会被转为 base64
Expand All @@ -180,56 +112,38 @@ set/enum会被替换为实际值(v0.3版本是使用数字表示)
## 提取误删数据 (被标记为delete的数据)
## 提取被标记为deleted的数据行
--delete
**--sql --delete**
```shell
SHELL> python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_alltype_table.ibd --sql --delete
INSERT INTO `ibd2sql`.`ddcw_alltype_table` VALUES (1, 2501406, 42, -167, -166, 4487, 5219.0, 1929.0, -6618.0, '2008-9-14', '2013-5-24 10:53:43', '2006-2-15 16:6:35.', '19:8:27', 2003, 'bczTYGympcbqhuMPLpxNtkyMawChejIBhatxsGmdqLUOPnuYhjvMSowMoXGnJ', 'vNBkvaPWq', 0x36380000000000000000, '60', 1, 'B', 'X', '{"aa": "c", "bb": {"dd": 1}}');
```
## 提取分区表数据
## 提取分区表的数据
--sdi-table xxx#p0.ibd
**--sdi-table xxx#p0.ibd**
```shell
SHELL> python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_partition_hash#p#p3.ibd --sdi-table /data/mysql_3314/mysqldata/ibd2sql/ddcw_partition_hash#p#p0.ibd --sql --limit 1
INSERT INTO `ibd2sql`.`ddcw_partition_hash` VALUES (3, 'gDVcQkNrvazHbXwZuSPIcPbgZhdUoqxXgCEyoaadhhZOnwYm', '2007-4-24 8:23:16');
SHELL> python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_partition_hash#p#p3.ibd --sdi-table /data/mysql_3314/mysqldata/ibd2sql/ddcw_partition_hash#p#p0.ibd --sql
```
## 完整字段信息
--complete
**--complete**
```shell
SHELL> python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_alltype_table.ibd --sql --limit 1 --complete --limit 2
INSERT INTO `ibd2sql`.`ddcw_alltype_table`(`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 (2, 5267711, 89, -3652, 5951, 7237, 703.0, 7002.0, 3127.0, '2009-3-23', '2013-7-15 2:17:10', '1997-4-4 21:22:22.', '22:57:11', 2004, 'HucLseQCOUgEvXuBrDoOGcKvWaNRYSbDmQRQJVlYqZeEoPIcLlxUqwFHcgPMMqBBPLteFZluWLQGpKCcUjnzFubtVjI', 'lpRwpchqJAlQtiVfWFvtNyRVijXcEkYwGXkQRcBlIGlohXSiFFMyhdVFwmLgMQIYYhRvbBkdgWwSBtbo', 0x36390000000000000000, '30', 1, 'B', 'Y', '{"aa": "c", "bb": {"dd": 1}}');
INSERT INTO `ibd2sql`.`ddcw_alltype_table`(`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 (3, 5232618, 125, -1229, 1006, -5722, 1136.0, -1642.0, -772.0, '1996-7-8', '2015-11-9 12:9:10', '2012-4-7 10:51:38.', '15:32:17', 2000, 'BMbYVTsNflhwviayJbWqMaTg', 'KOawMw', 0x36370000000000000000, '85', 1, 'A', 'Y', '{"aa": "c", "bb": {"dd": 1}}');
SHELL> python3 main.py /data/mysql_3314/mysqldata/ibd2sql/ddcw_alltype_table.ibd --sql --complete
```
# CHANGE LOG
| 版本 | 变更时间 | 说明 | 备注 |
Expand All @@ -238,8 +152,8 @@ INSERT INTO `ibd2sql`.`ddcw_alltype_table`(`id`,`int_col`,`tinyint_col`,`smallin
| v0.2 | 2023.08.30 | 支持更多数据类型 | 1. 修复year/tinyint的支持<br />2. 符号支持(对于数字类型)<br />3. 更多的数据类型支持<br />4. 更多的表属性支持<br />5. 美化输出<br />6. 支持表名替换<br />7. 支持--complete-insert |
| v0.3 | 2023.10.13 | 支持5.7升级到8.0的ibd文件 | 修复一些BUG |
| v1.0 | 2024.01.05 | 支持debug<br />支持更多类型和功能 | 1. 支持DEBUG<br />2. 支持分区表<br />3. 支持唯一索引<br />4.支持虚拟列<br />5. 支持instant<br />6.支持约束和外键<br />7. 支持限制输出<br />8.支持前缀索引 |
| v1.1 | 2024.04.12 | 修复一些bug | 1. 8.0.13 默认值时间戳<br />2. 8.0.12 无hidden<br />3. online ddl instant |
| v1.2 | 2024.04.25 | 新增空间坐标的支持 | 支持geometry\[collection\],\[multi\]point,\[multi\]linestring,\[multi\]polygon |
| v1.1 | 2024.04.12 | 修复一些bug | 1. 8.0.13 默认值时间戳<br />2. 8.0.12 无hidden<br />3. online ddl instant |
| v1.2 | 2024.04.25 | 新增空间坐标的支持 | 支持geometry\[collection\],\[multi\]point,\[multi\]linestring,\[multi\]polygon |
Expand All @@ -254,17 +168,19 @@ INSERT INTO `ibd2sql`.`ddcw_alltype_table`(`id`,`int_col`,`tinyint_col`,`smallin
7. [8.0.12 无hidden](https://github.com/ddcw/ibd2sql/issues/10) : 取消hidden检查
8. [ONLINE DDL instant](https://github.com/ddcw/ibd2sql/issues/12) : record 1-2 bit is instant flag
# 支持范围
环境要求: python3 或者 使用已编译好的[二进制程序](https://github.com/ddcw/ibd2sql/releases/download/v1.0/ibd2sql_v1.0_linux_x86_64.tar.gz)
环境要求: python3
对象支持: mysql 8.x 下几乎所有数据类型,表属性
对象支持: mysql 8.x 所有数据类型
如下情况不支持:
1. 二级分区 (不支持)
1. DDL二级分区 (不支持)
2. 溢出页 (默认置为null)
3. 不支持一张表存在多个字符集, 其实只支持utf8
Expand Down

0 comments on commit e1814c0

Please sign in to comment.