迁移 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 参数会实时显示进度,包括已传输量、速度和预计剩余时间。如果看到进度条在走,说明传输正常。
检查文件完整性
同步完成后,在源和目标服务器上分别执行:
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 参数。特殊文件如设备文件、管道文件可能需要额外处理。