从Oracle迁移到MySQL的各种坑及自救方案(3)
MySQL官方同样也提供一个用于异构之间的数据迁移工具,从MySQL到其它数据库,或者从其它数据库到MySQL都是可以的.这个工具就是MySQL Migration Toolkit.这个工具可以单独被下载,也被集成到了MySQL wrokbench里.不过如果单独下载的话 只有windows的版本. https://downloads.MySQL.com/archives/migration/ 这是一个基于Java的程序,所以依赖于jar包,使用它的第一步就是load一个odbc.jar.接着就可以把源端和目标端进行配置连接,选择要导入的对象(可以包含视图,但是一般有子查询的会报错),进行导入就可以了. 使用它的优点就是可以在MySQL端自动创建表,但有可能自动convert的类型若有问题,需要人为参与一下进行处理,比如Oracle中通常会对Timestamp类型的数据设置默认值sysdate,但在MySQL中是不能识别的. 缺点就是只有windows的平台有,在导大数据量时,极有可能就hang住了.所以个人感觉它的适用场景就是一次性导入的小批量的数据. 5、KETTLE上面提到的几种工具都是一步一个坑使用过之后发现并没有尽善尽美,总有这样或者那样的不足,接下来我们来推荐的就是终级必杀的好用的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报错方便调试. 接下来我们简单看一个demo: 我们运行spoon.sh之后可以打开这个界面.view一界显示了这个转换的名字、数据源、处理步骤等,中间区域是你拖拽出来的操作,一个输入,一个输出.这就是一个简单的数据迁移的所有步骤. 打开input的内容,就是很简单的一条SQL在哪个源数据库上抽取数据,当然这条SQL也可以是拖拽生成出来,类似于congos的拖拽生成报表.千万要注意的是,不要加分号! output的内容就显示丰富了很多,选择目标数据源,以及会自动的mapping列的信息,还有在迁移之间要不要先清空,迁移过程中如果遇到问题了会不会中止. 这里就是显示了它超越Migration tools的log最细粒度到行级别,可以更快地分析出问题. 这里则是详细的日志输出.一般如果定时跑批处理的话,把它重定向到具体的log里,然后当做发送邮件. 四、其它对象的迁移上面用了很长的篇幅介绍了一下几种迁移的工具,每种迁移的方式都是各有千秋,在合适的场景下选择适合自己的方法进行操作.不过刚刚迁移的都是表和数据对象.我们都知道在数据库还有一些其它的对象,像视图、物化视图、存储过程、函数、包,或者一个索引,同样的SQL是不是也需要改写,都是我们需要考虑到的一个因素. 接下来我们来看一下其它对象怎么迁移. 1、view在MySQL里view是不可以嵌套子查询的: create view v_test as select * from (select * from test) t; ERROR 1349 (HY000): View’s SELECT contains a subquery in the FROM clause 解决方法就是view的嵌套: create view v_sub_test as select * from test; Query OK,0 rows affected (0.02 sec) create view v_test as select * from v_sub_test; Query OK,0 rows affected (0.00 sec) 2、物化视图物化视图用于预先计算并保存表连接或聚集等耗时较多的操作结果,这样在执行查询时,就可以避免进行这些耗时的操作,而从快速得到结果.但是MySQL里没有这个功能.通过事件调度和存储过程模拟物化视图,实现的难点在于更新物化视图,如果要求实时性高的更新,并且表太大的话,可能会有一些性能问题. 3、Trigger、存储过程、package1)Oracle创建触发器时允许or,但是MySQL不允许.所以迁移时如果有需要写两个. 2)两种数据库定义变量的位置不同,而且MySQL里不支持%type.这个在Oracle中用得太频繁了,是个好习惯. 3)elseif的逻辑分支语法不同,并且MySQL里也没有for循环. 4)在MySQL中不可以返回cursor,并且声明时就要赋对象. 5)Oracle用包来把存储过程分门别类,而且在package里可以定义公共的变量/类型,既方便了编程,又减少了服务器的编译开销.可MySQL里根本没有这个概念.所以MySQL的函数也不可以重载. 6)预定义函数.MySQL里没有to_char() to_date()之类的函数,也并不是所有的Oracle都是好的,就像substring()和load_file()这样的函数,MySQL有,Oracle却没有. 7)MySQL里可以使用set和=号给变量赋值,但不可以使用:=. 而且在MySQL里没 || 来拼接字符串. 8)MySQL的注释必须要求– 和内容之间有一个空格. 9)MySQL存储过程中只能使用leave退出当前存储过程,不可以使用return. 10)MySQL异常对象不同,MySQL同样的可以定义和处理异常,但对象名字不一样. (编辑:ASP站长网) |