rsync 断点续传与同步验证:避免把文件传错或删错

大文件传输中断后,重新从头开始很浪费;多次发布时,重复传送未变化文件也没有必要。rsync 可以比较两侧文件并传输需要更新的部分。本文以 Ubuntu 24.04 两端、通过 SSH 同步普通文件为例,源文件在传输期间保持稳定,目标使用独立暂存目录。它不直接解决运行中数据库的一致性备份问题。

先确认传输方向和目录语义

下面约定本机或源服务器的 /srv/export/ 为源目录,远程 /srv/staging/release-20260905/ 为本次目标,账号和地址须替换。目标目录由管理员预先创建并赋予合适权限,不能与正在运行的站点目录混用。

源目录末尾的斜杠影响复制层级:/srv/export/ 表示复制该目录里的内容;省略斜杠时,通常会把目录本身作为一层复制过去。第一次使用先画出期望目录树,再检查预演输出。rsync 官方手册专门说明了这些路径规则。

用预演确认会发生什么

在源端运行:

# Ubuntu 源端;目标为独立暂存目录
rsync -rltvn --itemize-changes -e 'ssh -p 22' /srv/export/ deploy@203.0.113.10:/srv/staging/release-20260905/

-n 表示预演,不真正写入;-rlt 递归处理目录、保留符号链接和修改时间。这里没有直接采用归档模式的全部权限、属主等行为,避免把源端身份关系误套到目标。需要保留权限或特殊文件时,应先按应用要求设计,不是习惯性增加一个参数。

核对来源、目标、嵌套层级和预计变化数量。源目录中的符号链接会作为链接传输,若指向发布范围外的路径,部署前必须检查。预演不能保证真实运行时权限与空间一定足够,仍需在目标检查可写范围和可用容量。

保留中断文件,再重试同一任务

确认预演正确后,去掉预演参数并增加部分文件目录:

rsync -rltv --partial-dir=.rsync-partial --info=progress2 -e 'ssh -p 22' /srv/export/ deploy@203.0.113.10:/srv/staging/release-20260905/

传输中断后,保持源文件和目标不变,重新运行同一命令即可利用已保存的部分数据。.rsync-partial 是本次任务辅助目录,不应放到不可信用户可以改写的共享位置。不要手工把任意残缺文件拼接到正式文件后面。

续传不意味着必然只发送精确的“剩余字节”,具体行为取决于两端版本、文件状态和算法。不要随意改用 --inplace--append 追求看似更快的结果,这些选项会改变文件更新与错误恢复的边界。Ubuntu 24.04 的 rsync 手册提供对应版本的选项说明。

传输完成后再做内容核对

默认比较通常依据大小与修改时间判断是否需要更新,不代表它对所有现有文件都重新做了全量内容比较。重要交付可增加一次只读校验预演:

rsync -rltcn --itemize-changes -e 'ssh -p 22' /srv/export/ deploy@203.0.113.10:/srv/staging/release-20260905/

-c 让选择更新对象时使用校验和比较,代价是两端需要读取相应文件。它适合有明确验收需要时使用,不应无条件加入所有高频同步任务。执行完记录退出码;源文件持续变化可能产生不同结果,应该先冻结导出副本再验收。

该命令没有删除选项,所以目标额外文件不会自动消失。确认“源文件都已正确传到”与确认“两边文件集合完全相同”是两个检查,需要对照目录清单分别完成。单个关键发布包还可以额外核对独立摘要。

不把同步当成备份,也不默认删除

--delete 会移除目标中源端不存在的对象。源路径写错、源盘未挂载或筛选规则变动时,它可能把错误扩大到目标,因此本示例不使用删除同步。确实要维护镜像目录,应保留独立备份、预演删除列表并人工确认目标后再实施。

普通文件同步不会保证数据库处于同一个事务时间点。数据库应先生成应用认可的导出或快照,再同步稳定副本。发布失败时保留旧版本,把新文件留在暂存区排查;只有校验和应用测试通过后,才进行正式切换。这样网络中断只是一次可以重试的传输,而不会直接破坏在线目录。

参考资料

继续阅读

返回天理云文章中心

分享到:
上一篇
SFTP 安全传文件:路径、权限与上传后验证
下一篇
Linux 文件权限怎么改:chmod、chown 与目录权限
服务中心
企微客服
企微客服
给您高效服务
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意