mysqlpump默认不并发,--default-parallelism默认为0,必须显式指定正整数(如4)才启用表结构和数据的并行导出,其余对象仍串行;需搭配--single-transaction(mysql≥5.7.11)实现无锁一致性备份。

mysqlpump 默认根本不并发,必须显式设 --default-parallelism
很多人跑 mysqlpump -u root -p mydb 发现 CPU 占一个核、耗时跟 mysqldump 差不多,就以为“并行没起作用”——其实根本没开。它默认 --default-parallelism=0,也就是纯串行。不加这个参数,再多核机器也白搭。
真正启用并发的关键是:必须指定正整数,比如 --default-parallelism=4。但要注意:
-
--default-parallelism只对「表结构」和「表数据(INSERT)」生效,函数、视图 DEFINER、用户权限、事件等仍串行处理 - 线程数不是越多越好:SSD 环境建议 ≤ 8,HDD ≤ 4;超过物理核心数后 I/O 竞争反而拖慢整体速度
- 若只给部分库并发,用
--parallel-schemas=4:app_db,log_db更精准,避免系统库被误卷入
多库并发 ≠ 真热备,锁问题仍在,得靠 --single-transaction
并发导出本身不解决一致性问题。默认行为会尝试 FLUSH TABLES WITH READ LOCK,遇到长事务或低权限账号直接卡住甚至报 Access denied。线上库不能停写,就必须绕过全局锁。
--single-transaction 是关键开关,但它有前提:
- 仅对 InnoDB 表有效(MyISAM 仍会锁)
- 要求 MySQL ≥ 5.7.11 —— 5.7.8 到 5.7.10 版本中它与并行互斥,强行加会静默退化为串行
- 必须搭配
--default-parallelism>0才能真正并发 + 无锁
典型安全组合:mysqlpump -u bkuser -p --single-transaction --default-parallelism=4 --include-databases=app_db,report_db > backup.sql
权限不足或版本太低,备份会卡在 LOCK TABLES 阶段
常见现象:命令执行后长时间无输出、ps aux | grep mysqlpump 显示进程卡在 Waiting for table flush 或直接报错 Access denied; you need (at least one of) the LOCK TABLES privilege(s)。
这不是网络或磁盘问题,而是账号权限或服务端限制:
- 账号至少需要:
SELECT、LOCK TABLES、SHOW VIEW、TRIGGER—— 光有SELECT不够 - 确认 MySQL 版本:
SELECT VERSION();,低于5.7.8的实例压根没有mysqlpump命令,which mysqlpump会返回空 - 若无法升级或授全权,可用
--skip-lock-tables强行跳过锁,但跨表一致性不保(例如订单主子表可能不同步)
恢复时容易失败,因为 mysqlpump 默认不建库也不管外键顺序
直接 mysql -u root -p mydb 经常报错:<code>Unknown database 'mydb' 或 Cannot add or update a child row: a foreign key constraint fails。这不是备份失败,而是导出逻辑导致的。
两个硬要加的参数:
-
--include-databases=app_db:强制生成CREATE DATABASE IF NOT EXISTS app_db,注意不是--databases(那是mysqldump的写法) - 导入前手动关外键检查:
mysql -e "SET FOREIGN_KEY_CHECKS=0;" app_db - 若目标库字符集是
utf8mb4_0900_as_cs而备份里含未知 collation,需加--default-character-set=utf8mb4并手动替换 collation 字符串
最易被忽略的一点:mysqlpump 对大表的 chunk 分片默认按 100 万行一批,内存压力大时可能被 OOM kill;高负载线上库建议显式加 --chunk-size=500000 控制单批大小。











