mysqlpump基本命令为mysqlpump --user=root --password --host=localhost --port=3306 --all-databases > backup.sql,但需注意权限、字符集、gtid、引擎一致性等还原关键点。

mysqlpump 备份命令的基本写法
mysqlpump 是 MySQL 5.7+ 自带的逻辑备份工具,比 mysqldump 更快、支持并行、能按库/表粒度过滤。最简可用命令是:
mysqlpump --user=root --password --host=localhost --port=3306 --all-databases > backup.sql
但直接这么跑大概率失败——缺权限、字符集不一致、或遇到视图/存储过程报错。关键不是“能不能跑”,而是“跑出来的备份能不能还原”。
-
--single-transaction对 InnoDB 有效,但对 MyISAM 无效;混合引擎库必须加--lock-all-tables,否则备份不一致 -
--set-gtid-purged=OFF必须显式指定,否则 MySQL 8.0+ 默认会写 GTID 信息,导致在没开启 GTID 的从库上无法导入 -
--default-character-set=utf8mb4要和目标库实际字符集一致,否则中文可能变 ? 或报错Incorrect string value
备份特定库或排除系统库的常用组合
线上一般不会全库备份,更常见的是只导出业务库,同时跳过 mysql、sys、information_schema 这类系统库。mysqlpump 不支持 --ignore-db 这种语法,得用白名单方式。
- 只备份
app_db和log_db:mysqlpump --user=root --password --databases app_db log_db > business.sql
- 想排除
test库?不行,mysqlpump 没有 exclude 选项,只能列全要备份的库名 - 如果库名含短横线(如
user-center),必须用反引号包裹:`user-center`,否则解析报错Unknown database - 加
--skip-definer避免导出DEFINER=`root`@`%`,否则还原时可能因用户不存在而失败
还原时最容易卡住的三个点
备份文件本身没问题,但还原时卡在 ERROR 1227 (42501) 或一堆 Access denied,基本是权限或上下文问题。
- 还原前确保目标实例已关闭
sql_log_bin=0(尤其主库),否则备份里的 DML 会写入 binlog,引发主从冲突 - 不要用
mysql -u root -p 直接喂,大文件容易因超时中断;改用 <code>mysql -u root -p --init-command="SET SESSION FOREIGN_KEY_CHECKS=0" - 如果备份里含
CREATE EVENT,而目标实例未开启event_scheduler,还原会报错Event execution time is in the past;先执行SET GLOBAL event_scheduler = ON;
并发与性能的实际取舍
mysqlpump 默认单线程,加 --default-parallelism=N 可提升速度,但不是越大越好。
- 并发数建议 ≤ CPU 核心数 × 2,超过后 I/O 或锁竞争反而拖慢整体耗时
- 每个线程单独连一次数据库,若设为 8 并发,就建 8 个连接,注意
max_connections是否够用 -
--compress会压缩传输流,但仅对网络传输有效;本地备份无意义,还多一道 CPU 开销 - 大表(>1GB)建议配合
--chunk-size=1000000分块导出,避免内存爆掉或事务超时
真正麻烦的从来不是命令敲不对,而是备份时没考虑还原场景——比如没验证字符集、没关 GTID、没清空 event_scheduler 状态。这些细节不提前踩一遍,恢复时才最费时间。











