从Oracle迁移到MySQL的各种坑及自救方案(2)
接着我又在MySQL创建一张一样的表把数据load了进去.load的语法不是我们今天要分享的重点,它的作用就是把file load into table.可以指定行列分隔符. 可以看到数据load进去了三行,同时也给出了三个警告,第二行一个,第三行两个,分别是int类型的列传了一个空字符串和时间类型的被截取了.查看一下表里的数据,发现和预期的不一样. 然后把刚刚在Oracle那边进行的查询再次查询一下,发现结果都变得不一样了. 这是因为在MySQL里int类型如果插入的为空,结果会自动转成0. 官方文档上有明确的说明: An empty field value is interpreted different from a missing field: For string types,the column is set to the empty string. For numeric types,the column is set to 0. For date and time types,the column is set to the appropriate “zero” value for the type. 我们再看一下用etl工具迁移过来的数据,可以发现数据被insert成了null,符合了Oracle的意思,其实这就是sqlload时一些弊端,数据类型可能弄得不是原来的数据了.同样的,我们也可以设置成严格的模式,int类型的不允许插入null,我们会在下面的sql_mode里讲到. 2、Python迁了部分数据之后觉得load数据虽然简单和快,但是瑜不掩瑕,总是有这样那样的问题,迁移之后往往还会同时伴随着大量的数据修复工作. 很快的,我们就弃用了这种操作,在这里要说明一下SQL LOAD的操作因为速度又快又不依赖其它组件,所以适用于数据类型并不复杂的单表操作,然后就写了python代码来接替它来完成数据迁移的操作,使用python的话其实也很简单,可以分为三步,第一步就是建立配置表,同时和MySQL的表进行mapping,标识出是全量的还是增量的,如果是增量的,以什么做为增量来处理.第二步就是根据mapping进行code、code、code,最后根据不同的入参写好crontab就可以进行调度就可以了. 使用python处理的过程中可以对一些数据进行转换,也更加灵活地配置了一些选项,实现了较强的逻辑控制,当然也有一些缺点:它的速度慢了太多(不过也只比load慢,比起来后面要介绍的Java编写的软件还是快很多).对于异常的处理也花费了大量的代码逻辑,同时也要会写代码. 我们可以简单来看一下它的实现: 这一个代码片断,显示了增量同步每一天的数据逻辑. 这是每天跑批之后生成的log,可以看出来把warning和error都列了出来,同时也对行数进行了统计.已经可以说是一个不错的小型产品了.可看出来6w条数据用了4s和load来比算是慢的,但是和Java之类的比算是快的了. 3、OGG因为python开发的这一套东西虽然也不算太慢,但因为要自己用代码实现较强的逻辑,并且有些需求在Oracle的业务还没有完全下线之前要实时地同步到MySQL里来,所以我们又研究了一下OGG的做法.先提前说一下,OGG的应用场景就是那种要求实时并且可能需要回写数据的. OGG的用法说起来很简单,只要配置好Oracle端,配置好MySQL端,然后对应的进程起起来就可以了.但用过OGG的人都知道配置一套OGG本身就很麻烦了,异构数据库之间再进行同步的话,调通并可用需要很久的配置时间,所以我大致说一下做法,除非真的有这种硬性需求,不然不推荐使用. 简单说一下用OGG的过程和注意事项: 1、 5.6版本需要12.1.2版本的OGG才支持 2、异构数据库之间不支持DDL复制
3、必须要配置defgen,且文件必须放在相同的目录. 4、如果要是双向的话,就必须把MySQL端的binglog设置成row binlog_format: This parameter sets the format of the logs. It must be set to the value of ROW,which directs the database to log DML statements in binary format. Any other log format (MIXED or STATEMENT) causes Extract to abend. 5、GoldenGate对MySQL只支持InnoDB引擎.所以,在创建MySQL端的表的时候,要指定表为InnoDB引擎. create table MySQL (name char(10)) engine=innodb; 所有的帮助可以online help里去看 http://docs.Oracle.com/goldengate/c1221/gg-winux/GIMYS/system_requirements.htm#GIMYS122 4、MySQL Migration ToolkitOGG是Oracle官方推荐的工具,使用原理就是基于日志的结构化数据复制,通过解析源数据库在线日志或归档日志获得数据的增量变化,再将这些变化应用到目标数据库,那MySQL官方没有提供工具呢?答应是肯定的. (编辑:ASP站长网) |