网站迁移到香港服务器避坑指南:数据库迁移 + DNS切换 + 零停机上线全流程
将运行中的网站迁移到香港服务器,最大的风险是数据丢失和停机时间过长。很多人迁移时犯同一个错误:直接修改 DNS,结果 TTL 还没过期,新旧服务器同时接收请求,数据库出现双写冲突。本文提供一套经过验证的零停机迁移流程,适用于 WordPress、WooCommerce、Laravel、自建 API 等各类 Web 应用。
一、迁移前检查清单
| 检查项 | 说明 | 完成 |
|---|---|---|
| 当前 DNS TTL | 查询并记录,提前 48 小时降低到 300 秒 | □ |
| 数据库大小 | 评估迁移时间,大库需要分批迁移 | □ |
| 文件存储大小 | 上传文件、媒体库总大小 | □ |
| 定时任务 | 记录所有 crontab 内容 | □ |
| 环境变量/配置文件 | 记录所有 .env 和配置文件 | □ |
| 第三方 IP 白名单 | 支付回调、OAuth 回调等是否需要更新 IP | □ |
| SSL 证书 | 香港服务器需重新申请 | □ |
| 邮件服务 | SMTP 配置是否绑定了旧服务器 IP | □ |
二、降低 DNS TTL(迁移前 48 小时)
<code"># 在 DNS 服务商将 A 记录的 TTL 从默认值(通常 3600 秒)降低到 300 秒 # 这样 DNS 切换后最多 5 分钟内全球生效 # 验证 TTL 是否已生效 dig A yourdomain.com +short dig A yourdomain.com | grep TTL # 等待 48 小时(让旧 TTL 的缓存全部过期)后再进行迁移
三、MySQL 数据库迁移
<code"># ── 方法一:mysqldump(适合 10GB 以下的数据库)── # 在旧服务器导出(锁表模式,确保数据一致性) mysqldump \ --single-transaction \ # InnoDB 表无需锁表 --quick \ # 大表逐行输出(不加载到内存) --routines \ # 包含存储过程 --triggers \ --events \ -uroot -p \ mydb > /backup/mydb_$(date +%Y%m%d_%H%M%S).sql # 查看导出文件大小 ls -lh /backup/mydb_*.sql # 传输到香港服务器(rsync 支持断点续传) rsync -avz --progress \ /backup/mydb_*.sql \ root@香港服务器IP:/backup/
<code"># 在香港服务器导入 # 创建数据库和用户 mysql -uroot -p << 'EOF' CREATE DATABASE mydb CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; CREATE USER 'appuser'@'localhost' IDENTIFIED BY 'StrongDBPass2026'; GRANT ALL PRIVILEGES ON mydb.* TO 'appuser'@'localhost'; FLUSH PRIVILEGES; EOF # 导入数据(大文件建议用 pv 查看进度) apt install -y pv pv /backup/mydb_*.sql | mysql -uroot -p mydb # 验证数据完整性 mysql -uroot -p -e "SELECT COUNT(*) FROM mydb.orders;" # 对比旧服务器的行数
<code"># ── 方法二:xtrabackup(适合 10GB+ 大数据库,物理备份速度快 3~5 倍)── # 旧服务器安装 xtrabackup apt install -y percona-xtrabackup-80 # 创建全量备份 xtrabackup --backup \ --target-dir=/backup/xb/ \ --user=root \ --password=your_password # 应用日志(准备阶段) xtrabackup --prepare --target-dir=/backup/xb/ # 传输到香港服务器 rsync -avz --progress /backup/xb/ root@香港服务器IP:/backup/xb/ # 香港服务器恢复 systemctl stop mysql xtrabackup --copy-back --target-dir=/backup/xb/ chown -R mysql:mysql /var/lib/mysql systemctl start mysql
四、文件和代码迁移
<code"># rsync 增量同步(第一次同步主要文件后,迁移窗口前再增量同步)
rsync -avz --progress --delete \
/var/www/mysite/ \
root@香港服务器IP:/var/www/mysite/
# 同步上传文件目录(WordPress uploads 等)
rsync -avz --progress \
/var/www/mysite/wp-content/uploads/ \
root@香港服务器IP:/var/www/mysite/wp-content/uploads/
# 权限修复
ssh root@香港服务器IP "chown -R www-data:www-data /var/www/mysite && \
find /var/www/mysite -type d -exec chmod 755 {} \; && \
find /var/www/mysite -type f -exec chmod 644 {} \;"五、香港服务器配置验证(DNS 切换前)
<code"># 在 hosts 文件中临时绑定域名到香港 IP,验证网站是否正常运行 # (不影响线上用户,只有本机看到新服务器) # macOS / Linux: echo "香港服务器IP yourdomain.com www.yourdomain.com" >> /etc/hosts # Windows(管理员权限): # 编辑 C:\Windows\System32\drivers\etc\hosts 添加同样内容 # 现在通过浏览器访问 yourdomain.com 会看到香港服务器的页面 # 全面验证: # ✅ 首页加载正常 # ✅ 登录功能正常 # ✅ 数据库读写正常(提交一个测试订单) # ✅ 图片/静态文件加载正常 # ✅ SSL 证书有效 # ✅ 邮件发送正常 # 验证完成后,从 hosts 中移除临时绑定 sed -i '/yourdomain.com/d' /etc/hosts
六、零停机 DNS 切换流程
<code"> 迁移窗口(建议选择流量最低的凌晨时段): T-10分钟: ├── 最后一次文件增量同步(rsync) ├── 最后一次数据库增量同步(mysqldump --where="updated_at > '2026-07-15 03:00:00'") └── 旧服务器切换为只读模式(防止数据继续写入) T-0: └── 在 DNS 控制台将 A 记录改为香港服务器 IP T+1分钟: └── 验证 DNS 解析:dig A yourdomain.com @8.8.8.8 T+5分钟(TTL=300时): └── 大多数用户已切换到香港服务器 └── 检查香港服务器访问日志确认有新流量进入 T+15分钟: └── 全球 DNS 基本生效 └── 监控错误日志,无异常则迁移成功 └── 旧服务器继续保留 48 小时作为回滚保障
七、数据库最终同步(关键步骤)
<code"># 切换 DNS 前,同步这段时间内产生的新数据 # 只导出最近增量变化的数据(以 orders 表为例) mysqldump -uroot -p mydb orders \ --where="updated_at > '迁移开始时间'" \ > /tmp/orders_increment.sql # 传输并在香港服务器导入 rsync /tmp/orders_increment.sql root@香港服务器IP:/tmp/ ssh root@香港服务器IP "mysql -uroot -p mydb < /tmp/orders_increment.sql"
八、迁移后必须更新的配置
<code"># 1. WordPress 数据库中的站点 URL(如果新服务器 IP 不同) # wp-config.php 通常不需要改(域名不变) # 但如果开发时用了临时 IP 访问,需要更新: mysql -u appuser -p mydb -e " UPDATE wp_options SET option_value='https://yourdomain.com' WHERE option_name='siteurl'; UPDATE wp_options SET option_value='https://yourdomain.com' WHERE option_name='home'; " # 2. 更新支付平台 IP 白名单(Stripe/PayPal 回调 IP) # 登录 Stripe Dashboard → Webhooks → 更新源 IP # 3. 更新 OAuth 回调 URL(如 Google/GitHub 登录) # 通常只需要确认域名相同即可,无需更新 IP # 4. 更新邮件服务 SPF/DKIM 记录 # 如果使用了旧服务器 IP 做 SPF 验证 dig TXT yourdomain.com | grep spf
九、回滚方案
<code"># 如果迁移后发现问题,快速回滚到旧服务器 # 将 DNS A 记录改回旧服务器 IP # 由于 TTL=300,5分钟内流量回到旧服务器 # 注意:迁移窗口期间旧服务器切换只读后,新服务器上写入的数据无法自动回滚 # 需要手动从香港服务器导出迁移窗口期内的新数据,再导入旧服务器 # 因此:小流量站点可以在迁移窗口完全停止旧服务器写入 # 高流量站点建议在流量最低时段执行,并做好接受少量数据损失的预案
十、总结
网站迁移到香港服务器最重要的三个步骤:提前降低 TTL → 在香港服务器完整验证后再切换 DNS → 保留旧服务器 48 小时作为回滚保障。绝大多数迁移事故都发生在跳过「香港服务器验证」步骤,直接切换 DNS 后才发现配置问题,此时回滚成本极高。按本文流程操作,迁移停机时间可以控制在 5 分钟以内。