MySQL需结合cron与mysqldump实现自动备份:编写含压缩、清理、日志的脚本,配置~/.my.cnf认证,设置定时任务,并建议验证备份、异地保存及大库优化。

MySQL 本身不内置定时备份功能,需要结合操作系统(如 Linux 的 cron)和命令行工具(如 mysqldump)来实现自动备份。核心思路是:写好备份脚本 → 设置定时任务 → 定期执行并保留历史版本。
用 mysqldump 做基础备份
mysqldump 是最常用、轻量且可靠的逻辑备份方式,适合中小规模数据库。基本命令如下:
- 备份单个库:
mysqldump -u用户名 -p密码 --single-transaction 数据库名 > /backup/dbname_$(date +\%F).sql - 备份多个库:
mysqldump -u用户名 -p密码 --single-transaction --databases db1 db2 > /backup/multi_$(date +\%F).sql - 备份所有库:
mysqldump -u用户名 -p密码 --single-transaction --all-databases > /backup/all_$(date +\%F).sql
注意:加 --single-transaction 可保证 InnoDB 表的一致性快照;避免在命令中明文写密码(有安全风险),建议用 ~/.my.cnf 配置文件存认证信息。
编写可复用的备份脚本
把备份逻辑封装成 shell 脚本,便于维护和定时调用。例如创建 /opt/scripts/mysql_backup.sh:
#!/bin/bash BACKUP_DIR="/backup/mysql" DATE=$(date +\%Y\%m\%d_\%H\%M) mkdir -p $BACKUP_DIR使用配置文件中的账号(~/.my.cnf)
mysqldump --single-transaction --all-databases | gzip > $BACKUPDIR/full$DATE.sql.gz
只保留最近7天的备份
find $BACKUPDIR -name "full*.sql.gz" -mtime +7 -delete
给脚本执行权限:chmod +x /opt/scripts/mysql_backup.sh。确保 ~/.my.cnf 内容类似:
[client] user = backup_user password = your_secure_password
并设为仅属主可读:chmod 600 ~/.my.cnf。
用 cron 设置定时任务
编辑 root 或专用用户的 crontab:sudo crontab -e,添加一行:
- 每天凌晨2点执行:
0 2 * * * /opt/scripts/mysql_backup.sh - 每周日3点全备,工作日只备关键库:
0 3 * * 0 /opt/scripts/mysql_backup.sh full和0 3 * * 1-6 /opt/scripts/mysql_backup.sh critical(需在脚本中判断参数)
保存后 cron 会自动加载。可用 sudo systemctl status cron(Debian/Ubuntu)或 sudo systemctl status crond(CentOS/RHEL)确认服务运行正常。
补充建议:验证与异地保存
自动备份只是第一步,还需保障备份真正可用:
- 定期手动解压并尝试导入一小部分数据,验证 SQL 文件完整性
- 把备份文件同步到另一台服务器或对象存储(如 rsync + 阿里云 OSS / AWS S3),防止单点故障
- 在脚本末尾加入日志记录,例如
echo "$(date): Backup done" >> /var/log/mysql_backup.log - 对大库考虑分库备份或使用
mydumper(支持多线程、更高效)替代 mysqldump
不复杂但容易忽略。










