欢迎投稿

今日深度:

工具分享-从ibd文件中恢复数据的神器ibd2sql,假如备份和Binlo

工具分享-从ibd文件中恢复数据的神器ibd2sql,假如备份和Binlo


工具分享-从ibd文件中恢复数据的神器ibd2sql

1. ibd2sql 的使用场景

在单节点单表表空间损坏的情况下,一般我们想到的方法是从最近的备份中恢复表数据并从Binlog中合并数据。

假如备份和Binlog缺失,那就只能从ibd文件中紧急恢复数据,可以使用 ibd2sql 这个工具去恢复数据。

2. ibd2sql 简介

ibd2sql is tool of transform mysql ibd file to sql(data).

ibd2sql是一个使用纯python3编写的离线解析 MySQL InnoDB 存储引擎的ibd文件的工具。无第三方依赖包,使用GPL-3.0 license。

  • 项目地址:https://github.com/ddcw/ibd2sql

3. 实测

3.1 环境信息

操作系统:ky10.x86_64

数据库版本:GreatSQL-8.0.32-27

3.2数据库安装并初始化数据

GreatSQL安装参考:https://greatsql.cn/docs/8.0.32-27/3-quick-start/3-2-quick-start-with-tarball.html

--创建测试库
CREATE database test;
--创建测试表
CREATE TABLE `test`.`workflow_state` (
  `id` int NOT NULL AUTO_INCREMENT,
  `creator` varchar(64) DEFAULT NULL,
  `create_at` datetime(6) NOT NULL,
  `update_at` datetime(6) NOT NULL,
  `updated_by` varchar(64) DEFAULT NULL,
  `end_at` datetime(6) DEFAULT NULL,
  `is_deleted` tinyint(1) NOT NULL,
  `name` varchar(64) NOT NULL,
  `desc` varchar(64) DEFAULT NULL,
  `type` varchar(32) NOT NULL,
  `processors_type` varchar(32) NOT NULL,
  `processors` varchar(255) DEFAULT NULL,
  `distribute_type` varchar(32) NOT NULL,
  `notify_rule` varchar(32) NOT NULL,
  `notify_freq` int NOT NULL,
  `fields` longtext,
  `extras` varchar(1000) DEFAULT NULL,
  `is_draft` tinyint(1) NOT NULL,
  `is_builtin` tinyint(1) NOT NULL,
  `workflow_id` int NOT NULL,
  `is_terminable` tinyint(1) NOT NULL,
  `followers` varchar(255) DEFAULT NULL,
  `followers_type` varchar(32) NOT NULL,
  `api_instance_id` int DEFAULT NULL,
  `assignors` longtext DEFAULT (_utf8mb3''),
  PRIMARY KEY (`id`),
  KEY `workflow_state_workflow_id_ef53cea4_fk_workflow_workflow_id` (`workflow_id`),
  KEY `workflow_state_is_deleted_37d5c517` (`is_deleted`)
) ENGINE=InnoDB;
--插入初始化数据
INSERT INTO `test`.`workflow_state` VALUES (1, 'admin', '2025-4-28 10:0:0.0', '2025-4-28 10:0:0.0', NULL, NULL, 0, '审批节点1', '基础审批流程', 'approval', 'user', 'user123', 'round_robin', 'immediate', 1, '{"field1": "value1"}', '{"priority": "high"}', 0, 1, 1, 1, 'user456,user789', 'specific', 1001, '["assignor1"]');
INSERT INTO `test`.`workflow_state` VALUES (10, 'system', '2025-4-28 10:45:0.0', '2025-4-28 10:45:0.0', NULL, NULL, 0, '子流程', '调用子工作流', 'subflow', 'system', NULL, 'direct', 'immediate', 1, '{"subflow_id": 100}', '{"parameters": "{}"}', 0, 1, 10, 1, NULL, 'none', 1006, '[]');

3.3ibd2sql下载使用

-- 安装python3
yum -y install python3
-- 下载ibd2sql,没法通过wget下载,可以直接复制网址到浏览器下载
wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip
-- 解压
unzip ibd2sql-main.zip
-- 进入ibd2sql
cd ibd2sql-main

