跳转到主内容
websoft网络软件专家 - 深耕网络技术,打造实用软件!

mysql如何实现数据库备份与压缩导出_结合Linux管道符操作

mysqldump 通过管道直接 | gzip 压缩导出,避免生成中间大文件;支持 --single-transaction 保证一致性、pv 实时监控进度、--ignore-table 等参数灵活过滤,并配合 find 定期清理旧备份。 mysql dump 直接配合 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
常见问题: 如果
pv
报 “No size specified” 且进度条不动,是因为
mysqldump
输出长度未知;可加
-w
参数粗略估算(如
pv -w 2G
),但不精确,实际更推荐直接看速率数字(KB/s、MB/s)判断是否正常
pv
本身几乎不增加延迟,但会占用少量 CPU,对高负载数据库服务器影响轻微 排除特定表或只导结构不导数据,减少备份体积 有些表(如日志表、临时统计表)没必要每次全量备份,或者只想备份表结构用于迁移验证。这时靠
mysqldump
的过滤参数比后期用
sed
或
awk
处理压缩包更高效(因为不进入管道前就筛掉)。 CentOS Linux 7.9.2009 CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。 下载 常用组合: 跳过某张大表:
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 中错乱——这些地方比语法更值得盯紧。

相关文章