mysqlpump --default-parallelism 默认不生效是因为其默认值为0,即禁用并行;必须显式设置≥1才启用,且仅对表结构和数据块并行,函数、视图、触发器等始终串行。

mysqlpump --default-parallelism 为什么默认不生效
因为 --default-parallelism 默认值是 0,不是自动启用并行。不显式指定,它就老老实实单线程跑完——哪怕你有 64 核、200 个库,也只用 1 个线程。
常见错误现象:mysqlpump -u root -p db1 执行时 top 看到 CPU 始终单核满载,SHOW PROCESSLIST 里只有 1 个 Dump 线程,误以为“工具坏了”,其实是根本没开并行。
-
--default-parallelism=N必须显式设置,N ≥ 1 才会尝试并行;N=0 = 强制禁用 - 该参数控制的是「每个数据库内可并行的对象数」,不是全局线程总数
- 若只备份单个库(如
db1),且该库只有 1 张大表,即使设--default-parallelism=8,也只会启动 1 个线程导出那张表
哪些对象能真正并行导出
mysqlpump 的并行不是“语句级”或“行级”,而是按对象类型分组后,在满足独立性前提下分发线程。能并行的只有两类:
- 每张表的
CREATE TABLE语句(结构) - 每张表的数据块(
INSERT语句,按 chunk 拆分)
以下对象始终串行处理,无论你怎么调参数:
-
CREATE FUNCTION、CREATE PROCEDURE -
CREATE USER、GRANT、CREATE EVENT - 视图(
CREATE VIEW)和触发器(CREATE TRIGGER),除非加--skip-definer避开权限校验阻塞
典型场景:一个库含 150 张小表 + 20 个存储过程。设 --default-parallelism=6,实际并发的只有表结构和数据部分;函数导出阶段会卡住主线程,等全部串行做完才结束。
如何让并行真正跑起来
关键不在堆线程数,而在构造可并行的对象拓扑结构。以下操作能显著提升并发命中率:
- 用
--include-databases=db1,db2,db3显式列出多个库,比db1 db2 db3更容易触发库级分片 - 避免只备份单库单表;若必须,先确认该库下至少有 3 张以上非空表
- 权限要给足:
SELECT是基础,--single-transaction需要RELOAD,导出用户需对mysql库有SELECT - 加
--skip-definer:大量带DEFINER的视图/函数会导致权限检查串行化,拖慢整体进度 - SSD 环境建议
--default-parallelism ≤ 8,HDD 建议 ≤ 4;超过物理核心数后 I/O 竞争反而降速
一个可用命令示例:
mysqlpump -u backup_user -p \ --include-databases=app_db,log_db,report_db \ --default-parallelism=4 \ --single-transaction \ --skip-definer \ --compress-output=LZ4 \ > backup_$(date +%F).sql.lz4
导入时别踩 mysqlpump 特有的坑
mysqlpump 导出的 SQL 不是“即导即用”,直接 mysql -u root -p 极易失败:
- 含
DEFINER的视图/过程在目标实例无对应用户时,会在CREATE ALGORITHM=行卡住 -
CREATE USER和GRANT语句要求执行者有CREATE USER权限,否则报ERROR 1227 (42501) -
--compress-output=LZ4生成的是二进制压缩流,不能直接重定向给mysql,必须先解压
安全导入方式:
- 导出时加
--skip-definer和--users(仅当真需要迁移账号) - 导入前手动删掉文件头的
CREATE USER/GRANT块,或用--exclude-users导出时不包含 - LZ4 文件必须先解压:
lz4 -d backup.sql.lz4 | mysql -u u -p db_name
真正要注意的,不是怎么开更多线程,而是理解 mysqlpump 的并行边界在哪——它只并行“可拆分、无依赖、免校验”的那部分工作。其余环节,它照旧是逻辑备份工具的老样子。











