rsync 默认不启用 --delete 会导致目标端残留旧文件而状态不一致,未加 -z 时大文件传输慢,且仅比对修改时间和大小易漏同步;必须用 SSH 且正确配置密钥认证,参数需按场景定制,并检查退出码、记录日志、结合快照防误删。

rsync 能高效完成跨服务器增量同步,但默认不自动压缩传输、不校验完整性、不处理权限冲突——必须手动加参数控制。
为什么直接 rsync -av 跨服务器容易丢文件
默认不启用 --delete 时,目标端残留的旧文件不会被清理,导致目录状态不一致;未加 -z 时大文件传输慢且占满带宽;更关键的是,rsync 默认只比对修改时间与大小,若源端文件被覆盖但时间戳未更新(如某些 CMS 自动重写配置),就会跳过同步。
- 务必加
--delete保持目标端与源端结构完全一致(先测试加--dry-run) - 对文本类数据(日志、代码、配置)建议加
-z压缩传输,但二进制文件(图片、视频)反而可能变慢 - 需要强一致性时,加上
--checksum强制逐块校验(会显著增加 CPU 开销和时间)
rsync 跨服务器必须用 SSH,但密钥免密登录常配错
rsync 底层依赖 SSH 通道,不是“支持 SSH”,而是“只能走 SSH”。常见错误是只在本地配了密钥,却没把公钥追加到远端 ~/.ssh/authorized_keys 中,或远端 sshd_config 禁用了公钥认证(PubkeyAuthentication no)。
- 验证方式:运行
ssh user@host ls /tmp,能免密执行即通 - 若远端 SSH 端口非 22,必须用
-e "ssh -p 2222"指定,rsync不读取~/.ssh/config的端口别名 - 避免密码交互:绝不要在命令里写
rsync --password-file(这是 rsync daemon 模式用的,和 SSH 冲突)
实际备份命令要分场景写,不能一套参数打天下
备份 Web 目录和备份数据库导出文件,关注点完全不同:前者重权限与软链,后者重原子性与临时文件清理。
- 网站文件同步(保留权限、软链、扩展属性):
rsync -avz --delete --chmod=Du=rwx,Dgo=rx,Fu=rw,Fgo=r -e "ssh -p 2222" /var/www/ user@backup:/backup/www/ - 数据库 SQL 文件备份(忽略临时文件、确保传输完整):
rsync -avz --checksum --exclude='*.tmp' --timeout=300 /data/dump/ user@backup:/backup/dump/ - 如果目标空间紧张,可加
--partial --progress断点续传,但注意--partial会让未传完的文件留在目标端(名字不变),下次同步会覆盖而非续传
定时任务里跑 rsync,最容易忽视退出码和日志
crontab 里只写 rsync ... 而不检查 $?,失败了也无声无息。rsync 成功返回 0,部分失败(如某些文件拒绝访问)返回 23,网络中断返回 10/12 —— 这些都不会触发 cron 的邮件告警(除非你配了 MAILTO)。
- 加简单判断:
rsync ... && echo "$(date) OK" >> /var/log/rsync.log || echo "$(date) FAIL $?" >> /var/log/rsync.log - 避免日志爆炸:用
--log-file=/var/log/rsync-$(date +\%F).log按天轮转(注意 shell 变量需转义 %) - 真正关键的是监控:定期检查
tail -n 20 /var/log/rsync.log里有没有 “rsync error:” 或 “connection unexpectedly closed”
增量逻辑本身没问题,但 rsync 不做版本快照,也不记录哪次同步了哪些变更——它只是让目标“看起来像”源端某时刻的状态。如果源端误删+立即同步,备份就跟着一起丢。真要防误操作,得配合 hardlink 快照(如 rsnapshot)或存储层快照,而不是只靠 rsync 参数。


















