真正起作用的是脚本设计和环境适配:脚本须写死解释器、显式声明完整PATH、关键命令用绝对路径、时间戳%转义;MySQL备份需安全配置文件认证并加四参数;定时任务必须重定向日志、加随机延迟防IO峰值、检查磁盘空间与目录存在性,清理策略应独立于备份脚本。
Linux 自动化备份靠 crontab 调度,但真正起作用的是脚本设计和环境适配。单纯加一条 0 2 * * * /path/backup.sh 很容易静默失败——不是没执行,而是执行了却找不到命令、连不上数据库、日志全丢进黑洞。
crond 启动时环境极简,PATH 常只有 /usr/bin:/bin,mysqldump、rsync、date 等命令可能根本不在路径里。
#!/bin/bash
PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin; export PATH
/usr/bin/mysqldump、/bin/tar、/usr/bin/find
% 字符需转义,例如:date +%Y%m%d_%H%M
MySQL 备份不能只 dump 数据,更不能把密码写在命令行里。
~/.my.cnf(权限必须 chmod 600),内容如下:--single-transaction --routines --triggers --events,缺一不可mysql_app_$(date +%F_%H%M).sql.gz
gzip 压缩后立即校验:gzip -t $FILE,失败则退出并记录错误多个节点或多个任务共用同一时间点,容易打满 I/O;没日志等于没备份。
0 2 * * * /home/app/backup.sh >> /var/log/backup.log 2>&1
sleep $((RANDOM % 300)) 随机延后最多 5 分钟,避免峰值叠加ln -sf $FILENAME latest.sql.gz,方便快速定位备份不清理,三个月后磁盘告警;清理太狠,恢复时发现只剩昨天一份。
cleanup.sh
find /backup -name "mysql_*_*.sql.gz" -mtime +7 -delete
-maxdepth 1 防误删子目录echo 即将删除的文件列表到日志,留痕可查