MySQL基于ibd2sql實現(xiàn)ibd文件批量轉(zhuǎn)換為SQL的完整指南
在 MySQL 數(shù)據(jù)庫運維、數(shù)據(jù)恢復(fù)、遷移場景中,僅存 ibd 文件、丟失表結(jié)構(gòu) / 備份 是最棘手的問題之一。InnoDB 的獨立表空間文件 .ibd 存儲了表的全部數(shù)據(jù)和結(jié)構(gòu),但無法直接讀取使用。
基于開源工具 ibd2sql,我們可以離線解析 ibd 文件,直接導(dǎo)出完整的 CREATE TABLE(DDL)和 INSERT(DML)語句。本文整合** Windows PowerShell 批量腳本** + Linux Shell 自動轉(zhuǎn)換 + 導(dǎo)入腳本,實現(xiàn)一鍵批量處理,徹底解決 ibd 恢復(fù)難題。
一、核心概念:ibd 文件到底是什么?
.ibd= InnoDB Data File,MySQL InnoDB 獨立表空間文件- 開啟
innodb_file_per_table=ON(默認開啟)后,一張表對應(yīng)一個 ibd 文件 - 包含:表結(jié)構(gòu)、數(shù)據(jù)行、索引、約束、元數(shù)據(jù)(MySQL 8.0+)
- 無法直接用文本編輯器打開,必須專用工具解析
ibd2sql 是目前最易用、跨平臺、無依賴的 ibd 解析工具,支持:
- ? 導(dǎo)出表結(jié)構(gòu)(DDL)
- ? 導(dǎo)出全部數(shù)據(jù)(SQL)
- ? 恢復(fù)誤刪數(shù)據(jù)
- ? 支持 MySQL 5.6 ~ 8.4+
- ? Windows / Linux 通用
- ? 純 Python 運行,無需編譯
二、環(huán)境準備(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 文件
把需要恢復(fù)的 .ibd 文件復(fù)制到 ibd2sql 目錄下(或子目錄)。
三、基礎(chǔ)命令(單文件轉(zhuǎn)換)
你可以先手動測試,確保工具正常工作:
# 導(dǎo)出 DDL + 數(shù)據(jù) 到 SQL 文件 python main.py test.ibd --ddl --sql > test.sql
常用參數(shù):
--ddl:導(dǎo)出建表語句--sql:導(dǎo)出數(shù)據(jù) insert 語句--delete:導(dǎo)出已刪除的數(shù)據(jù)(誤刪恢復(fù))--mysql5:兼容 MySQL 5.7 及更早版本
四、Windows 批量轉(zhuǎn)換腳本(PowerShell)
適合 Windows 環(huán)境,批量掃描所有 ibd → 自動生成 SQL → 自動清理空文件,輸出統(tǒng)一保存到 output_sql 目錄。
完整腳本
chcp 65001 | Out-Null
# 創(chuàng)建輸出目錄
mkdir -Force output_sql | Out-Null
# 獲取當前目錄下所有 ibd 文件(你可以改成自己的路徑)
$ibdFiles = Get-ChildItem -Path . -Recurse -Filter *.ibd
# 循環(huán)批量轉(zhuǎn)換
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文件夾
腳本優(yōu)勢
- 遞歸掃描子目錄所有 ibd
- 自動 UTF-8 編碼,無中文亂碼
- 自動合并 DDL + 數(shù)據(jù)
- 自動刪除解析失敗的空文件
- 兼容所有 Windows 版本
五、Linux 自動轉(zhuǎn)換 + 直接導(dǎo)入 MySQL 腳本
Linux 環(huán)境最強方案:掃描 ibd → 生成 SQL → 自動導(dǎo)入數(shù)據(jù)庫,全程無需人工干預(yù)。
完整腳本
#!/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 文件 → 自動轉(zhuǎn)換 + 導(dǎo)入"
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"
# 導(dǎo)出 DDL + 數(shù)據(jù)(會自動生成 CREATE DATABASE + USE)
python3 main.py "$ibd_file" --ddl --sql > "$output_sql"
# 跳過空文件
if [ ! -s "$output_sql" ]; then
rm -f "$output_sql"
continue
fi
# 直接導(dǎo)入,不指定數(shù)據(jù)庫,SQL 內(nèi)部自動建庫
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 賬號密碼
- 賦予執(zhí)行權(quán)限:
chmod +x ibd2sql_auto_import.sh - 運行:
./ibd2sql_auto_import.sh
腳本優(yōu)勢
- 遞歸掃描全目錄 ibd
- 自動生成 SQL 并保存?zhèn)浞?/li>
- 自動跳過解析失敗文件
- 自動導(dǎo)入 MySQL,無需手動執(zhí)行
- 自動創(chuàng)建原數(shù)據(jù)庫,表結(jié)構(gòu)完整恢復(fù)
六、生成后的 SQL 文件如何手動導(dǎo)入?
如果你不想自動導(dǎo)入,可手動執(zhí)行:
1. 命令行導(dǎo)入
mysql -uroot -p 數(shù)據(jù)庫名 < output_sql/test.sql
2. 客戶端導(dǎo)入
Navicat / DBeaver / SQLyog:
- 連接 MySQL
- 新建數(shù)據(jù)庫
- 運行 SQL 文件 → 選擇生成的
.sql
七、常見問題與解決方案
1. 中文亂碼
- Windows 腳本已強制 UTF-8
- 導(dǎo)入時確保 MySQL 連接字符集為 utf8mb4
2. 解析失敗
- ibd 文件損壞:嘗試加
--force - MySQL 5.7 加
--mysql5 - 文件權(quán)限不足:管理員運行
3. 數(shù)據(jù)丟失
- 普通恢復(fù)不加
--delete - 誤刪數(shù)據(jù)恢復(fù)使用:
python main.py xx.ibd --sql --delete
八、總結(jié)
ibd2sql 是 MySQL 數(shù)據(jù)恢復(fù)的終極工具,配合本文提供的雙平臺腳本:
- Windows:批量生成 SQL,安全、標準化導(dǎo)出
- Linux:一鍵轉(zhuǎn)換 + 自動導(dǎo)入,適合服務(wù)器應(yīng)急恢復(fù)
無論你是誤刪庫、系統(tǒng)崩潰、備份丟失,只要有 ibd 文件,就能完整恢復(fù)表結(jié)構(gòu)和全部數(shù)據(jù)。
以上就是MySQL基于ibd2sql實現(xiàn)ibd文件批量轉(zhuǎn)換為SQL的完整指南的詳細內(nèi)容,更多關(guān)于MySQL ibd文件轉(zhuǎn)換為SQL的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
SQL中count(1)、count(*)?與?count(列名)的區(qū)別詳細解釋
count(1)和count(*)是SQL中用于統(tǒng)計行數(shù)的兩種常見方式,它們的區(qū)別在于統(tǒng)計的對象不同,下面這篇文章主要給大家介紹了關(guān)于SQL中count(1)、count(*)?與?count(列名)區(qū)別的相關(guān)資料,需要的朋友可以參考下2024-08-08
C3P0連接池+MySQL的配置及wait_timeout問題的解決方法
這篇文章主要介紹了C3P0連接池+MySQL的配置及wait_timeout問題的解決方法,本文介紹的非常詳細,具有參考借鑒價值,需要的朋友可以參考下2016-09-09
MySQL通過login_path登錄數(shù)據(jù)庫的實現(xiàn)示例
login_path是MySQL5.6開始支持的新特性,本文主要介紹了MySQL通過login_path登錄數(shù)據(jù)庫,文中通過示例代碼介紹的非常詳細,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2025-02-02

