
你换了新服务器,配置更高,价格更便宜。但问题来了:旧服务器上的网站、数据库、配置文件,怎么搬过去?
直接打包复制?可能会漏。重装一遍?太慢。最怕的是:搬完之后网站出问题,用户骂你,你还不知道怎么回滚。
今天聊一套完整的服务器迁移流程,覆盖文件、数据库、配置、DNS切换,还有回滚方案。照着做,搬家不出事。
先看一个数据
某云厂商统计,超过30%的服务器迁移任务曾出现不同程度的问题。其中,数据不一致(迁移过程中新数据写入丢失)占一半,配置遗漏(如crontab、Nginx站点配置没迁)占三成。
这些问题不是技术门槛高,是流程不完整。今天把流程补齐。
迁移核心原则:先全量,再增量,最后切换
一次性复制所有数据,中间业务不停,可能会丢新数据。
更好做法:
- 先全量复制:把旧服务器的所有数据先拷过去
- 再增量同步:切换前再同步一次变化的部分
- 最后切换:停旧服,最后一次增量,改DNS
这样能做到“迁移期间新数据不丢”,切过去的时候用户基本无感。
第一步:整理清单——别漏了东西
开始复制前,把旧服务器上的东西列清楚:
| 类型 | 路径/内容 |
|---|---|
| 网站文件 | /var/www/html、自定义路径 |
| 数据库 | MySQL、PostgreSQL、Redis |
| 配置文件 | Nginx、Apache、PHP、MySQL |
| 定时任务 | crontab -l |
| SSL证书 | /etc/letsencrypt/ |
| 系统服务 | systemctl list-unit-files --type=service |
| 用户数据 | /home/、/root/.ssh/ |
可以用这条命令快速导出清单:
bash
find / -type f \( -name "*.conf" -o -name "*.ini" \) 2>/dev/null | grep -E "(nginx|apache|php|mysql)" > config_list.txt
第二步:全量同步(rsync + 先预演)
用rsync做全量同步,它支持断点续传、增量同步。
bash
rsync -avz --progress /var/www/html/ root@新服务器IP:/var/www/html/
关键参数:-a归档保留权限,-v显示细节,-z传输压缩,--progress显示进度。
先预演不实际执行:
bash
rsync -avz --dry-run /var/www/html/ root@新服务器IP:/var/www/html/
看到哪些文件会被同步,确认无误再去掉--dry-run正式执行。
同步完网站文件,继续同步配置文件、SSL证书等:
bash
rsync -avz /etc/nginx/ root@新服务器IP:/etc/nginx/ rsync -avz /etc/letsencrypt/ root@新服务器IP:/etc/letsencrypt/
第三步:迁移数据库
导出数据库:
bash
mysqldump --all-databases --single-transaction --quick --lock-tables=false > all_dbs.sql
传输到新服务器:
bash
rsync -avz all_dbs.sql root@新服务器IP:/root/
新服务器上导入:
bash
mysql < /root/all_dbs.sql
--single-transaction适合InnoDB,保证数据一致性,不锁表。
如果数据库很大(几百GB),直接拷贝物理文件(/var/lib/mysql)更快,但要确保MySQL版本一致且正确停止服务。
第四步:迁移定时任务和系统服务
导出定时任务:
bash
crontab -l > my_crontab.txt rsync -avz my_crontab.txt root@新服务器IP:/root/
新服务器导入:
bash
crontab /root/my_crontab.txt
查看有哪些自启服务:
bash
systemctl list-unit-files --type=service --state=enabled
新服务器上执行相同的systemctl enable操作。
第五步:增量同步(切换前的最后一次)
以上操作完成后,旧服务器还在跑业务。你可能会问:“全量同步之后又产生了新数据怎么办?”
切换前需要再做一次增量同步:
bash
rsync -avz --delete /var/www/html/ root@新服务器IP:/var/www/html/
--delete很关键:会删除新服务器上旧服务器已不存在的文件,保证两边完全一致。
第六步:停机窗口与最后的增量同步
选低峰期,比如凌晨2点:
- 停止旧服务器上的Web服务(
systemctl stop nginx) - 做最后一次数据库导出(生产环境停服后不再有写入)
- 最后一次
rsync同步文件 - 新服务器导入数据库
- 新服务器启动服务(
systemctl start nginx)
把切换操作写成脚本,避免漏步骤,也方便回滚。
第七步:DNS切换与验证
- 修改域名解析记录的TTL为300秒(5分钟),迁移完成后再改回3600秒
- 将域名解析到新服务器IP
- 验证网站功能:登录、下单、搜索、API接口
- 验证SSL证书:浏览器锁标志是否正常
分批切换:对于高可用业务,可以先切部分流量(如修改本地hosts文件测试),验证无误后再全量切。
第八步:回滚方案(最重要的后手)
迁移出了岔子怎么办?有回滚方案就能从容应对。
- 旧服务器服务已停?手动重启:
systemctl start nginx - 域名改回旧IP,TTL值决定生效时长,提前调短TTL能显著缩短回滚时间
- 写一个清晰的回滚检查清单,最好演练过
一个真实案例
一家电商网站从旧云厂商迁移到新家,数据量约150GB,含20多个数据库。用了rsync先全量同步(耗时约3小时),停机窗口只做了最后一次增量同步和数据库导出导入,实际停机时间仅15分钟。切换后小部分用户遇到会话丢失,原因是Redis数据没迁。好在回滚方案迅速,把域名改回旧IP,恢复服务,补迁Redis后再次切换成功。
最后一句
服务器迁移不是“复制粘贴”。清单、全量、增量、切换、回滚,每一步都要有方案。
照着这个流程走一遍,你的搬家任务大概率不需要“熬夜抢救数据”。
下次要换服务器,把这篇文章翻出来,当操作手册用。