3.3.1尝试对workflow_state表进行表结构恢复

-- 恢复表结构,后面带的 --ddl为生成表结构
$ python3.7 main.py /greatsql/dbdata/data3306/data/test/workflow_state.ibd --sql --ddl
CREATE TABLE IF NOT EXISTS `test`.`workflow_state`(
    `id` int NOT NULL AUTO_INCREMENT,
    `creator` varchar(64) NULL,
    `create_at` datetime(6) NOT NULL,
    `update_at` datetime(6) NOT NULL,
    `updated_by` varchar(64) NULL,
    `end_at` datetime(6) NULL,
    `is_deleted` tinyint(1) NOT NULL,
    `name` varchar(64) NOT NULL,
    `desc` varchar(64) NULL,
    `type` varchar(32) NOT NULL,
    `processors_type` varchar(32) NOT NULL,
    `processors` varchar(255) NULL,
    `distribute_type` varchar(32) NOT NULL,
    `notify_rule` varchar(32) NOT NULL,
    `notify_freq` int NOT NULL,
    `fields` longtext NULL,
    `extras` varchar(1000) NULL,
    `is_draft` tinyint(1) NOT NULL,
    `is_builtin` tinyint(1) NOT NULL,
    `workflow_id` int NOT NULL,
    `is_terminable` tinyint(1) NOT NULL,
    `followers` varchar(255) NULL,
    `followers_type` varchar(32) NOT NULL,
    `api_instance_id` int NULL,
    `assignors` longtext NULL DEFAULT (_utf8mb3''),
    PRIMARY KEY  (`id` ),
    KEY `workflow_state_workflow_id_ef53cea4_fk_workflow_workflow_id` (`workflow_id` ),
    KEY `workflow_state_is_deleted_37d5c517` (`is_deleted` )
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ;

3.3.2尝试对workflow_state表进行表数据恢复

-- 恢复表数据,后面带的 --sql把数据转换为sql,也可以使用--complete-insert合并insert
$ python3.7 main.py /greatsql/dbdata/data3306/data/test/workflow_state.ibd --sql
INSERT INTO `test`.`workflow_state` VALUES (1, 'admin', '2025-4-28 10:0:0.0', '2025-4-28 10:0:0.0', NULL, NULL, 0, '审批节点1', '基础审批流程', 'approval', 'user', 'user123', 'round_robin', 'immediate', 1, '{"field1": "value1"}', '{"priority": "high"}', 0, 1, 1, 1, 'user456,user789', 'specific', 1001, '["assignor1"]');
INSERT INTO `test`.`workflow_state` VALUES (10, 'system', '2025-4-28 10:45:0.0', '2025-4-28 10:45:0.0', NULL, NULL, 0, '子流程', '调用子工作流', 'subflow', 'system', NULL, 'direct', 'immediate', 1, '{"subflow_id": 100}', '{"parameters": "{}"}', 0, 1, 10, 1, NULL, 'none', 1006, '[]');

3.3.3更多使用方法

可以使用--help 查看完整的使用方法,在表空间损坏的情况下可以通过--force, -f 强制调用ibd文件拯救数据

--help详情
$ python3.7 main.py --help
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] [--mysql5]
               [--keyring-file KEYRING_FILE]
               [FILENAME]

-- 解析mysql 5.7/8.0的ibd文件 https://github.com/ddcw/ibd2sql

positional arguments:
  FILENAME              ibd filename

optional arguments:
  --help, -h            show help
  --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)
  --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
  --mysql5              for mysql5.7 flag
  --keyring-file KEYRING_FILE, -k KEYRING_FILE
                        keyring filename
Example:
ibd2sql /data/db1/xxx.ibd --ddl --sql
ibd2sql /data/db1/xxx.ibd --delete --sql
ibd2sql /data/db1/xxx

www.htsjk.Com true http://www.htsjk.com/Mysql/49231.html NewsArticle 工具分享-从ibd文件中恢复数据的神器ibd2sql,假如备份和Binlo 工具分享-从ibd文件中恢复数据的神器ibd2sql 1. ibd2sql 的使用场景 在单节点单表表空间损坏的情况下,一般我们想到的方法是...
评论暂时关闭