在Linux服务器上保障MySQL数据安全的底线操作,就是定期把数据备份出来。借助系统自带的crontab调度能力和MySQL发行的mysqldump客户端,不需要引入第三方付费软件,就能搭建出稳定的每日备份流程。核心思路是:先写一个包含mysqldump命令的Shell脚本,处理掉密码传递和文件命名,再向crontab里添加一条每天执行的记录。

一、为什么选mysqldump加crontab
mysqldump是MySQL官方提供的逻辑备份工具,它会连上数据库,把每个表的结构与数据生成对应的SQL语句文本。这种文本备份方便阅读,也能在表结构变更后仍然用旧备份在新实例上重放恢复。对于数据量在几十GB以内、可接受短暂读锁的场景,它是最省心的方案。
crontab则是Linux下最基础的定时任务管理器。每个用户有自己的crontab文件,里面按分钟、小时、日、月、周几定义何时运行哪条命令。把备份脚本交给crontab,就能在业务低峰期自动跑起来,完全不需要人守着终端。两者结合属于轻量、透明、易排查的组合。
二、编写备份脚本
直接把密码写在命令行虽然能用,但会被ps命令看到,也不利于维护。更稳妥的做法是在脚本里通过环境变量或配置文件传入凭证,并给备份文件加上日期后缀,方便后续清理。
下面给出一个简单的每日全库备份脚本,使用root账号导出所有库,压缩后按天存放。注意脚本里用到了MYSQL_PWD环境变量,部分新版本MySQL会提示不安全,也可改用客户端的配置文件段。
#!/bin/bash
# MySQL每日备份脚本
export MYSQL_PWD='your_password'
BACKUP_DIR=/data/backup/mysql
DATE=$(date +%Y%m%d)
# 若备份目录不存在则创建
mkdir -p $BACKUP_DIR
# 使用mysqldump导出所有数据库并压缩
mysqldump -h 127.0.0.1 -u root --all-databases --single-transaction > $BACKUP_DIR/all_$DATE.sql
gzip $BACKUP_DIR/all_$DATE.sql
# 删除七天前的备份
find $BACKUP_DIR -name "all_*.sql.gz" -mtime +7 -exec rm -f {} ;
脚本中--single-transaction对InnoDB表很关键,它利用事务保证备份一致性且不会长时间锁表。如果实例里还有MyISAM表,则需考虑在低峰期加--lock-all-tables。压缩和清理两步让磁盘占用可控,避免备份把根分区写满。
三、配置crontab定时任务
把上面的脚本保存为/usr/local/bin/mysql_backup.sh,并赋予执行权限后,就可以登记到crontab了。假设希望每天凌晨两点十分执行,用crontab -e打开当前用户的任务表,追加一行。
下面的示例里给出了完整时间字段含义,前五个位置分别是分、时、日、月、周,后面接要运行的命令。务必使用脚本的绝对路径,且保证crontab运行环境能找到mysqldump可执行文件,必要时在脚本里export PATH。
# 每天02:10执行MySQL备份 10 2 * * * /usr/local/bin/mysql_backup.sh >> /var/log/mysql_backup.log 2>&1
配置完成后,可用crontab -l确认任务已写入。初期建议手动先跑一次脚本,确认生成的sql.gz文件正常,再观察第二天日志有无报错。很多备份失败案例都源于crontab的精简环境变量找不到命令,或目录权限不足导致写不进备份文件。
四、常见坑点与改进
第一个坑是权限。crontab通常以对应用户身份运行,如果备份目录属主不是该用户,mysqldump能连上库却写不出文件。第二个坑是MySQL 8之后默认使用caching_sha2_password,老客户端可能连不上,需要确认账号认证插件兼容。
另一个容易被忽视的点是备份有效性。只生成文件不算完,应定期把备份恢复到临时实例验证。可以在脚本末尾加一步校验gzip -t,或者在周日照一次恢复演练。只有真正能还原的备份,才叫备份。
| 问题现象 | 可能原因 | 处理方式 |
|---|---|---|
| 备份文件大小为0 | 密码错误连不上库 | 检查MYSQL_PWD或配置文件权限 |
| 邮件收到crontab报错 | PATH中无mysqldump | 脚本内export PATH或写绝对路径 |
| 磁盘突然满 | 未清理旧备份 | 保留find清理逻辑并监控容量 |
当数据量增长到上百GB,逻辑备份耗时和锁竞争会变明显,那时再考虑物理备份工具如xtrabackup或云厂商快照。但在中小业务场景,crontab配合mysqldump依旧是性价比最高的每日兜底方案。