ESC

开始输入,可搜索发票、服务、域名、工单,以及 更多...

搜索... Ctrl+K
Linux 服务器

网站服务器迁移教程:rsync与mysqldump零停机搬家

5 个步骤 8 分钟阅读 6 次阅读 0
本文目录

更换机房、升级配置或从其他服务商搬家时,最担心的就是数据丢失和长时间停机。本文介绍一套经过大量实践验证的迁移流程:用 rsync 增量同步文件、用 mysqldump 迁移数据库、提前降低 DNS TTL 平滑切换,大部分网站可以把停机时间控制在几分钟以内。

要点速览

  • 平滑的网站服务器迁移关键在于提前降低 DNS TTL、先全量同步再增量同步、在新服务器测试通过后再切换 DNS。
  • 迁移前应至少提前 24 小时把网站 A 记录的 DNS TTL 降到 300 秒甚至 60 秒,让各地 DNS 缓存在切换前过期。
  • rsync 的首次全量同步可以在网站正常运行时进行,最终增量同步只传输变化的文件,因此速度很快。
  • 对于 InnoDB 表,mysqldump 的 --single-transaction 参数可以在不锁表的情况下导出一致性快照。
  • IMIDC 为在香港、日本、新加坡、美国等地开通云服务器或独立服务器的客户提供免费迁移协助服务。

适用环境 / 准备工作

  • 源服务器与目标服务器均为 Linux(Ubuntu、Debian、Rocky Linux、AlmaLinux 等)
  • 两台服务器都能以 root 或 sudo 用户 SSH 登录,并已安装 rsync
  • 目标服务器已部署与源服务器相同或兼容的运行环境(Nginx/Apache、PHP、MySQL/MariaDB)

安装 rsync:

# Debian / Ubuntu
apt install -y rsync
# RHEL / Rocky / AlmaLinux
dnf install -y rsync

迁移前检查清单

检查项 说明
完整备份 迁移前对源服务器做一次完整备份或快照
磁盘空间 用 df -h 和 du -sh 确认目标盘空间充足
软件版本 对比 PHP、MySQL、Nginx 版本,避免高版本不兼容
配置文件 记录虚拟主机配置、计划任务(crontab -l)、SSL 证书位置
硬编码 IP 检查程序或配置中是否写死了旧服务器 IP
邮件与第三方 确认 MX 记录、API 白名单、支付回调地址等是否依赖旧 IP
DNS TTL 至少提前 24 小时降低 TTL

操作步骤

一、提前降低 DNS TTL

登录域名 DNS 管理后台,将网站相关 A 记录的 TTL 从默认值(常见为 3600 秒或更长)改为 300 秒甚至 60 秒。这一步要在正式切换前至少等待一个原 TTL 周期,各地递归 DNS 缓存才会过期。可以用下面的命令查看当前 TTL:

dig example.com A +noall +answer

输出中域名后的数字即剩余 TTL 秒数。

二、配置 SSH 密钥,免密传输

在目标服务器上生成密钥并推送到源服务器(采用"拉取"方式,便于在新机器上操作):

ssh-keygen -t ed25519 -N "" -f ~/.ssh/id_ed25519
ssh-copy-id -p 22 root@源服务器IP

三、用 rsync 首次全量同步文件

在目标服务器上执行(示例同步网站目录):

rsync -avzP -e "ssh -p 22" root@源服务器IP:/var/www/ /var/www/

参数说明:-a 归档模式,保留权限、属主和时间戳;-v 显示详情;-z 传输压缩;-P 显示进度并支持断点续传。注意源路径末尾的 / 表示同步目录内容,漏写会多嵌套一层目录。

正式执行前,可以加 -n(--dry-run)预览将要传输的文件;需要排除缓存或日志目录时使用 --exclude:

rsync -avzPn --exclude 'cache/' --exclude '*.log' -e "ssh -p 22" root@源服务器IP:/var/www/ /var/www/

首次全量同步可以在网站正常运行时进行,不影响业务。

四、用 mysqldump 迁移数据库

在源服务器导出数据库。对于 InnoDB 表,--single-transaction 可以在不锁表的情况下得到一致性快照:

mysqldump -u root -p --single-transaction --routines --triggers --events --default-character-set=utf8mb4 dbname | gzip > /root/dbname.sql.gz

传输到目标服务器:

rsync -avP -e "ssh -p 22" root@源服务器IP:/root/dbname.sql.gz /root/

在目标服务器上创建数据库与用户并导入:

mysql -u root -p -e "CREATE DATABASE dbname CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;"
mysql -u root -p -e "CREATE USER 'dbuser'@'localhost' IDENTIFIED BY '强密码'; GRANT ALL PRIVILEGES ON dbname.* TO 'dbuser'@'localhost'; FLUSH PRIVILEGES;"
gunzip < /root/dbname.sql.gz | mysql -u root -p dbname

导入后可以抽查表数量是否一致:

mysql -u root -p -e "SELECT COUNT(*) FROM information_schema.tables WHERE table_schema='dbname';"

五、在新服务器上测试

不修改 DNS,而是在本地电脑的 hosts 文件中把域名临时指向新 IP(Windows 位于 C:\Windows\System32\drivers\etc\hosts,macOS/Linux 为 /etc/hosts):

203.0.113.20  example.com www.example.com

逐一检查首页、登录、上传、支付回调等关键功能,确认无误后删除这条 hosts 记录。

六、最终增量同步并切换 DNS

  1. 在源站开启维护模式或暂停写入,避免切换期间产生新数据。
  2. 再次执行 rsync,此时只会传输变化的文件,速度很快。如需让目标目录与源目录完全一致,可加 --delete(会删除目标端多余文件,请谨慎使用)。
  3. 重新导出并导入一次数据库。
  4. 修改 DNS 的 A 记录指向新服务器 IP。由于 TTL 已降低,几分钟内大部分访客即会访问到新服务器。
  5. 观察新服务器访问日志,确认流量已切换后,再把 TTL 调回正常值。

建议源服务器保留至少 3–7 天再释放,以便需要时回滚。

常见问题 FAQ

rsync 传输中断了怎么办?

直接重新执行同一条命令即可,rsync 会跳过已传完的文件,-P 参数还支持大文件断点续传。

数据库很大,导出太慢怎么办?

可以加 --quick 减少内存占用,并通过管道压缩边导出边传输;数十 GB 以上的数据库可以考虑物理备份工具(如 Percona XtraBackup 或 mariabackup)或主从复制方式迁移。

迁移后网站中文乱码?

一般是导出与导入时字符集不一致。请确保导出时指定 --default-character-set=utf8mb4,目标数据库同样使用 utf8mb4。

切换 DNS 后部分用户仍访问旧服务器?

这是部分运营商 DNS 缓存未过期所致,通常在原 TTL 时间内自然消失。这也是旧服务器需要保留几天的原因。

总结

一次平滑的迁移,关键在于"提前降 TTL、先全量后增量、测试后再切换"。如果你计划把网站或业务搬到 IMIDC,我们提供免费迁移协助服务:在香港、日本、新加坡、美国等地开通云服务器或独立服务器后,提交工单说明源环境与迁移需求,技术人员会与你沟通具体方案和时间窗口;迁移过程中有任何疑问,也可以随时通过 7x24 小时工单获得支持。

相关阅读

这篇文章有帮助吗?

相关教程