MySQL跨服务器迁移数据核心是保障一致性、完整性与过程可控,常用方法包括逻辑导出导入、物理拷贝、主从切换和在线工具;中小数据量且允许短暂停机时宜用mysqldump逻辑迁移,加--single-transaction可减锁。

MySQL跨服务器迁移数据,核心是确保数据一致性、完整性和迁移过程可控。常用方法有逻辑导出导入、物理文件拷贝、主从复制切换和在线迁移工具四类,选哪种取决于数据量、停机窗口、版本兼容性及是否需要零中断。
逻辑导出导入(适合中小数据量、允许短暂停机)
使用 mysqldump 导出 SQL 文件,再在目标服务器执行导入。优点是简单、跨版本兼容性好、可过滤库表;缺点是大库耗时长、锁表影响业务。
- 导出单库(加 --single-transaction 减少锁):
mysqldump -h源IP -u用户 -p --single-transaction --routines --triggers db_name > db_name.sql - 导入前确认目标库已创建,再执行:
mysql -h目标IP -u用户 -p db_name - 超大库建议分表导出,或用 --where 分批导出,避免内存溢出
物理文件拷贝(适合同版本、同架构、停机时间极短)
直接拷贝数据目录(如 /var/lib/mysql/xxx_db),要求源目 MySQL 版本一致、操作系统位数相同、文件系统支持硬链接(如 XFS/ext4),且目标实例必须停止。
- 源库执行 FLUSH TABLES WITH READ LOCK;,记下 SHOW MASTER STATUS; 的 binlog 位置(便于后续追平)
- 拷贝对应数据库目录到目标服务器的 data 目录下,注意属主改为 mysql:mysql
- 目标库启动前,检查 my.cnf 中 innodb_file_per_table 等关键参数是否一致
主从复制 + 切换(适合中大型库、需最小化停机)
将目标服务器配置为源库的从库,同步完成后停写源库、等待追平、提升从库为主库,再切应用连接。
- 源库开启 binlog(log-bin=binlog)、设置 server-id,并授权复制账号
- 目标库用 CHANGE REPLICATION SOURCE TO(8.0.23+)或 CHANGE MASTER TO(旧版)指向源库
- START REPLICA 后观察 SHOW REPLICA STATUS\G,确认 Seconds_Behind_Source ≈ 0 再切流
- 切换时先在源库 FLUSH TABLES WITH READ LOCK;,记下位点,再停写应用、等从库追平、执行 STOP REPLICA,最后提升
在线迁移工具(适合超大库、不能停机、多版本混合场景)
推荐 gh-ost(GitHub 开源)或 pt-online-schema-change(Percona Toolkit),它们通过影子表+触发器实现无锁变更,但迁移整库需配合脚本或组合方案;也可用 MyDumper/MyLoader 替代 mysqldump,支持多线程、压缩、断点续传。
- MyDumper 示例:
mydumper -h源IP -u用户 -p密码 -B db_name -o /backup/ --threads=4 --compress - MyLoader 导入:
myloader -h目标IP -u用户 -p密码 -B db_name -d /backup/ --threads=4 - gh-ost 不直接用于整库迁移,但可配合 binlog 解析工具(如 Maxwell、Canal)做实时增量同步










