Skip to content

ibd 文件

mySQL 的 InnoDB 引擎使用的数据表文件(每个表对应一个 ibd 文件,在 5.7 版本还有一个 frm 文件)。该文件按照 PAGE_SIZE(16KB)分为若干页,为了方便管理页又将多个页合并为区(extent),每个区固定 1MB。多个区又由专门的 PAGE(XDES) 来描述区信息。他们其中保存了一个数据表的数据和索引等所有相关信息。

读取 ibd 文件

开源社区提供了一个ibd2sql项目来读取 ibd 文件,他的核心就是将 ibd 文件输出为 sql 文件。

安装 ibd2sql

Bash
wget https://github.com/ddcw/ibd2sql/archive/refs/heads/main.zip
unzip main.zip
cd ibd2sql-main

基本使用

他是一个 Python 脚本因此基本的使用方式就是:

Bash
python main.py /PATH/xxx.ibd --options

其中可用的 options 包括:

  • --ddl: 打印目标文件的DDL信息
  • --sql: 打印目标文件的数据, 并拼接为SQL语句
  • --complete-insert: 打印的SQL语句更完整, 即增加字段信息(某些数据库需要字段信息)
  • --multi-value: 对于生成的INSERT语句, 按照每页作为一个SQL语句. 即 insert into table values(),(),()
  • --limit: 仅打印 N 行数据。同 DML 中的limit
  • --page-min: 如果正在解析的页号小于这个值, 则跳过该页
  • --page-max: 如果正在解析的页号大于这个值, 则跳过
  • --page-start: 指定第一个数据页(叶子节点). 方便跳过坏块
  • --page-count: 解析的页数量,通常和 --page-start 联合使用实现并发解析
  • --page-skip: 跳过的页数量

其中最简单的使用方式就是将所有的数据写入 sql 语句中:

Bash
# 直输出 insert 语句
python main.py xxx.ibd --sql > test.sql

# 输入 create table 以及 insert 语句
python main.py xxx.ibd --sql --ddl > test.sql

直接部署 MySQL 读取

ibd 文件实际上就是 InnoDB 的数据表文件,我们可以直接通过 Docker 部署然后还原他们。