MySQL 数据迁移与增量同步怎么做?全量迁移、实时同步与低停机切换指南

举报
数据库技术 发表于 2026/10/09 19:02:14 2026/10/09
【摘要】 详解 MySQL 全量迁移、增量同步、数据校验及 NineData 低停机切换实践。

在数据库上云、跨云迁移、版本升级、机房搬迁或系统拆分过程中,MySQL 数据迁移通常不能只做一次全量导入。
如果全量迁移需要数小时,源库在此期间仍会产生新增、修改和删除数据。只执行全量迁移,会导致目标库在完成时已经落后于源库。因此,生产环境通常需要采用以下组合方案:
  1. 结构迁移:在目标端创建库、表、索引等对象。
  2. 全量迁移:复制迁移开始前已经存在的数据。
  3. 增量同步:持续解析源端 Binlog,将后续变更同步到目标端。
  4. 数据校验:检查源端与目标端的数据是否一致。
  5. 业务割接:短暂暂停写入,完成最终追平和连接切换。
  6. 回退保障:在观察期内保留源库和必要的反向同步链路。
NineData 将结构复制、全量复制、增量复制、数据对比、异常告警和差异修复整合在一个任务中,适合 MySQL 上云、跨云迁移以及 MySQL 到其他数据库的数据同步场景。

一、为什么全量迁移后还需要增量同步

假设一个 MySQL 数据库包含数百GB数据,全量复制需要4小时。
在这4小时内,业务仍可能产生:
  • 新增订单;
  • 用户信息更新;
  • 数据删除;
  • 表结构变更;
  • 大事务批量写入。
如果只做全量迁移,目标库只能得到迁移任务开始时的数据状态,无法覆盖迁移期间产生的变化。
NineData 的典型迁移流程是:

1.PNG



全量复制完成后,增量任务继续运行。当目标端追平源端,并且复制延迟降到可接受范围后,再进入业务割接阶段。

二、迁移前需要确认的条件

  1. Binlog 配置

使用 MySQL 作为增量同步源端时,需要开启 Binlog。NineData 明确要求:
binlog_format = ROW binlog_row_image = FULL
如果作为源端的 MySQL 本身是一台复制从库,还需要配置:
log_slave_updates = ON
ROW 格式记录实际发生变化的行,binlog_row_image=FULL 会记录行变更所需的完整信息,有利于增量同步工具准确还原更新和删除操作。
STATEMENT 或 MIXED 不符合 NineData 给出的源端配置要求。
还需要根据全量迁移时间、增量积压和异常恢复时间,合理设置 Binlog 保留周期。否则,如果任务中断后所需位点对应的日志已经被清理,增量任务可能无法从原位置继续。
  1. 主键或唯一约束

NineData 建议每张同步表都具有主键或唯一约束,并保证字段名称唯一。
缺少主键或唯一约束可能带来以下问题:
  • 无法稳定定位需要更新或删除的记录;
  • 重试时可能产生重复数据;
  • 增量数据对比难以定位差异行;
  • 同步和修复效率下降。
NineData 的部分链路会在预检查阶段检测无主键表,例如 MySQL 同步到 OceanBase MySQL、Oracle 相关同步链路等。对于未在预检查中显式拦截无主键表的链路,NineData 通过内部记录标记机制支持无主键表的全量断点续传,但在增量同步和数据对比场景中,无主键表仍可能带来更新/删除定位困难、重试重复等问题。因此,迁移前生成无主键表清单并根据业务情况补充主键或唯一索引,仍然是最稳妥的做法。
  1. 网络与权限

NineData 需要同时连接源端和目标端数据库。
迁移前应确认:
  • 源端和目标端网络可达;
  • 防火墙、安全组和访问白名单已放行;
  • 数据库账号具有读取结构和数据的权限;
  • 源端账号能够读取 Binlog;
  • 目标端账号具有建表和写入权限;
  • 连接数、磁盘空间和数据库负载满足迁移要求。
具体权限应根据数据库版本、部署方式和目标端类型,按照 NineData 对应数据源配置,不建议直接给迁移账号授予不必要的全局高权限。
  1. 目标端兼容性

如果源端和目标端都是 MySQL,需要重点检查:
  • MySQL 版本差异;
  • 字符集与排序规则;
  • sql_mode;
  • 时区配置;
  • 表名大小写规则;
  • 数据类型兼容性;
  • 默认值和表达式;
  • 索引长度;
  • 存储引擎;
  • 触发器、事件和存储过程。
如果目标端是 TiDB、ClickHouse、Doris、StarRocks、PostgreSQL 等异构数据库,还需要确认数据类型映射、主键模型、DDL 支持范围以及增量写入语义。

三、如何使用 NineData 创建迁移任务

第一步:录入源端和目标端数据源

2.PNG



