0aa8fe6
这次没有正文改动。
这是 linux/rsync 增量备份与定时任务.md 的改动记录。后台每次保存都会留一份快照,
这里显示的是快照之间的差异,不会混入其他文章的改动。
还没有后台修改记录。
下面是 Git 里的提交,可能包含其他文章的改动(因为一次提交会带上工作区所有变化)。
0aa8fe6
这次没有正文改动。
be5956e
@@ -0,0 +1,65 @@ +--- +tags: [备份, rsync, cron] +order: 80 +--- + +# rsync 增量备份与定时任务 + +## 场景 + +每天把服务器上的目录同步到备份机,只传变化的部分,保留最近几份快照。 + +## 前置条件 + +- 两台机器能 SSH 互通(建议用密钥) +- 目标盘容量够放 N 份快照 +- 想清楚哪些目录要排除(缓存、临时文件) + +## 配置 + +```bash +# 手动跑一次 +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 +``` + +定时任务: + +```bash +cat >/etc/cron.d/rsync-backup <<'EOF' +0 2 * * * root /usr/local/bin/backup.sh >> /var/log/rsync-backup.log 2>&1 +EOF +``` + +## 验证 + +```bash +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/' +``` + +## 回滚 + +```bash +rm /etc/cron.d/rsync-backup +``` + +已经同步过去的文件按需从快照目录拷回。 + +## 坑 + +- **`--delete` 会把源端删掉的文件也删掉**,先用 `-n` 演练,确认路径没写错 `/data/` 和 `/data` 是两回事。 +- 源路径带斜杠和不带斜杠,结果完全不同:`/data/` 是目录内容,`/data` 是把目录本身放进去。 +- 硬链接快照要求同一个文件系统,跨盘会退化成全量拷贝。 +- 备份没验证过等于没有,定期挑一份恢复试试。 +- cron 的环境变量和你登录时不一样,脚本里用绝对路径。 +- `-z` 压缩对已经在网内、CPU 吃紧的场景可能反而慢。