迁移 VPS 数据时如何用 rsync 保证断点续传且不影响业务

文章导读
迁移 VPS 数据时,用 rsync 配合 -P 参数和 screen 会话管理,可以在网络中断后从断点继续传输,同时通过多次增量同步最小化业务停机时间。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
A A

迁移 VPS 数据时,用 rsync 配合 -P 参数和 screen 会话管理,可以在网络中断后从断点继续传输,同时通过多次增量同步最小化业务停机时间。

先说结论:rsync 的断点续传功能适合大文件迁移场景,但需要正确配置参数并结合会话管理工具才能保证传输不中断。对于动态数据(如数据库),需特殊处理以保证一致性。

  • 适合:几十 GB 以上的静态数据迁移、网络环境不稳定、需要多次同步的场景
  • 先看:源和目标服务器的 rsync 版本、SSH 连接稳定性、磁盘剩余空间
  • 建议:先用小文件测试命令,正式迁移时用 screen 保护会话,数据库等动态数据需停服或使用专用备份工具

命令速用版

基础断点续传命令(本地传到远程):

rsync -avzP /path/to/source/ user@remote_ip:/path/to/destination/

指定 SSH 端口的命令:

rsync -avzP -e 'ssh -p 端口号' /path/to/source/ user@remote_ip:/path/to/destination/

配合 screen 使用(防止会话断开):

screen -S migration
rsync -avzP /path/to/source/ user@remote_ip:/path/to/destination/
# 按 Ctrl+A 然后按 D 退出 screen 会话
# 重新连接后用 screen -d -r migration 恢复

为什么会这样

rsync 的断点续传能力来自两个机制。第一是 `--partial` 参数,它会让 rsync 在传输中断时保留已经传输的部分文件,而不是删除半成品。第二是 rsync 的块级差异检测算法,它会把文件分成固定大小的数据块,分别计算校验和,中断后重新执行命令时,rsync 会对比源端和目标端的校验和,只传输不匹配的块。

这和 SCP 有本质区别。SCP 传输中断后需要从头重传整个文件,而 rsync 只需要传剩下的部分。对于大文件迁移,这个差异会直接影响迁移时间和成功率。

但 rsync 本身不能防止 SSH 会话断开。如果 putty 或终端连接断了,rsync 进程会被终止。这就是为什么要配合 screen 或 tmux 使用——它们能在后台保持会话,即使网络断开,服务器端的 rsync 进程还在运行。

分步处理

第一步:检查环境

在源服务器和目标服务器上分别执行:

rsync `--version`
which rsync

确认两台机器都安装了 rsync。大多数 Linux 系统默认已安装,如果没有,Debian/Ubuntu 用 sudo apt-get install rsync,CentOS/RedHat 用 sudo yum install rsync。

第二步:测试 SSH 连接

ssh user@remote_ip

能正常登录再执行 rsync。如果 SSH 端口不是默认的 22,需要在 rsync 命令中用 -e 参数指定。建议配置 SSH 密钥免密登录,避免交互式输入密码导致脚本中断。

第三步:首次全量同步

screen -S migration
rsync -avzP /data/ user@remote_ip:/backup/data/

这里 -a 是归档模式,会递归传输并保持文件权限和时间戳;-v 显示详细信息;-z 启用压缩;-P 同时启用 `--partial` 和 `--progress`,实现断点续传和进度显示。

进入 screen 后按 Ctrl+A 然后按 D 可以退出会话但保持命令运行。之后即使本地网络断开,服务器端的 rsync 还在继续。

第四步:中断后恢复

如果传输中断了,重新 SSH 登录服务器,执行:

screen -d -r migration

如果 screen 会话还在,会直接恢复。如果会话没了,直接重新执行相同的 rsync 命令即可,rsync 会自动从断点继续。

第五步:业务切换前增量同步

首次同步完成后,业务还在旧服务器运行。在计划停机时间前,再执行一次相同的 rsync 命令:

rsync -avzP /data/ user@remote_ip:/backup/data/

这次只会传输第一次同步后新增或修改的文件,通常几分钟就能完成。确认同步完成后,再切换 DNS 或停止旧服务器服务。

怎么验证是否生效

检查传输进度

rsync 的 -P 参数会实时显示进度,包括已传输量、速度和预计剩余时间。如果看到进度条在走,说明传输正常。

迁移 VPS 数据时如何用 rsync 保证断点续传且不影响业务

检查文件完整性

同步完成后,在源和目标服务器上分别执行:

du -sh /path/to/source/
du -sh /path/to/destination/

对比两个目录的大小是否一致。还可以抽样检查关键文件的 md5:

md5sum /path/to/important_file

检查 screen 会话状态

screen -ls

能看到正在运行的会话列表。如果有 detached 状态的会话,说明 rsync 还在后台运行。

查看 rsync 退出码

命令执行完后检查退出码:

echo $?

返回 0 表示成功,非 0 表示有错误。常见错误码可以在 rsync 手册中查询。

常见坑

路径末尾的斜杠

rsync 对源路径末尾的斜杠很敏感。/data/ 和 /data 效果不同:前者同步目录内容,后者同步目录本身。建议统一用 /data/ 格式,避免目标目录多出一层嵌套。

权限问题

如果目标目录权限不足,rsync 会报错。确保目标用户有写入权限。若必须使用 sudo 执行远程 rsync,需配置 sudoers 免密,否则命令会卡在密码输入环节导致超时。

大文件传输时的超时

网络不稳定时,SSH 连接可能超时断开。可以在 SSH 配置中增加 KeepAlive 设置,或者直接用 screen 保护会话。

磁盘空间不足

传输前检查目标服务器磁盘空间:df -h。如果空间不够,rsync 会中途失败,虽然能断点续传,但会浪费时间。

动态数据一致性风险

如果迁移的是数据库或正在写入的日志文件,直接 rsync 运行中的数据文件会导致数据损坏或不一致。对于数据库,必须停止服务后再同步数据文件,或者使用 mysqldump/pg_dump 导出 SQL 文件后再同步。不要在数据库运行时直接 rsync 其数据目录。

慎用 `--delete` 参数

如果在命令中添加了 `--delete` 参数,源目录中删除的文件也会在目标目录被删除。若源目录配置错误为空,可能导致目标数据被清空。首次同步建议不加此参数,确认无误后再在增量同步中使用。

符号链接和特殊文件

-a 参数会保留符号链接,但不会跟随链接。如果需要同步链接指向的实际文件,需要用 -L 参数。特殊文件如设备文件、管道文件可能需要额外处理。