在 NineData 控制台中进入“数据源管理”,分别创建源端 MySQL 和目标端数据源。
完成连接配置后,应先执行连接测试。此时需要解决所有网络、账号、权限和证书问题,不要等复制任务启动后再处理。

第二步:选择复制类型

完整迁移通常需要同时选择:
  • 结构复制;
  • 全量复制;
  • 增量复制。
三种复制类型分别解决表结构、历史数据和迁移期间新增数据的问题。
如果目标端已经提前建好表结构,可以根据实际情况关闭结构复制,但必须确认目标表的数据类型、字段顺序、默认值、索引及约束与迁移要求一致。

第三步:选择同步对象

3.png


根据业务边界选择需要迁移的库、表和对象。
生产环境不建议默认选择整个实例,而应先明确:
  • 哪些数据库属于本次迁移范围;
  • 是否排除日志表、临时表和历史归档表;
  • 是否需要表名或库名映射;
  • 是否只同步部分字段;
  • 是否需要数据过滤;
  • 是否存在同名目标表。
迁移范围越清晰,预检查、校验和故障处理越容易。

第四步:设置目标端处理策略

如果目标端已经存在对象或数据,需要提前确定处理方式。
对于目标端数据冲突,NineData 提供的策略包括:
  • 报错并等待人工处理;
  • 不更新目标端已有数据;
  • 使用源端数据覆盖目标端数据。
生产迁移不应在不了解目标端数据来源的情况下直接选择覆盖。建议先确认目标库是否为空,以及是否存在其他应用写入。
迁移期间原则上应避免业务直接写目标库。源端和目标端同时写入同一批数据,会增加主键冲突、覆盖和数据回流风险。

第五步:执行预检查

4.png


NineData 会在任务启动前检查部分配置和兼容性问题。
需要重点处理:
  • Binlog 配置不符合要求;
  • 账号权限不足;
  • 无主键表;
  • 源端和目标端对象不兼容;
  • 目标端存在同名对象或历史数据;
  • 字符集、字段类型或索引不兼容;
  • 网络连接异常;
  • 增量起始位置不可用。
预检查失败后,应先解决问题并重新检查,不建议忽略高风险检查项直接启动生产迁移。

四、全量迁移期间如何控制风险

全量迁移通常会提高源库读取压力,并增加目标库的写入、索引维护和磁盘压力。
NineData 支持配置全量和增量复制速率。实际迁移时建议:
  1. 先使用较低并发进行小规模测试。
  2. 观察源库 CPU、IO、连接数和慢查询。
  3. 观察目标库写入延迟、磁盘空间和日志增长。
  4. 在业务低峰期逐步提高并发。
  5. 为线上业务预留足够资源。
  6. 大表单独评估迁移耗时和分片效果。
NineData 展示线程状态、当前执行 SQL、事件时间和提交响应时间等信息,可以辅助判断任务是否被慢 SQL、目标端写入、锁等待或网络性能限制。

五、增量同步、位点和断点续传

全量复制进行期间,NineData 会继续采集源端变更。全量结束后,任务通过增量同步逐步追平源库。
NineData 提供同步位点管理能力,可以查看或修改读取位点和写入位点。修改位点后,任务会暂停并重新启动。
需要注意:
  • 修改读位点可能导致部分变更被重复读取或跳过;
  • 修改写位点可能导致目标端重复写入或数据缺失;
  • 已完成的增量任务不能随意重设位点;
  • 人工修改位点前必须记录原位置并评估数据影响。
NineData 支持增量同步的位点管理能力。在 V5.3.0 及以上版本中,用户可以在任务详情页查看按多个时间点和 SCN 展示的同步位点,包括当前的读取位点和写入位点。在特定运维场景下,用户可以修改位点并重启任务使其生效:进入任务详情的“增量复制”页签,点击“同步位点管理”,选择要调整的位点类型,按页面格式填写新的位点值,确认影响范围后点击“验证并提交”,任务将暂停并自动重启,使新位点生效。
需要特别提醒的是,修改任一位点都可能导致数据丢失或源端与目标端数据不一致。已完成增量复制的任务不能重置位点。建议仅在已授权的测试环境,或已完成备份并具备回滚方案的维护窗口内执行位点修改操作。
断点续传是 NineData 全量复制的核心能力之一。NineData自主研发的新型断点续传技术,专门针对无主键表的数据准确性进行了优化。在网络抖动、消息积压或任务异常中断等场景下,NineData 能够自动检测同步链路的异常状况,支持断点续传和重试机制,确保数据同步的连续性和一致性。

六、迁移期间能否执行 DDL

DDL 是在线迁移中最容易被忽略的风险之一。
迁移期间如果执行以下操作,可能影响结构复制和增量同步:
  • 增加、删除或重命名字段;
  • 修改字段类型;
  • 增加或删除主键;
  • 重命名表;
  • 删除表;
  • 执行 Online DDL;
  • 修改字符集或排序规则。
