如何实施MySQL跨不同服务器之间的数据迁移操作?
- 内容介绍
- 文章标签
- 相关推荐
面对70GB的大型数据库,普通的导出‑导入方式往往需要数小时甚至更久的停机导致业务中断。又因为迁移过程会锁表、产生数据不一致,团队常常在选择工具和方案时犹豫不决。
痛点一的观点是,耗时长、业务中断
传统mysqldump导出后在目标服务器导入。整个过程会:
- 锁定源表,阻塞写操作。
- 对大文件进行传输,耗时长且易受网络波动影响。按理说,
- 无法实现“零停机”。业务高峰期尤其不可接受,
痛点二这方面,版本兼容与一致性风险
直接拷贝数据目录时要求:
- 源与目标MySQL版本完全相同。
- 操作程序位数、文件程序类型保持一致。
- 目标实例必须停止运行,否则文件损坏。
说到痛点三,工具选择混乱
行业市场上出现了多种迁移方案,但如何挑选合适的工具却是另一道难题:
-
gh-ost / pt-online-schema-change -
Mydumper / MyLoader
至于关键需求。
- 零停机或最小停机窗口
- 高吞吐量
- 可靠的断点续传功能
- 保证数据完整性与一致性 .
-
# 简单、跨版本兼容好:
`mysqldump -uuser -ppass --single-transaction --quick --lock-tables=false dbname> db.sql`
`
- # 缺点: 单线程、无压缩、不能断点续传;对大库耗时极长, `
- # 场景: 小型数据库或非业务高峰期迁移。 `
- # 优势: 可并行处理多张表;支持gzip压缩,提供断点续传功能。 `
- # 要求: 需自行安装并配置Mydumper/MyLoader。 `
- # 场景: 大规模数据库,需要较快完成迁移。 `
- 在目标服务器设置为源库的"从库".
- 让复制完成并达到同步状态后对源库执行。
- 等待从库追平所有 binlog 条目。
- 从库为主库这方面,`ALTER DATABASE …SET READ WRITE` 或者 `CHANGE MASTER TO MASTER_HOST='none';`.
- 更新应用连接指向新主库;旧主库可继续做备份或下线。
- No downtime – 写操作持续进行,只是在切换前短暂暂停。
- xtrabackup + Percona XtraBackup <-> rsync 等组合方案,实现无锁在线备份+恢复。
- "Zero‑downtime" 必须 → gh-ost 或 pt-online-schema-change。但两者都需要影子表和触发器,在写密集型环境下会产生额外负载。怎么说呢,
- "Large scale & high throughput" → MyDumper/MyLoader 加 gzip + 并行度调整。可在不中断业务的前提下完成快速转储与加载。
- "简单快速 & 可接受短暂停机" → mysqldump 或物理拷贝。但请确保版本匹配,并预留足够时间处理锁表和 binlog 回放。 ` Li>
- 提前规划: 确认带宽、磁盘IO 与 CPU 配置是否能满足搬运需求。不过,
- *测试环境复现*: 在非生产环境先跑一次完整流程。以确认各步脚本正常运行且时间估计准确。Li>
-
监控日志: 在整个过程中关注 binlog 状态、复制延迟还有 GH-Ost/pt-online-schema-change 的错误报告。Li>
li>*安全备份*: 即使采用物理拷贝。也务必保留一份原始数据副本,以防意外覆盖或丢失。Li>' li>*容量预留*: 确保目标服务器至少比原始实例多10~20% 空间,以避免因临时占用过高导致 OOM 或磁盘满载。Li>' li>*灾难恢复计划*: 切换前做好回滚方法,如通过CHANGE MASTER TO MASTER_HOST='';` 将从库重新回到原主,
主要迁移方法概览
1. 逻辑导出+导入
Mysqldump:
Mydumper + MyLoader:
2. 数据目录物理拷贝
# 前提条件详见痛点二。 # 一旦满足条件。可在目标机器上直接开启服务,无需 导入SQL脚本。. ` **注意**的观点是。若目标机器与源机器使用不同的磁盘阵列或文件程序,请先备份再执行。3. 主从复制 + 切换
步骤概览的观点是,
说到优点。
4. 在线迁移工具
工具名称 主要特性 适用场景 Mysql Live Migration by gh-ost - 利用影子表 + 行级触发器实现无锁迁移 - 支持在线切换 - 自动监控错误 - 大型数据库 - 对写操作有严格延迟要求 - 无法覆盖非常旧版本 MySQL XtraDB Cluster / Galera Cluster - 多活节点同步 - 内置冲突解决 - 高可用架构 - 对事务隔离级别有特殊要求 - 用触发器捕获变更。实现几乎无停机结构变更 - 支持分批同步 - 对结构变更频繁的数据仓库 - 必须兼容 Percona/Oracle MySQL - 多线程转储/加载 - gzip 压缩 - 支持断点续传和恢复失败任务 - 大数据量 的全库或部分表迁移 - 在网络不稳定环境下使用
至于关键选型建议,
实战步骤示例
# 步骤1:准备目标服务器 sudo systemctl stop mysql # 步骤2:使用MyDumper导出源数据库 mydumper -u root -p password -B source_db -o /tmp/source_dump \ --no-data --compress=gzip --threads=8 # 步骤3:将DDL转到目标服务器并创建空数据库 scp /tmp/source_dump/*.sql.gz user@target:/tmp/ ssh user@target "zcat /tmp/*.sql.gz | mysql -u root -ppassword" # 步骤4:使用gh-ost启动在线DDL转换 ssh user@target "gh-ost \ --source-host=:3306 \ --source-user=root \ --source-pass=password \ --target-db=somedatabase \ --table='somedatabase.*' \ --alter=\"DROP INDEX old_index_name\"" # 步骤5:等GH-Ost完成日志同步后再做全量数据拷贝 mydumper -u root -p password -B source_db -o /tmp/full_dump \ --compress=gzip --threads=16 scp /tmp/full_dump/*.sql.gz user@target:/tmp/ ssh user@target "zcat /tmp/*.sql.gz | mysql -u root -ppassword" # 步骤6:检查同步状态,接下来停止来源写操作并切换主库。# ... 常用方法汇总
H2这方面,
面对70GB的大型数据库,普通的导出‑导入方式往往需要数小时甚至更久的停机导致业务中断。又因为迁移过程会锁表、产生数据不一致,团队常常在选择工具和方案时犹豫不决。
痛点一的观点是,耗时长、业务中断
传统mysqldump导出后在目标服务器导入。整个过程会:
- 锁定源表,阻塞写操作。
- 对大文件进行传输,耗时长且易受网络波动影响。按理说,
- 无法实现“零停机”。业务高峰期尤其不可接受,
痛点二这方面,版本兼容与一致性风险
直接拷贝数据目录时要求:
- 源与目标MySQL版本完全相同。
- 操作程序位数、文件程序类型保持一致。
- 目标实例必须停止运行,否则文件损坏。
说到痛点三,工具选择混乱
行业市场上出现了多种迁移方案,但如何挑选合适的工具却是另一道难题:
-
gh-ost / pt-online-schema-change -
Mydumper / MyLoader
至于关键需求。
- 零停机或最小停机窗口
- 高吞吐量
- 可靠的断点续传功能
- 保证数据完整性与一致性 .
-
# 简单、跨版本兼容好:
`mysqldump -uuser -ppass --single-transaction --quick --lock-tables=false dbname> db.sql`
`
- # 缺点: 单线程、无压缩、不能断点续传;对大库耗时极长, `
- # 场景: 小型数据库或非业务高峰期迁移。 `
- # 优势: 可并行处理多张表;支持gzip压缩,提供断点续传功能。 `
- # 要求: 需自行安装并配置Mydumper/MyLoader。 `
- # 场景: 大规模数据库,需要较快完成迁移。 `
- 在目标服务器设置为源库的"从库".
- 让复制完成并达到同步状态后对源库执行。
- 等待从库追平所有 binlog 条目。
- 从库为主库这方面,`ALTER DATABASE …SET READ WRITE` 或者 `CHANGE MASTER TO MASTER_HOST='none';`.
- 更新应用连接指向新主库;旧主库可继续做备份或下线。
- No downtime – 写操作持续进行,只是在切换前短暂暂停。
- xtrabackup + Percona XtraBackup <-> rsync 等组合方案,实现无锁在线备份+恢复。
- "Zero‑downtime" 必须 → gh-ost 或 pt-online-schema-change。但两者都需要影子表和触发器,在写密集型环境下会产生额外负载。怎么说呢,
- "Large scale & high throughput" → MyDumper/MyLoader 加 gzip + 并行度调整。可在不中断业务的前提下完成快速转储与加载。
- "简单快速 & 可接受短暂停机" → mysqldump 或物理拷贝。但请确保版本匹配,并预留足够时间处理锁表和 binlog 回放。 ` Li>
- 提前规划: 确认带宽、磁盘IO 与 CPU 配置是否能满足搬运需求。不过,
- *测试环境复现*: 在非生产环境先跑一次完整流程。以确认各步脚本正常运行且时间估计准确。Li>
-
监控日志: 在整个过程中关注 binlog 状态、复制延迟还有 GH-Ost/pt-online-schema-change 的错误报告。Li>
li>*安全备份*: 即使采用物理拷贝。也务必保留一份原始数据副本,以防意外覆盖或丢失。Li>' li>*容量预留*: 确保目标服务器至少比原始实例多10~20% 空间,以避免因临时占用过高导致 OOM 或磁盘满载。Li>' li>*灾难恢复计划*: 切换前做好回滚方法,如通过CHANGE MASTER TO MASTER_HOST='';` 将从库重新回到原主,
主要迁移方法概览
1. 逻辑导出+导入
Mysqldump:
Mydumper + MyLoader:
2. 数据目录物理拷贝
# 前提条件详见痛点二。 # 一旦满足条件。可在目标机器上直接开启服务,无需 导入SQL脚本。. ` **注意**的观点是。若目标机器与源机器使用不同的磁盘阵列或文件程序,请先备份再执行。3. 主从复制 + 切换
步骤概览的观点是,
说到优点。
4. 在线迁移工具
工具名称 主要特性 适用场景 Mysql Live Migration by gh-ost - 利用影子表 + 行级触发器实现无锁迁移 - 支持在线切换 - 自动监控错误 - 大型数据库 - 对写操作有严格延迟要求 - 无法覆盖非常旧版本 MySQL XtraDB Cluster / Galera Cluster - 多活节点同步 - 内置冲突解决 - 高可用架构 - 对事务隔离级别有特殊要求 - 用触发器捕获变更。实现几乎无停机结构变更 - 支持分批同步 - 对结构变更频繁的数据仓库 - 必须兼容 Percona/Oracle MySQL - 多线程转储/加载 - gzip 压缩 - 支持断点续传和恢复失败任务 - 大数据量 的全库或部分表迁移 - 在网络不稳定环境下使用
至于关键选型建议,
实战步骤示例
# 步骤1:准备目标服务器 sudo systemctl stop mysql # 步骤2:使用MyDumper导出源数据库 mydumper -u root -p password -B source_db -o /tmp/source_dump \ --no-data --compress=gzip --threads=8 # 步骤3:将DDL转到目标服务器并创建空数据库 scp /tmp/source_dump/*.sql.gz user@target:/tmp/ ssh user@target "zcat /tmp/*.sql.gz | mysql -u root -ppassword" # 步骤4:使用gh-ost启动在线DDL转换 ssh user@target "gh-ost \ --source-host=:3306 \ --source-user=root \ --source-pass=password \ --target-db=somedatabase \ --table='somedatabase.*' \ --alter=\"DROP INDEX old_index_name\"" # 步骤5:等GH-Ost完成日志同步后再做全量数据拷贝 mydumper -u root -p password -B source_db -o /tmp/full_dump \ --compress=gzip --threads=16 scp /tmp/full_dump/*.sql.gz user@target:/tmp/ ssh user@target "zcat /tmp/*.sql.gz | mysql -u root -ppassword" # 步骤6:检查同步状态,接下来停止来源写操作并切换主库。# ... 常用方法汇总
H2这方面,

