mysqldump 通过管道直接 | gzip 压缩导出,避免生成中间大文件;支持 --single-transaction 保证一致性、pv 实时监控进度、--ignore-table 等参数灵活过滤,并配合 find 定期清理旧备份。

mysqldump 直接配合 gzip 压缩导出,避免生成中间大文件
MySQL 本身不内置压缩导出功能,但 Linux 管道能让 mysqldump 的标准输出直接喂给 gzip,跳过写入磁盘的 .sql 明文文件。这对磁盘空间紧张或备份大库(比如几十 GB)的场景很关键——否则先 dump 出几百 MB 的 SQL,再 gzip,既耗空间又多一次 I/O。
实操命令示例:
mysqldump -u root -p'yourpass' --single-transaction --routines --triggers mydb | gzip > mydb_$(date +%F).sql.gz
注意点:
-
--single-transaction对 InnoDB 表保证一致性快照,但对 MyISAM 无效(需加--lock-all-tables) -
-p后不带空格直接跟密码,虽方便但会出现在进程列表里(ps aux可见),生产环境建议用~/.my.cnf配置文件存凭证 -
gzip默认压缩级别是 6,如需更快可加-1(最低压缩比),要更小体积可加-9(但 CPU 占用明显上升)
用 pv 实时查看导出进度和速率
纯 mysqldump | gzip 执行时看不到进度,尤其导出上百 GB 库时容易误判是否卡死。加 pv(pipe viewer)就能实时显示已处理字节数、速率和预估剩余时间。
先确认已安装:apt install pv(Debian/Ubuntu)或 yum install pv(CentOS/RHEL)
带进度的备份命令:
mysqldump -u root -p'yourpass' mydb | pv | gzip > mydb_$(date +%F).sql.gz
常见问题:
宝塔Linux面板11.8.1为官网当前正式版,新增AI建站能力并经过宝塔网站工程师深度调教,开放自定义AI功能API,同时对WAF进行界面重构和深度优化,提升拦截能力与运维效率。
- 如果
pv报 “No size specified” 且进度条不动,是因为mysqldump输出长度未知;可加-w参数粗略估算(如pv -w 2G),但不精确,实际更推荐直接看速率数字(KB/s、MB/s)判断是否正常 -
pv本身几乎不增加延迟,但会占用少量 CPU,对高负载数据库服务器影响轻微
排除特定表或只导结构不导数据,减少备份体积
有些表(如日志表、临时统计表)没必要每次全量备份,或者只想备份表结构用于迁移验证。这时靠 mysqldump 的过滤参数比后期用 sed 或 awk 处理压缩包更高效(因为不进入管道前就筛掉)。
常用组合:
- 跳过某张大表:
mysqldump ... mydb --ignore-table=mydb.large_log_table | gzip > backup.sql.gz - 只导结构(无 INSERT):
mysqldump ... mydb --no-data | gzip > schema_only.sql.gz - 只导数据(无 CREATE TABLE):
mysqldump ... mydb --no-create-info | gzip > data_only.sql.gz
注意:--ignore-table 必须写成 db_name.table_name 格式,漏掉库名会静默失效;多个表要重复写多次该参数,不能用逗号分隔。
定时自动备份 + 保留最近 7 天文件,防止磁盘撑爆
单次手动执行没问题,但长期运行必须加清理逻辑,否则 *.sql.gz 文件越积越多。Linux 的 find 配合 -mtime 最可靠。
完整脚本片段(可放入 /etc/cron.daily/ 或 crontab):
#!/bin/bash BACKUP_DIR="/backup/mysql" DATE=$(date +%F) mysqldump -u root -p'yourpass' --single-transaction mydb | gzip > "$BACKUP_DIR/mydb_$DATE.sql.gz" find "$BACKUP_DIR" -name "mydb_*.sql.gz" -mtime +7 -delete
关键细节:
-
-mtime +7表示“修改时间超过 7 天”,注意不是“创建时间”;mysqldump写入完成即更新 mtime,所以语义正确 - 务必先测试
find ... -delete是否真能匹配到目标文件,可先用-print替代-delete看输出 - 脚本中所有路径、密码、库名都应变量化或抽到配置文件,避免硬编码泄露风险
管道压缩这事看似简单,真正上线时最容易栽在权限(如 mysqldump 用户没 SELECT 权限)、磁盘满(忘了清理旧备份)、或时区导致 $(date) 生成的文件名在跨天 cron 中错乱——这些地方比语法更值得盯紧。