NineData 对 DDL 的支持范围与具体源端、目标端和同步链路有关。部分链路在增量同步阶段暂时还不支持源端 DDL,此外,如果自定义增量起始时间与任务启动时间之间发生过 DDL,也可能导致任务失败。
因此,DDL 支持能力因链路而异,可以按照具体链路逐一确认。
更稳妥的生产策略是:
  1. 在迁移窗口内冻结非必要 DDL。
  2. 必须执行 DDL 时,先确认当前链路的支持范围。
  3. 在源端和目标端采用兼容的变更顺序。
  4. 变更后重新检查复制状态和数据一致性。
  5. 对改主键、改字段类型和表重命名等高风险操作单独测试。

七、NineData 如何进行数据一致性校验

NineData 提供全量对比、快速对比和增量数据对比。

5.png


  1. 全量对比

全量对比会检查选定范围内的数据,适合:
  • 正式割接前的最终校验;
  • 关键业务表;
  • 对完整性要求较高的迁移;
  • 快速对比发现异常后的复核。
全量对比更全面,但会消耗更多数据库资源,执行时间也更长。

 2. 快速对比

NineData 快速对比可以使用以下方式判断数据是否存在明显差异:
  • 比较表的总行数;
  • 对数值和布尔字段比较最大值、最小值和平均值;
  • 根据配置的抽样比例随机抽取记录。
快速对比适合大规模迁移后的初步检查,但抽样一致不代表全部数据完全一致,不能完全替代关键表的全量对比。

 3. 对比分片与并发

NineData 的数据对比支持:
  • 自动或手动分片;
  • 设置每个分片的记录数;
  • 设置对比并发度;
  • 限制每张表保存的差异明细数量;
  • 设置浮点数精度;
  • 选择是否包含大字段;
  • 设置字符串空格处理方式。
对于超大表,可以适当增加分片,但并发度不能只追求速度。过高的对比并发同样可能增加源库和目标库压力。
NineData 还可以根据 MySQL 或 SQL Server 的运行线程情况实施负载保护。

  4.  增量数据对比

增量数据对比用于检查增量复制过程中捕获的新增、更新和删除记录。
该功能需要同时启用全量对比或快速对比,并且表中需要存在主键、唯一键或可用于定位记录的索引。
对比发现不一致后,可以查看源端值、目标端值和记录定位字段,并生成修复 SQL。修复 SQL 执行前仍需人工检查,尤其需要注意:
  • 外键约束;
  • 唯一键冲突;
  • SQL 执行顺序;
  • 目标端是否仍有业务写入;
  • 修复期间数据是否继续变化。

八、数据不一致后如何修复

NineData 支持对差异进行重新检查,并可生成修复 SQL。

6.png


在增量复制任务运行期间,还可以对指定表执行重新同步。NineData提供的处理方式包括:
  • 清空目标表后重新写入;
  • 向目标端补充缺失数据;
  • 删除并重建目标表后重新写入。
选择修复方式时需要考虑:
  • 目标表是否允许清空;
  • 表中是否存在目标端独有数据;
  • 是否有外键依赖;
  • 表数据量和重新同步耗时;
  • 修复是否影响线上查询;
  • 增量同步是否仍在持续写入。
对于大表,建议先定位差异范围,再决定执行修复 SQL、局部补数还是整表重新同步。

九、低停机割接的标准步骤

NineData 任务显示“延迟0秒”,表示目标端已经追平当前源端变更,但这不等于可以不经控制直接切换。
只要源端仍允许写入,显示0秒后仍可能立即产生新的事务。生产割接建议采用以下步骤。

割接前

  1. 完成目标端功能和性能测试。
  2. 确认全量迁移已经完成。
  3. 确认增量同步持续稳定。
  4. 将延迟降低到0秒或业务可接受范围。
  5. 完成关键表全量对比。
  6. 检查无主键表、失败对象和未同步对象。
  7. 准备应用连接切换方案。
  8. 明确回退条件、负责人和观察窗口。
  9. 必要时提前建立目标端到源端的反向增量同步任务。

正式割接

  1. 停止定时任务、消息消费者和批处理程序。
  2. 将业务设置为只读或暂停源端写入。
  3. 等待未提交事务完成。
  4. 等待 NineData 增量延迟重新降到0秒。
  5. 执行最终数据对比。
  6. 切换数据库连接、代理、配置中心或服务发现。
  7. 重启连接池,避免应用继续使用旧连接。
  8. 执行登录、查询、下单和写入等核心冒烟测试。
  9. 恢复业务写入。
  10. 持续观察错误率、数据库负载和复制状态。
