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 只扫聚簇索引(二级索引损坏看不到),它的定位是”确认哪些行还能救”。

小夏点评

  1. “服务起不来就读不了数据”本来是 MySQL 生态的老空窗——备份工具都要连实例。innodump 是作者用 vibe-coding 让 agent 读引擎源码写出解码器的实验项目,开源、单文件、Apache 生态的工具,出实测数字的速度比大厂快,这类工具值得每个 DBA 收藏。
  2. 页缓存那组对照数据(192.1M vs 0B)比任何性能宣传都直观:它把”对生产低侵入”落成了可验证的指标。跑在任何核心库旁边的辅助工具,先看它绕不绕页缓存、能不能限速。
  3. 对中国 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

您可能还喜欢...

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注