从Oracle迁移到MySQL的各种坑及⾃救⽅案java毕业设计成品
1.
mysql语句转oracle当企业内部使⽤的数据库种类繁杂时,或者有需求更换数据库种类时,都可能会做很多数据迁移的⼯作。有些迁移很简单,有些迁移可能就会很复杂,⼤家有没有考虑过为了顺利完成复杂的数据库迁移任务,都需要考虑并解决哪些问题呢?
在以前的⼯作中,我迁移过Oracle到Informix、Oracle和SQLServer、Oracle到MySQL。 在⽬前的公司⼜因为去O的关系,做了⼤量的迁移⼯作,栽了不少坑,所以和⼤家交流⼀下在迁移的过程中的⼀些实践。
分享⼤纲:
1. 去O前的准备与考虑
2. 确定⽬标数据库
3. 表和数据对象的迁移及⼯具⽐较
4. 其它对象的迁移
5. ⼀些性能参数
2. ⼀、去O前的准备与考虑
因为成本预算等多⽅⾯原因,公司决定要去O,在去O之前⾸先要决定拿什么来替代Oracle,拿什么⼯具将源数据库的数据导到⽬标数据库、怎么导等的。导的过程的增量数据怎么处理。导的时候源数据和⽬标,以及数据的数据类型差异如何处理,像视图、存储过程、触发器这种数据库对象之间的不同怎么解决,导的时候如何不影响源数据库性能。导完以后的数据⽐对以及数据⽆误后应⽤的性能问题都是要考虑的。
3. ⼆、确定⽬标数据库
在我们做数据迁移之前先确认的就是target database ,就是要迁到什么数据库上,经过了⼀些调研,从速度、流⾏度等多个⽅⾯选择最终了MySQL。因为相信被Oracle收购后表现会越来越好。
当然也想过使⽤PosgreSQL,不过做了⼀个测试,发现MySQL5.7的QPS在⽐同样配置的PG要⾼,基
java就业培训学院于在线事务对性能的要求,最终还是选择了MySQL。选择了MySQL以后,对于MySQL的分⽀和版本的选择也很头痛。Percona增加了很多性能相关补丁,MariaDB⽀持更多的引擎,官⽅的版本也能满⾜⽬前的需求,从保守的原则上,我们的核⼼数据库最终还是使⽤了官⽅的版本,⼀些不是太核⼼的数据库,其它的分⽀也有在⽤。
因为MyCat的⽀持关系最终选择的是5.6的版本(⽬前MyCat1.6对MySQL5.7的⽀持不是太好),为了达到像Oracle的DG/OGG⼀样稳定的架构,我们把MySQL的架构做成了双机房的MHA,并且⽤了MyCat做了读写分离。同样的Oracle这边因为同时还有应⽤在跑,为了分散Oracle的压⼒,所有的同步作业也是在备库和异机房的OGG端进⾏的操作。
4. 三、表和数据对象的迁移及⼯具对⽐ //表和数据对象
在选择了合适的DB来替换Oracle后,下⼀步就是选择⼀个合适的迁移⼯具来做迁移。我们在迁移⼯具的选择⽅⾯花费了⼤量时间和精⼒。迁移是⼀个漫长⽽困难的⼯作,我们在迁移的过程中也历经了不同的阶段,使⽤了不同的⽅法。从最初级的load csv升级成⾃已写的程序,再去Oracle和MySQL官⽅推荐的⼯具,最后也尝试了⼀些 ETL的⼯具,被这么多⼯具摧残之后,幸运的是能够在不同的场情下使⽤不同的⽅式。
5. 接下来我们对每⼀种都进⾏⼀个简单的介绍和使⽤中遇到的⼀些问题。
oracle dba是什么意思6. 1、SQL LOAD
我们在最早的时候只是进⾏某个项⽬的迁移⼯作,因为时间的关系并没有进⾏迁移⼯具的选型以及使⽤,使⽤了最简单的⽅式就是SQL LOAD。
所有的操作步骤⽐把⼤象放进冰箱还要简单,简单得只要分两步,第⼀步把Oracle的数据导成CSV或者SQL,然后再load或者source到MySQL中就可以了。
把Oracle的数据导成CSV或者SQL可以⽤很多⼯具,⽐如SQL developer或者toad,不过我还是更推荐spool,⼤家应该都⽤过spool,他可以结合set把内容输出到指定的⽂件中,然后选择合理的⾏列分隔符,就可以产⽣csv⽂件了。
使⽤SQL LOAD的优点就是速度快和超级简单,不过同样的,它也会有很多弊端,它很难做成⾃动化和全⾯普及到很多张表上,每有⼀张表的操作就要写SQL拼CSV,然后还不能保证是⼀样的分隔符,⼤多数时候对lob字段操作也很⿇烦。对类似于comments的评论字段也很难原样的copy过去。
6.1. 我们来看⼀个简单的例⼦:
第⼀步我先在Oracle这边创建了⼀张表,很简单只有四列,然后insert了三条数据查看了⼀下内容。
做了⼀些简单的可能会⽤到的查询。
看⼀下导出⽤的spool的内容,实际⽤的时候肯定会⽐这个更复杂,要对换⾏、time、lob等进⾏更多的函数处理。然后把数据导了出来看⼀下。
接着我⼜在MySQL创建⼀张⼀样的表把数据load了进去。load的语法不是我们今天要分享的重点,它的作⽤就是把file load into table.可以指定⾏列分隔符。 可以看到数据load进去了三⾏,同时也给出了三个警告,第⼆⾏⼀个,第三⾏两个,分别是int类型的列传了⼀个空字符串和时间类型的被截取了。查看⼀下表⾥的数据,发现和预期的不⼀样。
然后把刚刚在Oracle那边进⾏的查询再次查询⼀下,发现结果都变得不⼀样了。
6.2. 这是因为在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⾥讲到。
7. 2、Python
html怎么链接另一个网页迁了部分数据之后觉得load数据虽然简单和快,但是瑜不掩瑕,总是有这样那样的问题,迁移之后往往还会同时伴随着⼤量的数据修复⼯作。
很快的,我们就弃⽤了这种操作,在这⾥要说明⼀下SQL LOAD的操作因为速度⼜快⼜不依赖其它组件,所以适⽤于数据类型并不复杂的单表操作,然后就写了python代码来接替它来完成数据迁移的操作,使⽤python的话其实也很简单,可以分为三步,第⼀步就是建⽴配置表,同时和MySQL的表进⾏mapping,标识出是全量的还是增量的,如果是增量的,以什么做为增量来处理。第⼆步就是根据mapping进⾏code、code、code,最后根据不同的⼊参写好crontab就可以进⾏调度就可以了。
使⽤python处理的过程中可以对⼀些数据进⾏转换,也更加灵活地配置了⼀些选项,实现了较强的逻辑控制,当然也有⼀些缺点:它的速度慢了太多(不过也只⽐load慢,⽐起来后⾯要介绍的Java编写的软件还是快很多)。对于异常的处理也花费了⼤量的代码逻辑,同时也要会写代码。
javascript程序设计基础教程 李源 pdf我们可以简单来看⼀下它的实现:
7.1. 代码
这⼀个代码⽚断,显⽰了增量同步每⼀天的数据逻辑。
这是每天跑批之后⽣成的log,可以看出来把warning和error都列了出来,同时也对⾏数进⾏了统计。已经可以说是⼀个不错的⼩型产品了。可看出来6w条数据⽤了4s和load来⽐算是慢的,但是和Java之类的⽐算是快的了。
8. 3、OGG
因为python开发的这⼀套东西虽然也不算太慢,但因为要⾃⼰⽤代码实现较强的逻辑,并且有些需求在Oracle的业务还没有完全下线之前要实时地同步到MySQL⾥来,所以我们⼜研究了⼀下OGG的做法。先提前说⼀下,OGG的应⽤场景就是那种要求实时并且可能需要回写数据的。
8.1. 缺点:⿇烦,慢,不推荐
OGG的⽤法说起来很简单,只要配置好Oracle端,配置好MySQL端,然后对应的进程起起来就可以了。但⽤过OGG的⼈都知道配置⼀套OGG本⾝就很⿇烦了,异构数据库之间再进⾏同步的话,调通并可⽤需要很久的配置时间,所以我⼤致说⼀下做法,除⾮真的有这种硬性需求,不然不推荐使⽤。
8.2. 注意事项
简单说⼀下⽤OGG的过程和注意事项:
1、 5.6版本需要12.1.2版本的OGG才⽀持
2、异构数据库之间不⽀持DDL复制
从Oracle同步到MySQL,属于异构架构,不⽀持DDL同步,包括添加和删除字段,添加和删除索引,重命名表,表分析统计数据。
若是涉及到源端和⽬标端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 STATE
MENT) causes Extract to abend.
5、GoldenGate对MySQL只⽀持InnoDB引擎。所以,在创建MySQL端的表的时候,要指定表为InnoDB引擎。
create table MySQL (name char(10)) engine=innodb;
所有的帮助可以online help⾥去看
9. 4、MySQL Migration Toolkit
OGG是Oracle官⽅推荐的⼯具,使⽤原理就是基于⽇志的结构化数据复制,通过解析源数据库在线⽇志或归档⽇志获得数据的增量变化,再将这些变化应⽤到⽬标数据库,那MySQL官⽅没有提供⼯具呢?答应是肯定的。
9.1. MySQL Migration Toolkit // MySQL wrokbench⾥也有集成
MySQL官⽅同样也提供⼀个⽤于异构之间的数据迁移⼯具,从MySQL到其它数据库,或者从其它数据
库到MySQL都是可以的。这个⼯具就是MySQL Migration Toolkit。这个⼯具可以单独被下载,也被集成到了MySQL wrokbench⾥。不过如果单独下载的话 只有windows 的版本。
这是⼀个基于Java的程序,所以依赖于jar包,使⽤它的第⼀步就是load⼀个odbc.jar。接着就可以把源端和⽬标端进⾏配置连接,选择要导⼊的对象(可以包含视图,但是⼀般有⼦查询的会报错),进⾏导⼊就可以了。
使⽤它的优点就是可以在MySQL端⾃动创建表,但有可能⾃动convert的类型若有问题,需要⼈为参与⼀下进⾏处理,⽐如Oracle中通常会对Timestamp类型的数据设置默认值sysdate,但在MySQL中是不能识别的。
10. 缺点:只有windows的平台有
缺点就是只有windows的平台有,在导⼤数据量时,极有可能就hang住了。所以个⼈感觉它的适⽤场景就是⼀次性导⼊的⼩批量的数据。
11. 5、KETTLE //纯Java编写的软件
上⾯提到的⼏种⼯具都是⼀步⼀个坑使⽤过之后发现并没有尽善尽美,总有这样或者那样的不⾜,接下来我们来推荐的就是终级必杀的好⽤的etl⼯具:KETTLE。
它是⼀款纯Java编写的软件,就像它的名字(⽔壶)⼀样,是⽤来把各种数据放到⼀个壶⾥,然后以⼀种指定的格式流出。当然你也可以使⽤DS(datastage)或者Informatica。不过这两个是收费的,⽽kettle是免费开源的。
这⾥只介绍它最简单的能满⾜我们把数据从Oracle迁移到MySQL的功能。
同理,第⼀步把jar包load进去,不同的是,这次要load的是MySQL的jar包。需要注意的是,如果你的MySQL版本不同可能需要load不同的jar包。第⼆步同也是配置连接信息,保证你的源和⽬标都连接成功,最后⼀步就是简单的拖拖拽拽。最后run⼀下就可以了。
它的优点就是配置起来⽐OGG快,但是同样可以通过job做到实时同步,处理速度和Python旗⿎相当,却不⽤⾃⼰来写mapping关系,并且提供了图形化界⾯。也能和Migration Toolkit⼀样同时创建表(新增⼀个Java脚本),进⾏类型转换,但⽇志更详细。只是可能学习成本⾼⼀点,要看的懂⼀些Java报错⽅便调试。
11.1. 接下来我们简单看⼀个demo:
我们运⾏之后可以打开这个界⾯。view⼀界显⽰了这个转换的名字、数据源、处理步骤等,中间区域
是你拖拽出来的操作,⼀个输⼊,⼀个输出。这就是⼀个简单的数据迁移的所有步骤。
打开input的内容,就是很简单的⼀条SQL在哪个源数据库上抽取数据,当然这条SQL也可以是拖拽⽣成出来,类似于congos的拖拽⽣成报表。千万要注意的是,不要加分号!
output的内容就显⽰丰富了很多,选择⽬标数据源,以及会⾃动的mapping列的信息,还有在迁移之间要不要先清空,迁移过程中如果遇到问题了会不会中⽌。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论