核心是rsync增量同步与crontab定时调度结合:用rsync -a --delete实现源目标完全镜像,排除临时目录;按数据变更频率设定合理周期(如配置文件每日2:15、上传目录每小时);通过flock加锁防重复执行,并重定向日志;定期验证备份可用性。

用 crontab 实现服务器文件定时镜像备份,核心是结合 rsync 做增量同步 + crontab 控制执行时机。关键不是“每小时拷一次”,而是确保备份一致、可恢复、不干扰业务。
一、准备可靠的 rsync 镜像命令
镜像备份推荐用 rsync --delete 模式,它能真正保持源与目标完全一致(新增、修改、删除都会同步)。注意加安全和稳定参数:
- 用 -a(归档模式)保留权限、时间戳、软硬链接
- 加 -v 显示过程(调试时有用),生产环境可去掉
- --delete 删除目标端多余文件,实现“镜像”语义
- --exclude=‘/tmp/’ 这类排除临时目录,避免备份垃圾
- 建议加 --rsync-path="sudo rsync"(如需 root 权限同步系统目录)
示例(本地备份到挂载的 NAS):
rsync -a --delete --exclude='/proc/' --exclude='/sys/' --exclude='/dev/' /home/ user@backup-server:/backup/server-home/
二、用 crontab 设置合理执行周期
不要盲目设成每5分钟一次。根据数据变更频率选策略:
- 核心配置文件(如 nginx/conf、mysql/my.cnf):每天凌晨 2:15 执行
- 用户上传目录(如 /var/www/uploads):每小时同步一次(如 15 分)
- 数据库导出后再备份(非直接 rsync .ibd):配合 mysqldump 定时生成 SQL,再 rsync 该文件
编辑当前用户定时任务:crontab -e,添加类似行:
# 每天 2:15 备份 home 目录到远程服务器<br>15 2 * * * rsync -a --delete /home/ user@backup-server:/backup/home/ 2>&1 >> /var/log/backup-home.log
三、加锁防重复 + 日志记录
网络延迟或脚本卡住可能导致上一次还没结束,下一次又触发。简单加锁方式:
- 用
flock包裹 rsync 命令(推荐) - 手动 touch 锁文件 + 检查存在性(兼容老系统)
- 所有 cron 任务必须重定向 stdout/stderr 到日志,否则失败无声无息
带锁的 crontab 示例:
15 2 * * * flock -n /tmp/backup-home.lock -c 'rsync -a --delete /home/ user@backup-server:/backup/home/ 2>&1 >> /var/log/backup-home.log'
四、验证备份可用性
定时任务跑成功 ≠ 备份能用。每月至少做一次还原测试:
- 随机抽一个备份目录,用 rsync -n(dry-run)检查差异
- 在测试机上 rsync --delete 回灌少量文件,确认权限/时间戳正常
- 对数据库备份,定期用 mysql -e "source xxx.sql" 验证语法可执行
别等硬盘坏了才想起看 log —— 把 /var/log/backup-*.log 加入日常巡检项。











