网站迁移到香港服务器避坑指南:数据库迁移 + DNS切换 + 零停机上线全流程

网站迁移到香港服务器避坑指南:数据库迁移 + 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 分钟以内。

Telegram