Oamc

rsync 增量备份与定时任务

本页目录

场景

每天把服务器上的目录同步到备份机,只传变化的部分,保留最近几份快照。

前置条件

  • 两台机器能 SSH 互通(建议用密钥)
  • 目标盘容量够放 N 份快照
  • 想清楚哪些目录要排除(缓存、临时文件)

配置

# 手动跑一次
rsync -avz --delete \
  --exclude 'cache/' --exclude '*.tmp' \
  -e "ssh -p 22" \
  /data/ backup@10.0.0.9:/backup/data/

# 用硬链接保留 7 份快照(只存变化的部分)
rsync -avz --delete \
  --link-dest=/backup/data/latest \
  /data/ backup@10.0.0.9:/backup/data/2026-10-18/
ln -sfn /backup/data/2026-10-18 /backup/data/latest

定时任务:

cat >/etc/cron.d/rsync-backup <<'EOF'
0 2 * * * root /usr/local/bin/backup.sh >> /var/log/rsync-backup.log 2>&1
EOF

验证

rsync -avzn --delete /data/ backup@10.0.0.9:/backup/data/   # -n 只演练
ssh backup@10.0.0.9 'du -sh /backup/data/*'
ssh backup@10.0.0.9 'ls -l /backup/data/latest/'

回滚

rm /etc/cron.d/rsync-backup

已经同步过去的文件按需从快照目录拷回。

坑

  • --delete 会把源端删掉的文件也删掉,先用 -n 演练,确认路径没写错 /data/ 和 /data 是两回事。
  • 源路径带斜杠和不带斜杠,结果完全不同:/data/ 是目录内容,/data 是把目录本身放进去。
  • 硬链接快照要求同一个文件系统,跨盘会退化成全量拷贝。
  • 备份没验证过等于没有,定期挑一份恢复试试。
  • cron 的环境变量和你登录时不一样,脚本里用绝对路径。
  • -z 压缩对已经在网内、CPU 吃紧的场景可能反而慢。