应使用cpulimit -l 30限制cpu占用率,并配合pv -l 20m管道限速io,同时用ionice -c2 -n7降低io调度优先级;mysqldump不支持原生命令限速,--throttle无效,pv必须置于管道中且单位带字母(如m),不可写在重定向之后。

mysqldump 备份时 CPU 突增,怎么限流?
直接跑 mysqldump 会触发全表扫描、大量排序和临时表生成,尤其在大表或高并发场景下,CPU 往往瞬间打满。这不是“备份慢”,而是“备份抢资源”。mysqldump 默认不设限,它会尽可能快地读取数据,结果就是业务查询被挤出 CPU 时间片。
- 加
--single-transaction(InnoDB 表)避免锁表,但不降低 CPU; - 用
--skip-triggers--skip-routines--skip-events减少元数据解析开销; - 强制限制 CPU:在 Linux 层用
cpulimit -l 30(30 表示最多占用 30% CPU),比调低 mysqldump 参数更可靠; - 避免在业务高峰执行——哪怕加了限流,
cpulimit仍可能因调度抖动导致短时毛刺。
mysqldump 备份时 IO 突增,pv 怎么接进管道?
直接用 mysqldump > backup.sql 会持续高压读取表数据、写入磁盘,尤其在大库或机械盘上容易拖垮 r_await 和 aqu-sz。用 pv 限速不是加个参数就行,必须重构整个输出链路——它只能作用于管道流,不能对文件写入限速。
- 正确做法:
mysqldump --single-transaction --all-databases | pv -L 20m > backup.sql; -
pv -L 20m中的20m表示 20MB/s,单位必须带字母(k/m/g),否则按字节/秒理解(等于限速到 20B/s); - 不能写成
mysqldump > backup.sql | pv -L 20m——重定向优先级高于管道,pv根本收不到数据; - 若后续要
gzip,pv要放在gzip前:mysqldump | pv -L 20m | gzip > backup.sql.gz。
ionice 和 pv 能不能一起用?
可以,但作用层面不同:ionice -c2 -n7 是降低进程 IO 调度优先级,让出磁盘时间片;pv -L 是硬性掐断数据流速。两者叠加不是简单相加,而是分层控制。
- 低峰期小库:单用
pv -L 15m足够; - 高峰期大库(>100GB):先
ionice -c2 -n7降权,再套pv -L 8m,避免抢占其他业务 IO; - 别用
ionice -c3(idle class)——MySQL 自身日志刷盘可能被饿死,导致innodb_log_waits上升; - 验证是否生效,盯住
iostat -x 1的aqu-sz:若持续 > 2 超过 10 秒,说明限速值还是偏高或磁盘已达瓶颈。
为什么不用 --throttle 而选 pv?
--throttle 是 XtraBackup 专用参数,mysqldump 完全不识别。有人误以为加在 mysqldump 后面能生效,结果只是被当成了无意义的额外参数,备份照样全速跑。
-
pv是通用流控工具,只要命令支持 stdout 输出,就能套进去; - 它不关心上游是什么,只管住字节流速率;
- 实测中:
pv -L 10m后,iostat -x 1观察到wMB/s稳定在 9~11MB/s,aqu-sz从 8+ 降到 1.2 左右; - 同一台机器上,
mysqldump直接写文件时w_await常突破 50ms;加pv后回落至 5~8ms。
pv 必须装在运行 mysqldump 的机器上,且限速值要结合目标盘类型动态调整——USB 机械盘设太高会触发缓冲区堆积,反而放大延迟;而 NVMe 盘上 aqu-sz 低不代表没压力,得同步看 r/s 和 w/s。











