服务器整机迁移数据零丢失教程:服务器整机迁移如何做到数据零丢
迁移前必须做好的三件事
很多新手在迁移服务器时最怕丢数据,其实只要流程对,完全可以做到零丢失。
不管你是换机房、升配置还是跨云搬迁,核心思路都一样:先全量同步,再增量同步,最后短暂停服完成最终同步。
动手之前先确认以下三点:
- 目标服务器环境:操作系统版本、PHP/MySQL/Web 软件版本尽量与原机一致,避免迁移后不兼容。
- 网络与密钥:原机能通过 SSH 免密登录目标机(
ssh-keygen生成密钥,ssh-copy-id复制公钥),如果跨机房网络延迟高,可以先用mtr测一下丢包率。 - 数据量与停机窗口:统计
/data、/www等目录大小,预估首次同步耗时。尽量选业务低峰期操作,预留 30 分钟以上停机时间。
对于宝塔面板用户,推荐同时安装「宝塔一键迁移」插件,它会自动处理网站和数据库,但文件量大时还是建议配合 rsync 做增量同步。
五步完成零数据丢失迁移
1. 首次全量同步(不怕慢,一次到位)
在原服务器上执行下面命令,把网站和数据库文件完整复制到目标机(假设目标机 IP 是 192.168.1.100,数据在 /www 下):
rsync -avz --delete /www/ root@192.168.1.100:/www/
-a保持权限、时间戳、软链接等属性。-v显示进度。-z传输时压缩,节省带宽。--delete删除目标机有但原机没有的文件(保持两边一致)。
数据库如果使用 MySQL,先导出 SQL 文件再同步更安全:
mysqldump -u root -p --all-databases > /root/all.sql
rsync -avz /root/all.sql root@192.168.1.100:/root/
然后在目标机执行 mysql -u root -p < /root/all.sql 导入。
2. 持续增量同步(几乎无感知)
首次同步完成后,再跑几次相同的 rsync 命令。
第二次开始只会传输新增或修改的文件,速度极快,不影响原站运行。
推荐每隔 10 分钟跑一次,跑 2~3 轮,确保数据差异越来越小。
如果网站有用户实时写入,可以在计划停机前再跑一遍:
rsync -avz --delete --progress /www/ root@192.168.1.100:/www/
3. 停服并执行最终同步(零丢失关键)
选择业务最低谷,在原服务器上停止 Web 和数据库服务(宝塔用户在面板里点击对应服务的停止按钮,或命令行 systemctl stop nginx mysql),然后立即执行最后一次 rsync。
这一步会同步停服后产生的缓存文件,确保目标机数据与原机停机瞬间完全一致。
4. 切换域名与配置
- 修改 DNS 解析(A 记录指向目标服务器 IP),如果用了 CDN 也要改源站地址。
- 在目标机启动 Web 和数据库服务:
systemctl start nginx mysql
- 检查
/etc/hosts或程序连接地址是否已指向本机(如果程序内写死了 IP 也要改)。
5. 保留原机一段时间再下线
建议保留原机至少 72 小时,确认新机运行稳定、没有数据丢失再释放资源。
期间不要修改原机数据,以免回滚时不一致。
新手最容易踩的五个坑
- 权限不一致:rsync 时漏掉
-a会导致网站文件 owner 变成 root,访问报 403。解决办法:同步后跑chown -R www:www /www。 - 数据库字符集问题:mysqldump 后导入如果报错,检查目标机 MySQL 的
character_set_server是否与原机一致,建议统一使用utf8mb4。 - 配置文件路径不同:例如 Nginx 的
sites-available目录位置不同。迁移前先确认目标机/etc/nginx/结构,提前创建好软链接。 - 忽略隐藏文件:rsync 默认同步隐藏文件(以
.开头),但如果你用tar打包后解压要注意隐藏文件不会丢失。建议始终使用 rsync。 - 大文件中断:如果单文件超过几 GB,rsync 支持断点续传(
--partial),建议加上--partial --progress参数。
迁移后如何快速验证数据完整性
- 网站是否能正常访问:在浏览器打开首页、文章详情页,确认图片和样式加载正常。
- 文件数量与大小对比:在两侧分别执行
du -sh /www和find /www -type f | wc -l,对比结果是否一致。 - 数据库表行数抽样:比如登录 phpMyAdmin 或执行
SELECT COUNT(*) FROM wp_posts;,两边数值应一样。 - 帖子发布时间、附件链接:抽查几条最新发布的文章,确保上传时间、评论数一致。
如果发现不一致,立刻停止切换,检查最后一次 rsync 是否完成,或者是否有服务未正确停止。
高频问题速答
Q:迁移中途网络断了怎么办?
A:重新执行 rsync,它会自动跳过已同步的部分,继续传输剩下的文件,不用担心重复。
Q:网站很大(几百 GB),rsync 太慢怎么办?
A:可以先用 --bwlimit=20000 限制带宽避免影响原站,或者夜间跑全量同步。也可以在目标机挂载一块数据盘,先将原机数据通过内网传输到第三方中转机再转到目标机。
Q:能不能不停止服务就完成迁移?
A:严格来说做不到完美零丢失。如果你的应用是静态文件或只读数据库,可以在不停服下连续同步,但动态站点(有写操作)不停止服务一定会丢失最后几秒的写入。建议接受短暂停机(比如 5 分钟),换得数据完整。
Q:宝塔一键迁移插件能保证零丢失吗?
A:如果网站文件不复杂可以用,但它内部也是调 rsync 实现的。建议按本文步骤走一次,插件作为辅助验证会更保险。
总结
服务器整机迁移零丢失并不复杂,核心就是“全量 + 增量 + 停服最终同步”三步。
只要提前做好密钥、目录和服务的检查,严格按照顺序操作,通常不会出问题。
如果你正在准备迁移,建议先在测试环境走一遍完整流程,确认无误后再上生产。
记得保留原机至少一周,给自己留足回滚余地。