mysqldump 通过管道直接 | gzip 压缩导出,避免生成中间大文件;支持 --single-transaction 保证一致性、pv 实时监控进度、--ignore-table 等参数灵活过滤,并配合 find 定期清理旧备份。
mysql
dump 直接配合 gzip 压缩导出,避免生成中间大文件
MySQL 本身不内置压缩导出功能,但 Linux 管道能让
的标准输出直接喂给
,跳过写入磁盘的 .sql 明文文件。这对磁盘空间紧张或备份大库(比如几十 GB)的场景很关键——否则先 dump 出几百 MB 的 SQL,再 gzip,既耗空间又多一次 I/O。
实操命令示例:
注意点:
对 InnoDB 表保证一致性快照,但对 MyISAM 无效(需加
)
后不带空格直接跟密码,虽方便但会出现在进程列表里(
可见),生产环境建议用
配置文件存凭证
默认压缩级别是 6,如需更快可加
(最低压缩比),要更小体积可加
(但 CPU 占用明显上升)
用 pv 实时查看导出进度和速率
纯
执行时看不到进度,尤其导出上百 GB 库时容易误判是否卡死。加
(pipe viewer)就能实时显示已处理字节数、速率和预估剩余时间。
先确认已安装:
(Debian/Ubuntu)或
(CentOS/RHEL)
带进度的备份命令:
常见问题:
如果
报 “No size specified” 且进度条不动,是因为
输出长度未知;可加
参数粗略估算(如
),但不精确,实际更推荐直接看速率数字(KB/s、MB/s)判断是否正常
本身几乎不增加延迟,但会占用少量 CPU,对高负载数据库服务器影响轻微
排除特定表或只导结构不导数据,减少备份体积
有些表(如日志表、临时统计表)没必要每次全量备份,或者只想备份表结构用于迁移验证。这时靠
的过滤参数比后期用
或
处理压缩包更高效(因为不进入管道前就筛掉)。
CentOS Linux 7.9.2009
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
下载
常用组合:
跳过某张大表:
只导结构(无 INSERT):
只导数据(无 CREATE TABLE):
注意:
必须写成
格式,漏掉库名会静默失效;多个表要重复写多次该参数,不能用逗号分隔。
定时自动备份 + 保留最近 7 天文件,防止磁盘撑爆
单次手动执行没问题,但长期运行必须加清理逻辑,否则
文件越积越多。Linux 的
配合
最可靠。
完整脚本片段(可放入
或 crontab):
关键细节:
表示“修改时间超过 7 天”,注意不是“创建时间”;
写入完成即更新 mtime,所以语义正确
务必先测试
是否真能匹配到目标文件,可先用
替代
看输出
脚本中所有路径、密码、库名都应变量化或抽到配置文件,避免硬编码泄露风险
管道压缩这事看似简单,真正上线时最容易栽在权限(如
用户没 SELECT 权限)、磁盘满(忘了清理旧备份)、或时区导致
生成的文件名在跨天 cron 中错乱——这些地方比语法更值得盯紧。
mysqldumpgzipmysqldump -u root -p'yourpass' --single-transaction --routines --triggers mydb | gzip > mydb_$(date +%F).sql.gz--single-transaction--lock-all-tables-pps aux~/.my.cnfgzip-1-9mysqldump | gzippvapt install pvyum install pvmysqldump -u root -p'yourpass' mydb | pv | gzip > mydb_$(date +%F).sql.gzpvmysqldump-wpv -w 2Gpvmysqldumpsedawkmysqldump ... mydb --ignore-table=mydb.large_log_table | gzip > backup.sql.gzmysqldump ... mydb --no-data | gzip > schema_only.sql.gzmysqldump ... mydb --no-create-info | gzip > data_only.sql.gz--ignore-tabledb_name.table_name*.sql.gzfind-mtime/etc/cron.daily/#!/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 +7mysqldumpfind ... -delete-print-deletemysqldump$(date)