mydumper 比 mysqldump 快因默认按表并行导出及支持主键分片,而 mysqldump 单线程且整表锁表;导入需先建库建表,大库迁移须确保全为 InnoDB 表并合理设置参数。

mydumper 导出时为什么比 mysqldump 快得多
因为 mydumper 默认按表并行导出,还能按 WHERE 条件分片导出(比如按主键范围),而 mysqldump 是单线程、整表锁表(即使加 --single-transaction 也只对 InnoDB 有效,且无法拆分大表)。mydumper 的每个线程独占一个连接,互不阻塞。
实操建议:
- 用
-t控制线程数,一般设为 CPU 核数的 1.5–2 倍(如 8 核机器设-t 12),太高反而因上下文切换和磁盘争抢拖慢速度 - 务必加
--skip-tz-utc,否则时区转换可能让datetime字段错位 - 避免用
--regex匹配大量小表,会显著增加元数据扫描开销;不如直接用-B db_name+-T table1,table2 - 导出前确认源库
max_allowed_packet≥ 256M,否则大 BLOB 字段可能截断,错误信息类似MySQL server has gone away
导入时用 myloader 报 “Table doesn’t exist” 或死锁
这是最常见的坑:myloader 不建库不建表,它只导入数据。你得先手动执行 CREATE DATABASE,再用 mydumper 生成的 metadata 文件里的 CREATE TABLE 语句建好结构(或用 mydumper --no-data 单独导出 schema)。
实操建议:
- 导入前跑一遍
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS target_db" - 用
cat ./export-20240501/backup.sql | mysql -u root -p target_db先恢复 schema(注意路径别写错) - 导入时加
-d ./export-20240501指定目录,别漏掉-d;否则 myloader 会找不到schema和data子目录 - 如果目标库已有同名表且含外键,先
SET FOREIGN_KEY_CHECKS=0再导入,否则可能卡在约束检查上
如何安全迁移大库(>100GB)且不锁业务
核心是靠 mydumper 的一致性快照能力 —— 它依赖 START TRANSACTION WITH CONSISTENT SNAPSHOT,但前提是所有表都是 InnoDB。MyISAM 表会被单独加读锁,导致导出期间写入阻塞。
实操建议:
- 迁移前用
SELECT table_schema, table_name, engine FROM information_schema.tables WHERE table_schema = 'db_name' AND engine != 'InnoDB'检查非 InnoDB 表 - 对 MyISAM 表,要么提前转成 InnoDB(
ALTER TABLE t ENGINE=InnoDB),要么用--no-locks+--use-savepoints降低锁粒度(但仍有风险) - 导出时加
--long-query-guard 60防止长事务拖慢快照获取;加--kill-long-queries自动干掉超时查询(慎用,需确认业务可接受) - 导出后立刻校验
metadata文件里的Finished dump at:时间戳,并与SHOW MASTER STATUS对比 binlog 位置,确保逻辑点一致
导入后发现主从延迟暴增或数据不一致
原因往往是 myloader 默认关闭唯一性检查和外键检查,但没关 autocommit,导致每条 INSERT 都是独立事务,极大放大 binlog 写入压力和从库回放负担。
实操建议:
- 导入前在目标库执行
SET SESSION unique_checks=0, foreign_key_checks=0, autocommit=0(myloader 不自动设这些) - 导入完成后,手动
COMMIT一次,再SET SESSION unique_checks=1, foreign_key_checks=1 - 用
myloader -d ./export -o(-o表示只导入,不重建表结构),避免重复执行 DDL 影响 GTID 或复制过滤规则 - 导入完立刻对比行数:
SELECT table_name, table_rows FROM information_schema.tables WHERE table_schema='db_name',别只信myloader的 summary 输出
真正麻烦的是跨版本迁移(比如 MySQL 5.7 → 8.0),mydumper 生成的 SQL 可能含 8.0 不兼容语法(如隐藏索引注释),这时候得在导入前用 sed 过滤或降级导出版本。细节藏在 metadata 文件第一行,别跳过看。


















