网站搬家:文件、数据库与域名迁移不中断

用 rsync 搬文件、mysqldump 迁数据库,先验证再切 DNS,提前降 TTL 做到零停机。

把网站从旧服务器搬到新 VPS,最怕的就是"切换那一刻站点打不开"。只要按"先搭好新站、验证通过、再切 DNS"的顺序走,就能做到几乎不中断。下面是一套可以照抄的流程。

一、提前降低 DNS TTL

这是最容易被忘、却最关键的一步,必须在搬家前 12 天做。到你的域名解析后台,把网站主记录(如 @ 和 www)的 TTL 从默认的 3600 秒改成 300(5 分钟)甚至 60。TTL 决定了全球 DNS 缓存多久失效,提前降低,等真正切换时旧解析很快过期,回滚也快。搬家彻底完成、稳定几天后,再把 TTL 调回去。

二、打包并传输站点文件

在旧服务器上把站点目录打包,注意保留权限和软链接:

cd /var/www
tar --numeric-owner -czpf site.tar.gz html

传到新机(在新机上拉取,或用 rsync 直传):

rsync -avz -e ssh /var/www/html/ user@新机IP:/var/www/html/

rsync 支持增量同步,搬完后再跑一次只传改动的文件,能把"最后一次同步"的窗口缩到最短。

三、导出与导入数据库

在旧服务器导出(以 MySQL/MariaDB 为例):

mysqldump -u root -p --single-transaction --routines --triggers mydb > mydb.sql

--single-transaction 保证导出期间数据一致且不锁表。把 mydb.sql 传到新机后导入:

mysql -u root -p -e "CREATE DATABASE mydb CHARACTER SET utf8mb4;"
mysql -u root -p mydb < mydb.sql

别忘了在新库里创建应用用的账号并授权,和旧站保持一致。

四、修改配置指向新库

编辑网站配置文件(如 WordPress 的 wp-config.php、Laravel 的 .env),把数据库主机、库名、用户名、密码改成新机上的值。若数据库和网站在同一台机,DBHOST 用 127.0.0.1 即可。

五、切 DNS 前先验证

不要直接改 DNS。先在你自己电脑上用 hosts 把域名强行指到新机,单独验证:

# Linux/macOS 编辑 /etc/hosts;Windows 是 C:\Windows\System32\drivers\etc\hosts
203.0.113.20  example.com www.example.com

然后浏览器访问域名,逐项核对:首页、登录、图片、后台、支付回调都正常吗?确认无误再删掉这行。

六、正式切 DNS 并收尾

在解析后台把 A 记录(或 AAAA)指向新机 IP。因为 TTL 已降到 5 分钟,几分钟内全球即可生效。切换后做最后一次 rsync 增量同步和数据库补差,把切换窗口内产生的新数据补上。用 dig example.com 确认解析已指向新 IP。

观察新站访问日志和错误日志,确认流量已全部转移、旧站不再有真实请求后,再保留旧站几天作为回滚保险,最后才下线、注销旧机。

小结

网站搬家不中断的核心只有两条:提前降 TTL 和 先在 hosts 里验证再切 DNS。按"传文件 → 迁库 → 改配置 → hosts 验证 → 切 DNS → 补差 → 下线旧站"的顺序走,配合 rsync 增量和 mysqldump --single-transaction,就能把停机时间压到用户几乎无感。