文章资讯 / 云服务器 / 服务器迁移数据同步:rsync增量同步网站文件+mysqldump导出导入数据库

服务器迁移数据同步:rsync增量同步网站文件+mysqldump导出导入数据库

发布时间: 分类:云服务器 作者:188mi 来源:互联网 阅读:89

服务器迁移同步数据,文件靠 rsync 增量、数据库靠 mysqldump 导出导入,是成本和可控性最平衡的组合。先停写或锁表,再跑文件、导数据库、最后核对,这个顺序别颠倒。

两类数据先分开看:文件的"多而碎"与数据库的"少而整"

网站文件是几十万个小文件:图片、静态页、缓存、日志,特点是多而碎;数据库通常就几个数据文件,但内部状态必须自洽,特点是少而整。前者怕漏传,后者怕不一致。所以别指望一个工具通吃:文件树交给 rsync,逻辑数据交给 mysqldump,这是迁移里最不容易翻车的分工。

rsync 对比 scp / tar / FTP:增量同步赢在哪

scp、tar、FTP 的共同点是每次都要全量重来:一个几十 G 的站点改了几张图,重新传一遍的代价是大文件全部白跑。FTP 客户端看着像增量,实际靠文件大小和时间戳比对,碰上几十万小文件,光是握手和列目录就能耗掉几个小时。rsync 用增量传输加校验,只传变化的块,支持断点续传,还能直接走 SSH 加密通道。

第一次先干跑,看看要动哪些文件:

rsync -avz --dry-run --delete --exclude-from=/root/rsync-exclude.txt -e "ssh -p 22" /www/wwwroot/example.com/ root@1.2.3.4:/www/wwwroot/example.com/

确认无误后去掉 --dry-run 正式执行。参数含义:-a 保留权限、属主与时间戳,-z 传输时压缩,--delete 让目标端与源端严格一致,--exclude-from 排除缓存和日志目录,--bwlimit=5000 限速到约每秒 5MB 避免占满线上带宽,-P 显示进度并支持续传。第一次同步结束后再跑一遍,如果输出只剩少量条目,说明增量已经收敛,这时候再安排停机窗口。

mysqldump 对比物理拷贝与主从复制:一致性优先还是速度优先

三种做法各有代价,按停机窗口选:

  • mysqldump 逻辑导出:适合几十 G 以内的库。跨 MySQL 版本、跨云厂商、跨存储引擎都能搬,缺点是导入慢,大库恢复可能要几十分钟到数小时。
  • 物理拷贝或 xtrabackup:适合几百 G 以上的库,速度快,但要求版本号、页大小、存储引擎一致,热拷贝步骤错了容易把库搞坏。
  • 主从复制:适合不能长时间停机的业务。从库追平后停写切换,代价是多一台实例和一段配置调试时间。

导出命令:

mysqldump -uroot -p --single-transaction --quick --default-character-set=utf8mb4 \
  --routines --triggers --events --databases mydb > /data/mydb.sql

--single-transaction 让 InnoDB 拿到一致性快照,不必锁表;--quick 避免整表读进内存;--routines --triggers --events 把存储过程、触发器、事件一并带走,漏了这三项是迁移后功能异常的常见原因。MyISAM 表不吃这套,还是得先 FLUSH TABLES WITH READ LOCK。

导入在目标机执行:

mysql -uroot -p --default-character-set=utf8mb4 mydb < /data/mydb.sql

导入前先确认目标库字符集和 sql_mode 与源库一致,否则容易出现中文乱码或时间字段默认值报错。导入后用 SHOW TABLE STATUS 看行数,用 CHECKSUM TABLE 对关键表做校验。

迁移前后最容易两边不一致的几处

  • 配置文件里写死的 IP、域名、绝对路径,尤其是缓存目录和上传目录
  • Nginx/Apache 的伪静态、rewrite、301 规则,两台机器的规则文件经常不是同一份
  • crontab 与计划任务:日志切割、备份脚本、队列消费进程
  • 运行时版本与扩展:PHP、Node、Redis、imagick、opcache 参数
  • 属主与权限:rsync -a 会保留 uid/gid,目标机没有同号用户时会变成 nobody,跨机迁移建议加 --numeric-ids,迁完再统一 chown
  • 指向绝对路径的软链接、SSL 证书路径与自动续签脚本

怎么选:按站点规模挑组合

  • 单站、数据量 10G 以内:rsync 加 mysqldump 一套走完,停机窗口十分钟量级,最省心。
  • 多站、文件量大:先不停业务跑一遍全量 rsync,再挑低峰期锁写、跑增量、导出导入数据库,窗口能压到几分钟。
  • 数据库大且不能停:先搭主从,从库追平后停写切换,文件侧照旧用 rsync。
  • 想连环境一起搬:面板自带的一键迁移、容器镜像导出本质也是打包,黑盒程度高,出问题不好定位,建议还是手动过一遍 rsync 和 mysqldump。

切流量之前,先用 hosts 或临时域名验证新站:dig 域名 +short 看解析,curl -I http://新IP -H "Host: 域名" 看状态码和响应头,确认页面正常后再改 DNS。旧机别急着关,保持只读观察一两天,确认没有漏传的文件和没跑起来的任务。

相关工具与阅读