rsync 增量同步:传大文件不用每次都从头来
用 scp 传一个几 GB 的备份文件,传到一半断网,重传又得从头开始——这种事遇过一次就不想再遇第二次。rsync 就是为这种场景生的:它只传变化的部分,断点续传、中断重来都不怕,日常同步目录也比 scp 省事得多。
最常用的基本用法
rsync -avz /data/app/ user@remote:/data/app/
三个参数拆开看:-a 是归档模式,保留权限、时间戳、软链接这些属性;-v 显示过程;-z 传输时压缩,文件多、文本多的时候效果明显。注意源目录末尾的斜杠有讲究:/data/app/ 表示同步目录里的内容,/data/app(不带斜杠)则会把 app 这个目录本身也同步过去——路径写错一次,目标端就多出一层目录。
第一次同步和 scp 没区别,第二次开始差别就出来了:没变的文件直接跳过,只传新增和改动过的文件,几 GB 的目录第二次可能几秒就跑完。
断点续传:关键是 --partial
rsync -avz --partial --progress /data/big.tar.gz user@remote:/backup/
--progress 显示每个文件的传输进度,--partial 保留没传完的临时文件——下次再跑同一条命令,它会从断点处继续,而不是删掉重传。大文件、弱网络环境下,这两个参数几乎是必加的。
如果还想更保险,可以再加 --append-verify:它从已有部分后面接着传,传完再校验一次完整性,适合“文件本身不会中途被改写”的备份场景。
只同步、不同步删除:小心 --delete
rsync -avz --delete /data/app/ user@remote:/data/app/
--delete 会把目标端多余的文件删掉,让两边完全一致——做镜像、做发布时很有用,但也最容易误伤:源目录路径写错、或者源目录一时是空的,目标端的文件就会被成片删掉。
所以我的习惯是:第一次用 --delete 之前,先加 --dry-run 演练一遍:
rsync -avz --delete --dry-run /data/app/ user@remote:/data/app/
演练只打印“会传什么、会删什么”,不真正动手。确认删除列表里没有不该删的文件,再去掉 --dry-run 真正执行。这个习惯多花十秒,能避免一次误删事故。
排除不需要的文件
日志、缓存、临时文件没必要同步,用 --exclude 排除:
rsync -avz --exclude 'logs/' --exclude '*.tmp' /data/app/ user@remote:/data/app/
排除规则多了可以写进文件,用 --exclude-from=exclude.txt 统一管理,一行一条。备份脚本里把排除清单固定下来,以后每次同步的行为都是一致的,不会因为某次手敲漏了参数就把几个 GB 的日志也传过去。
一个日常备份的组合
给自己的服务器做每日备份,我常用的就是这一条:
rsync -avz --partial --delete --exclude 'logs/' /data/app/ user@backup:/backup/app/
逻辑很简单:只传变化的部分保证速度,--partial 保证断网可续传,--delete 保证备份端和源端一致,--exclude 保证不把日志也备份进去。配合 crontab 每天凌晨跑一次,备份这件事就从“记得做”变成了“自动做”。
下次要传大文件或者同步目录,先别急着 scp:rsync 多敲几个参数,省下来的是每次重传的时间,和断网时的一次心惊。
- 点赞
- 收藏
- 关注作者
评论(0)