1. ORACLE到MYSQL数据迁移方式选型

    ORACLE到MYSQL的数据迁移,主要涉及了以下三个数据同步的步骤:

  •     Oracle 到mysql 全量同步

  •     Oracle 到mysql增量同步

  •     Mysql 到oracle 增量同步

   在完成以上的步骤后,原oracle数据库与新mysql数据库中数据能够保持了相对平衡的一致性,旧应用在oracle上的增删改能够尽量实时地同步到mysql上,业务能够平滑地切换到mysql 上,新应用在mysql上的增删改也能够尽量实时往回同步到mysql上,当割接后在mysql上存在异常,可以及时地将应用会切到oracle上。

    我们想到的工具如下:

     ORACLE GOLDENGATE

     优点:可以有效实现ORACLE到MYSQL异构数据库数据全量及增量同步,数据同步实时性高 可以实现数据从MYSQL到ORACLE同步回写需求

    缺点:配置复杂,无法支持DDL同步

      kettle和nvicat

     综合考虑多种迁移方式,根据不同数据的特殊性选择成本最低,效率最高的工具。

    自开发python脚本工具

       主要是针对部分有特殊需求,以上工具无法满足的对象同步。同步自开发脚本工具进行 同步。

      出自阿里巴巴的开源工具

      yugong、canal、otter、datax


    同时,在上篇文章中我们说到,在迁到mysql后我们进行了拆分业务以及拆分大表的步骤,所以我们的数据库同步将会面临以下两个问题:

  •     oracle 单表到mysql 分库分表分发

  •     mysql分库分表到oracle 单表合并

   在最开始,我的计划方案是以下这样的:


    1.oracle rac集群(源库)通过ogg同步到oracle中间库,这里中间库主要有两个作用:

      a.解决oracle gbk到mysql utf8字符集问题;

      b.使用中间库可以做数据处理而不影响现有生产,后续文章会相继介绍;

    2.oracle中间库通过ogg分发同步到mysql多库多表;

    3.mysql多库多表通过mysql多源主从复制方式汇集到mysql中间库上;

    4.mysql中间库通过ogg同步到oracle中间库;

    5.oracle中间库通过ogg同步回源库,完成整个数据链路同步及回流。


   在后面的实际实施中我进行了改造,如下:

    

      主要不同时的是,mysql端直接可以通过ogg同步回源库和oracle中间库,分库分表的情况下相同。当然此时如果通过多源主从复制汇合在同一个mysql库上进行同步也可以。

     ogg强大的兼容性,基本满足了我们的很多场景,在以上数据迁移中,ogg是整个数据同步的主要工具,其他工具主要作为辅助。但是,也遇到过ogg无法处理的问题,例如,在mysql往oracle增量同步的过程中,ogg无法支持mysql的XA事务,一旦mysql binlog中出现XA事务,抽取进程便异常终止,后来我选择了开源的工具canal,新版的canal是可以支持mysql的xa事务。在全量同步的过程中,也发现阿里的开源工具datax也非常强悍,因此我们也综合选择了多种同步工具。

     在mysql分库分表之后,无法满足日常一些跨库跨表的聚合查询场景,于是,所谓分分合合,我们又需要实时的将mysql中的数据合并同步到一起。这个存放合并数据的数据库可以是hadoop,可以是es,也可以是mongodb。其必须是能够存放海量数据,并能提供较好的查询性能。如果同步到hadoop等这些,我们可以通过canalj将mysql的增量数据推送到kafka,再进行消费。

     在这个考虑阶段,我们发现了一个较为新型的数据库--tidb,tidb  可以提供无限水平扩展集群架构,正是要替代mysql分库分表的方式,我们不将其替代mysql分库分表的方式,但可以用它融入现有系统的数据流中,用它作为某些跨库跨表的查询场景的数据库,从mysql到tidb的同步,PingCAP 官方标配了相关的组件:MySQL 到 TiDB 的迁移,需要解决数据迁移以及增量的实时同步,也就是 DTS,Mydumper + Loader 解决存量数据的同步,官方提供了 DM 工具可以很好的解决增量同步问题。

    于是我们形成了这样的数据流:




请使用浏览器的分享功能分享到微信等