服务器迁移实战:从旧机器搬家到新机器

服务器迁移实战:从旧机器搬家到新机器

你换了新服务器,配置更高,价格更便宜。但问题来了:旧服务器上的网站、数据库、配置文件,怎么搬过去?

直接打包复制?可能会漏。重装一遍?太慢。最怕的是:搬完之后网站出问题,用户骂你,你还不知道怎么回滚。

今天聊一套完整的服务器迁移流程,覆盖文件、数据库、配置、DNS切换,还有回滚方案。照着做,搬家不出事。


先看一个数据

某云厂商统计,超过30%的服务器迁移任务曾出现不同程度的问题。其中,数据不一致(迁移过程中新数据写入丢失)占一半,配置遗漏(如crontab、Nginx站点配置没迁)占三成。

这些问题不是技术门槛高,是流程不完整。今天把流程补齐。


迁移核心原则:先全量,再增量,最后切换

一次性复制所有数据,中间业务不停,可能会丢新数据。

更好做法:

  1. 先全量复制:把旧服务器的所有数据先拷过去
  2. 再增量同步:切换前再同步一次变化的部分
  3. 最后切换:停旧服,最后一次增量,改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点:

  1. 停止旧服务器上的Web服务(systemctl stop nginx
  2. 做最后一次数据库导出(生产环境停服后不再有写入)
  3. 最后一次rsync同步文件
  4. 新服务器导入数据库
  5. 新服务器启动服务(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后再次切换成功。


最后一句

服务器迁移不是“复制粘贴”。清单、全量、增量、切换、回滚,每一步都要有方案。

照着这个流程走一遍,你的搬家任务大概率不需要“熬夜抢救数据”。

下次要换服务器,把这篇文章翻出来,当操作手册用。

知识库

网站图片批量压缩教程(免费工具+脚本)

2026-5-14 17:33:55

实操指南知识库

SSL_ERROR_BAD_CERT_DOMAIN 错误:原因与解决方案

2024-11-6 13:41:37

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