MySQL定时自动备份必须依赖操作系统级cron任务配合mysqldump实现,不能由MySQL自身完成;需用--single-transaction(InnoDB)、--routines、--events等参数确保一致性与完整性,并通过~/.my.cnf存密、PATH声明、find清理旧文件及定期恢复验证来保障可靠性。

MySQL 定时自动备份不是靠 MySQL 自身完成的,必须依赖操作系统级定时任务(如 cron)配合 mysqldump 命令实现。纯 MySQL 内部无法触发文件系统写入或调度。
用 mysqldump 生成可恢复的 SQL 备份文件
mysqldump 是最常用、最稳妥的逻辑备份方式,适合中小规模数据库。它导出的是 SQL 文本,可直接用 mysql 命令回放恢复。
- 必须指定
--single-transaction(对 InnoDB 表)避免锁表,否则备份期间写操作可能被阻塞 - 加上
--routines和--events才能备份存储过程和事件调度器对象 - 推荐加
--set-gtid-purged=OFF(如果没开 GTID)或ON(开了 GTID),否则恢复时可能报错GTID_PURGED cannot be changed - 示例命令:
mysqldump -u root -p'password' --single-transaction --routines --events --set-gtid-purged=OFF mydb > /backup/mydb_$(date +\%Y\%m\%d_\%H\%M).sql
用 cron 每天凌晨 2 点执行备份
Linux 下用 cron 是标准做法,但要注意环境变量和路径问题——cron 默认不加载用户的 ~/.bashrc,mysqldump 可能找不到或密码读取失败。
- 在 crontab 中显式声明
PATH,比如:PATH=/usr/local/bin:/usr/bin:/bin - 密码不要写在命令行里(会暴露在
ps输出中),改用配置文件~/.my.cnf,权限必须是600 -
.my.cnf示例:[client] user=root password=your_password host=localhost
- cron 条目示例(每天 2:00 执行):
0 2 * * * /usr/bin/mysqldump --single-transaction mydb > /backup/mydb_$(date +\%Y\%m\%d).sql 2>/dev/null
保留最近 7 天备份,避免磁盘撑满
自动备份不清理旧文件,几个月后磁盘必爆。删除逻辑必须独立于备份命令本身,且不能误删正在写的文件。
- 用
find配合-mtime +7最可靠,比ls | head -n -7 | xargs rm更安全(后者按字母序删,不是时间序) - 建议在备份命令后追加清理:
find /backup -name "mydb_*.sql" -mtime +7 -delete
- 注意:
-delete是find的动作,不是外部命令;若担心误删,先用-print测试 - 别把备份目录放在
/tmp或系统临时分区,那里可能被自动清理
真正麻烦的不是写脚本,而是验证备份是否可用——定期用 mysql 导入一个测试库,确认 SHOW TABLES 和数据行数一致。没人验证的备份,和没备份一样。


















