在 mysql 数据库运维、数据恢复、迁移场景中,仅存 ibd 文件、丢失表结构 / 备份 是最棘手的问题之一。innodb 的独立表空间文件 .ibd 存储了表的全部数据和结构,但无法直接读取使用。
基于开源工具 ibd2sql,我们可以离线解析 ibd 文件,直接导出完整的 create table(ddl)和 insert(dml)语句。本文整合** windows powershell 批量脚本** + linux shell 自动转换 + 导入脚本,实现一键批量处理,彻底解决 ibd 恢复难题。
一、核心概念:ibd 文件到底是什么?
.ibd= innodb data file,mysql innodb 独立表空间文件- 开启
innodb_file_per_table=on(默认开启)后,一张表对应一个 ibd 文件 - 包含:表结构、数据行、索引、约束、元数据(mysql 8.0+)
- 无法直接用文本编辑器打开,必须专用工具解析
ibd2sql 是目前最易用、跨平台、无依赖的 ibd 解析工具,支持:
- ✅ 导出表结构(ddl)
- ✅ 导出全部数据(sql)
- ✅ 恢复误删数据
- ✅ 支持 mysql 5.6 ~ 8.4+
- ✅ windows / linux 通用
- ✅ 纯 python 运行,无需编译
二、环境准备(1 分钟完成)
1. 下载工具
git clone https://github.com/ddcw/ibd2sql.git cd ibd2sql
2. 检查 python
# windows python --version # linux python3 --version
只要是 python 3.6+ 即可,无需安装任何依赖库。
3. 放入 ibd 文件
把需要恢复的 .ibd 文件复制到 ibd2sql 目录下(或子目录)。
三、基础命令(单文件转换)
你可以先手动测试,确保工具正常工作:
# 导出 ddl + 数据 到 sql 文件 python main.py test.ibd --ddl --sql > test.sql
常用参数:
--ddl:导出建表语句--sql:导出数据 insert 语句--delete:导出已删除的数据(误删恢复)--mysql5:兼容 mysql 5.7 及更早版本
四、windows 批量转换脚本(powershell)
适合 windows 环境,批量扫描所有 ibd → 自动生成 sql → 自动清理空文件,输出统一保存到 output_sql 目录。
完整脚本
chcp 65001 | out-null
# 创建输出目录
mkdir -force output_sql | out-null
# 获取当前目录下所有 ibd 文件(你可以改成自己的路径)
$ibdfiles = get-childitem -path . -recurse -filter *.ibd
# 循环批量转换
foreach ($file in $ibdfiles) {
$name = $file.basename
$output = "output_sql\$name.sql"
write-host "`nprocessing: $($file.name)" -foregroundcolor cyan
# 正确获取 ddl + 保留格式换行
$ddl = python -x utf8 main.py $file.fullname --ddl 2>&1
$data = python -x utf8 main.py $file.fullname --sql 2>&1
# 合并,保留原始格式
$fullsql = (@($ddl) + @("") + @($data)) -join "`r`n"
# 写入 utf8 无 bom
[system.io.file]::writealltext($output, $fullsql, [system.text.encoding]::utf8)
# 删除空文件
if (test-path $output) {
if ((get-item $output).length -eq 0) {
remove-item $output -force
}
}
}
write-host "`nall done! files saved in output_sql folder" -foregroundcolor green
使用方法
- 保存为
ibd2sql_batch.ps1 - 放在 ibd2sql 工具目录
- 右键 → 使用 powershell 运行
- 所有 sql 文件自动生成在
output_sql文件夹
脚本优势
- 递归扫描子目录所有 ibd
- 自动 utf-8 编码,无中文乱码
- 自动合并 ddl + 数据
- 自动删除解析失败的空文件
- 兼容所有 windows 版本
五、linux 自动转换 + 直接导入 mysql 脚本
linux 环境最强方案:扫描 ibd → 生成 sql → 自动导入数据库,全程无需人工干预。
完整脚本
#!/bin/bash
# ===================== mysql 连接信息 =====================
mysql_host="127.0.0.1"
mysql_port="3306"
mysql_user="root"
mysql_pass="你的密码"
# =========================================================
output_dir="./output_sql"
mkdir -p "$output_dir"
echo "====================================="
echo " 递归扫描 ibd 文件 → 自动转换 + 导入"
echo "====================================="
# 递归查找所有子目录下的 ibd
find . -type f -name "*.ibd" | while read -r ibd_file; do
filename=$(basename "$ibd_file" .ibd)
output_sql="$output_dir/$filename.sql"
echo "processing: $ibd_file"
# 导出 ddl + 数据(会自动生成 create database + use)
python3 main.py "$ibd_file" --ddl --sql > "$output_sql"
# 跳过空文件
if [ ! -s "$output_sql" ]; then
rm -f "$output_sql"
continue
fi
# 直接导入,不指定数据库,sql 内部自动建库
mysql -h"$mysql_host" -p"$mysql_port" -u"$mysql_user" -p"$mysql_pass" < "$output_sql"
echo "imported: $output_sql"
done
echo -e "\n🎉 all tasks completed!"
使用方法
- 保存为 ibd2sql_auto_import.sh
- 修改 mysql 账号密码
- 赋予执行权限:
chmod +x ibd2sql_auto_import.sh - 运行:
./ibd2sql_auto_import.sh
脚本优势
- 递归扫描全目录 ibd
- 自动生成 sql 并保存备份
- 自动跳过解析失败文件
- 自动导入 mysql,无需手动执行
- 自动创建原数据库,表结构完整恢复
六、生成后的 sql 文件如何手动导入?
如果你不想自动导入,可手动执行:
1. 命令行导入
mysql -uroot -p 数据库名 < output_sql/test.sql
2. 客户端导入
navicat / dbeaver / sqlyog:
- 连接 mysql
- 新建数据库
- 运行 sql 文件 → 选择生成的
.sql
七、常见问题与解决方案
1. 中文乱码
- windows 脚本已强制 utf-8
- 导入时确保 mysql 连接字符集为 utf8mb4
2. 解析失败
- ibd 文件损坏:尝试加
--force - mysql 5.7 加
--mysql5 - 文件权限不足:管理员运行
3. 数据丢失
- 普通恢复不加
--delete - 误删数据恢复使用:
python main.py xx.ibd --sql --delete
八、总结
ibd2sql 是 mysql 数据恢复的终极工具,配合本文提供的双平台脚本:
- windows:批量生成 sql,安全、标准化导出
- linux:一键转换 + 自动导入,适合服务器应急恢复
无论你是误删库、系统崩溃、备份丢失,只要有 ibd 文件,就能完整恢复表结构和全部数据。
以上就是mysql基于ibd2sql实现ibd文件批量转换为sql的完整指南的详细内容,更多关于mysql ibd文件转换为sql的资料请关注代码网其它相关文章!
发表评论