这类方案的主要价值,是把原本数小时的停机迁移压缩为最终追平、校验和连接切换所需的短窗口,而不是保证任何系统都完全没有停机时间。

十、如何设计回退方案

切换失败时,仅仅把应用连接重新指向源库并不一定安全。
原因是切换后目标库可能已经产生新数据。如果直接回切,而这些数据没有同步回源库,就可能发生数据丢失。
NineData 的跨云迁移实践建议,可以在正式切换前建立一条从目标端回流到源端的增量复制链路,使切换后产生的新数据继续同步回源库。
回退设计至少应明确:
  • 什么情况下触发回退;
  • 谁负责做出回退决定;
  • 目标端新数据如何回流;
  • 回流链路如何避免循环同步;
  • 回退前是否再次暂停写入;
  • 如何确认源端已经追平;
  • 回退后如何校验数据;
  • 源库保留多长时间;
  • 观察窗口结束后何时下线旧环境。
NineData 提供了反向 CDC 回流的操作方法,支持搭建从目标端回流增量数据至源端的复制任务。但并未替所有业务定义统一的回退窗口,回退窗口需要根据数据量、业务风险、成本和合规要求自行确定。

十一、常见异常及处理建议

增量延迟突然升高

首先检查:
  • 源端是否出现大事务;
  • 目标端写入是否变慢;
  • 网络是否抖动;
  • 是否存在锁等待;
  • 目标端磁盘或 CPU 是否达到瓶颈;
  • 复制限速是否过低;
  • 是否刚完成大量批处理或 DDL。
NineData 支持查看任务延迟等监控指标,并可以配置异常告警。告警规则支持配置“任务状态”和“复制延迟”等条件,告警渠道包括短信、电话、邮件及 Webhook。具体告警阈值可根据业务需求在告警规则中自行设置。

7.png


目标端出现主键或唯一键冲突

应先确认目标端是否被其他应用写入,或者目标表是否保留了历史数据。
不要在不了解数据来源的情况下直接覆盖。可以根据业务要求选择报错等待处理、跳过目标端更新或使用源端数据覆盖,并在处理后重新执行数据对比。

Binlog 位点不可用

如果任务需要读取的 Binlog 已被源端清理,单纯重启任务可能无法恢复。
此时需要根据任务状态评估:
  • 是否可以重新进行全量同步;
  • 是否可以从新的可用位点启动;
  • 缺失时间段能否通过其他备份补齐;
  • 是否需要对目标表重新同步。
因此,Binlog 保留周期必须覆盖预计迁移时间和故障恢复时间。

校验发现数据不一致

建议按以下顺序处理:
  1. 确认源端和目标端是否仍有并发写入。
  2. 重新执行差异检查,排除对比期间数据变化。
  3. 判断差异是缺失、重复还是字段值不同。
  4. 查看同步日志和冲突记录。
  5. 对少量差异审核并执行修复 SQL。
  6. 对大范围差异使用表级重新同步。
  7. 修复后重新执行数据对比

迁移期间发生 DDL

先暂停新的结构变更,检查当前链路是否支持该 DDL,并确认复制任务状态。
如果源端和目标端结构已经不一致,建议不应盲目继续同步。应先完成结构兼容性修复,再根据位点和任务状态决定继续、重启或重新同步相关表。

十二、NineData 方案的主要优势

与手工组合导出工具、Binlog 解析程序和校验脚本相比,NineData 的优势主要体现在:
  • 在同一任务中配置结构、全量和增量复制;
  • 支持 MySQL 到多种数据库及多云环境;
  • 提供任务预检查和对象映射;
  • 提供同步延迟、线程和日志监控;
  • 支持全量、快速和增量数据对比;
  • 提供目标端冲突处理策略;
  • 支持生成修复 SQL和表级重新同步;
  • 支持任务异常和高延迟告警;
  • 可以通过反向 CDC 链路降低割接回退风险。
这些能力可以减少迁移工具拼装和人工操作,但并不意味着迁移项目可以跳过容量评估、DDL 管理、业务验证和回退演练。

总结

一套可靠的 MySQL 迁移方案,不是把数据导入目标库就结束,而是要完整覆盖:

8.png



NineData 提供了结构复制、全量复制、增量复制、数据对比、冲突处理、异常告警和差异修复等能力,可以降低 MySQL 上云、跨云迁移和数据库升级的实施复杂度。
但在生产环境中,“不停机迁移”更准确的理解应是:迁移和追平阶段业务持续运行,最终通过短时间写暂停完成低停机割接。
只有同时做好 Binlog 配置、主键治理、DDL 管控、性能评估、数据校验和回退预案,才能把数据库迁移从“数据复制成功”提升为“业务可验证、可切换、可回退”。

【声明】本内容来自华为云开发者社区博主,不代表华为云及华为云开发者社区的观点和立场。转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息,否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0)

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。