MySQL 服务起不来也能拖数据:innodump 直读 InnoDB/MyISAM/MyRocks 文件实测
什么时候会需要”离线读文件”这种工具
负责数据库的人迟早会意识到,手里最好有这么一个工具:直接解码裸的数据库数据文件,完全离线、不需要运行中的数据库服务,能处理数据目录、单个文件或二进制备份(存储快照、XtraBackup 产物均可)。作者列的场景每一条都是 DBA 的真实痛点:
- 崩溃/损坏救数据——服务起不来、陷入重启循环、又没有可用备份;
- 备份验证与数据文件健康检查;
- 从全量备份里单拖某个库或表;
- 从生产快速搭 staging/QA 实例;
- 找回误删的行;
- 取证(跨一堆旧备份快速找数据,不用逐个 reload);
- 从跑不动老备份工具的远古版本里迁数据。
作者先泼了盆冷水:这工具不能当备份方案——ACID/MVCC 引擎太复杂,直接读文件不保证一致性快照,XtraBackup 们靠 redo log 和 backup lock 保证的东西它没有。但作为”最后一道防线”,它补上了空窗。
实测数据:坏页跳过、150 万行导出、删除行找回
工具已实现三大主流引擎:InnoDB、MyISAM、MyRocks(RocksDB),把表结构和行解码成 SQL 文件或兼容 MySQL Shell 快速导入的 TSV 结构。以下为原文实测输出:
| 场景 | 实测输出 |
|---|---|
--skip-corrupted 跳坏页 |
130MB 的 .ibd,100,680 行写出,1 个坏页跳过(页 100 头部/尾部 LSN 对不上),其余数据完整落盘 |
--examine 全目录体检 |
扫描 6 个 .ibd + MyRocks 目录,共 7 表 1,000,029 行全部干净读出(其中 RocksDB 表 100 万行) |
| 按库拖取(zstd TSV) | db2 目录 5 表,1,359,877 行导出,可直接喂 MySQL Shell 的 loadDump |
| 150 万行单表导出耗时 | 不限速 1.7 秒;开 --direct-io --io-limit 30M 后 9.2 秒 |
--deleted-only 找回删除行 |
一表拖出 2,100 条被标记删除的行——InnoDB 删除行只打删除标记、页面空间未被重写前都能解码 |
从生产拖数的正确姿势
原文最值得抄进 runbook 的是这段:直接读生产实例的 datadir 有各种一致性坑——脏页可能还没落盘、页可能写到一半、刚建的表可能整张缺失,对一次性 staging 副本可以接受,但不能当备份用。作者给的降侵入组合:
innodump --source-dir ... --format tsv --compression zstd \
--direct-io --io-limit 30M # 配合 nice 控制 CPU
--direct-io走O_DIRECT绕过 OS 页缓存——fincore 对照实测:不加 direct-io 时该文件在页缓存里占了 192.1M 驻留,加上后 0B,不给生产内存挖坑(内核可能为了塞页缓存把用户态内存换出去);--io-limit(字节每秒)限速 IO,代价是时间从 1.7 秒变 9.2 秒——作者明说:用时间换生产平稳。
扫描损坏请先用官方 innochecksum,innodump 的 --examine 只扫聚簇索引(二级索引损坏看不到),它的定位是”确认哪些行还能救”。
小夏点评
- “服务起不来就读不了数据”本来是 MySQL 生态的老空窗——备份工具都要连实例。innodump 是作者用 vibe-coding 让 agent 读引擎源码写出解码器的实验项目,开源、单文件、Apache 生态的工具,出实测数字的速度比大厂快,这类工具值得每个 DBA 收藏。
- 页缓存那组对照数据(192.1M vs 0B)比任何性能宣传都直观:它把”对生产低侵入”落成了可验证的指标。跑在任何核心库旁边的辅助工具,先看它绕不绕页缓存、能不能限速。
- 对中国 IT 运维/开发者:主库崩溃、备份失效的深夜场景里,这个工具给的是”不装实例拖数据”的新路径——先 examine 全目录确认能救多少行,再 skip-corrupted 逐表拖,误删场景用 –deleted-only,从生产取数一律 direct-io + io-limit + nice。作者特别标注这是个人实验项目、非 Percona 官方支持软件——上生产前先在自己沙箱里跑一遍作者的验证流程。
参考
- 原文(Percona Blog,2026-10-28):https://www.percona.com/blog/how-to-extract-data-from-innodb-myisam-and-myrocks-files-without-a-running-server/
- 项目地址:https://github.com/PrzemekMalkowski/innodump
