1.下载navicat Premium
2.选中工具
3.点开工具>数据传输(源为传送数据库连接名字,数据库名字,目标为接收数据连接名字,数据库名字)
4.填好点击下一步后,点击开始,显示finally success,表明名倒入成功
5.视图导入
Oracle视图和mysql视图不同,前者多用视图嵌套子查询,而其刚好时MySQL不支持的,需要将视图子查询改为视图嵌套视图,,如:
create view v_student as select * from (select * from t_student) t;
ERROR 1349 (HY000): View\'s SELECT contains a subquery in the FROM clause
解决方法,view的嵌套:
create view v_tea_stu as select * from t_student;
Query OK, 0 rows affected (0.02 sec)
create view v_student as select * from v_tea_stu;
Query OK, 0 rows affected (0.00 sec)
6、Trigger、存储过程、package
1)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同样的可以定义和处理异常,但对象名字不一样。
7、分页语句
MySQL中使用的是limit关键字,但在Oracle中使用的是rownum关键字。所以每有的和分页相关的语句都要进行调整。
8、JOIN
如果你的SQL里有大量的(+),这绝对是一个很头疼的问题。需要改写。
9、group by语句
Oracle里在查询字段出现的列一定要出现在group by后面,而MySQL里却不用。只是这样出来的结果可能并不是预期的结果。造成MySQL这种奇怪的特性的归因于sql_mode的设置,一会会详细说一下sql_mode。不过从Oracle迁移到MySQL的过程中,group by语句不会有跑不通的情况,反过来迁移可能就需要很长的时间来调整了。
10、bitmap位图索引
在Oracle里可以利用bitmap来实现布隆过滤,进行一些查询的优化,同时这一特性也为Oracle一些数据仓库相关的操作提供了很好的支持,但在MySQL里没有这种索引,所以以前在Oracle里利于bitmap进行优化的SQL可能在MySQL会有很大的性能问题。
目前也没有什么较好的解决方案,可以尝试着建btree的索引看是否能解决问题。要求MySQL提供bitmap索引在MySQL的bug库里被人当作一个中级的问题提交了上去,不过至今还是没有解决。
11、分区表(Partitioned table)
需要特殊处理,与Oracle的做法不同,MySQL会将分区键视作主键和唯一键的一部分。为确保不对应用逻辑和查询产生影响,必须用恰当的分区键重新定义目标架构。
12、角色
MySQL8.0以前也没有role的对象。在迁移过程中如果遇到的角色则是需要拼SQL来重新赋权。不过MySQL更好的一点是MySQL的用户与主机有关。
13、表情和特殊字符
在Oracle里我们一般都选择AL32UTF8的字符集,已经可以支付生僻字和emoji的表情了,因为在迁移的时候有的表包含了大量的表情字符,在MySQL里设置了为utf8却不行,导过去之后所有的都是问号,后来改成了utf8mb4才解决问题,所以推荐默认就把所有的DB都装成utf8mb4吧。
14.数据检验
可以通过count(*)查询总条数,也可以通果etl工具校验