最近想把原来的数据库从 Oracle 迁移到 MySQL, 主要方便于自己开发. 用到了 Navicat.  当然 Navicat 是收费的, 但是可以免费试用 14 天

需要准备的程序:Navicat. 这个是我的下载地址 http://pan.baidu.com/s/1hsuW1NI

里面 包含了 怎么破解的方法,自己下载并且安装好。

一. 配置 OCI(安装 Navicat 与 解压 Instant Client 就不多说了)


oci.dll 是指oracle的客户端的一个环境dll文件。可以从oracle官网下载 


32位地址: http://www.oracle.com/technetwork/topics/winsoft-085727.html


64位地址:http://www.oracle.com/technetwork/topics/winx64soft-089540.html


一般都是32位的地址,我就是用的32位的


打开 Navicat , 选择 工具 ---> 选项


mysql下的data中的数据库如何移植到新的数据库 mysql数据库迁移到oracle_mysql

mysql下的data中的数据库如何移植到新的数据库 mysql数据库迁移到oracle_oracle_02




重启 Navicat


二.添加数据库连接


mysql下的data中的数据库如何移植到新的数据库 mysql数据库迁移到oracle_oracle_03

  分别选择需要迁移的数据库类型. 我选择的是 oracle 和 mysql , 这个只要正确填写数据库地址, 用户名 和 密码即可



三,建立数据传输


选择 工具----> 数据传输, 按照提示操作即可. 


有两种方式: 一种是直接传输到数据库, 一种是生成目标数据库的 sql 文件


我用第一种时没有成功, 因为数据的原因. 所以采用了第二种方式




第一种:


mysql下的data中的数据库如何移植到新的数据库 mysql数据库迁移到oracle_oracle_04




第二种: 




mysql下的data中的数据库如何移植到新的数据库 mysql数据库迁移到oracle_mysql_05

将生成的sql 文件导入到 mysql 中即可



注意点:

1、由于MySQL的date类型只支持存储日期,不能存储时间,navicat在转换时,如果是oracle的date,会自动转成mysql的date,这样会导致mysql的精度不够而报错,所以要提前将oracle的date类型转换成timestamp类型。如果表的数量比较多,手工改太麻烦了,我这里写了个存储过程,自动将oracle中所有表中的DATE类型转换成TIMESTAMP类型:


[sql]  
1. create or replace procedure convert_date_to_timestamp  
2. /**************************  
3. function: 将数据库中所有的表中含DATE类型的字段改为TIMESTAMP类型;  
4.   需要建立下列类型表:  
5. create table type_table_info (  
6.     table_name varchar2(30),  
7.     column_name varchar2(30),  
8.     data_type varchar2(100)  
9.   )    
10. ***************************/  
11. is  
12. 'SELECT table_name, column_name, data_type FROM all_tab_cols WHERE table_name = ''';  
13.   v_query_table_sql varchar2(150);  
14.   v_alter_sql varchar2(100);  
15.   
16. is table of type_table_info%rowtype;  
17.   table_array table_type;  
18.   
19. begin  
20. for c_tabs in (  
21. select table_name from user_tables where table_name <> 'type_table_info'   
22.     )  
23.     loop  
24. '''';  
25. execute immediate v_query_table_sql bulk collect into table_array;  
26. for i in table_array.first .. table_array.last  
27.         loop  
28. --DBMS_OUTPUT.put_line(table_array(i).column_name || ':' || table_array(i).data_type);  
29. 'DATE' then  
30. 'alter table ' || table_array(i).table_name || ' modify ' || table_array(i).column_name || ' timestamp';  
31. ': ' || v_alter_sql);  
32. execute immediate v_alter_sql;  
33. end if;  
34.             
35. end loop;  
36. end loop;  
37. end convert_date_to_timestamp;


2、异常信息:Specified key was too long; max key length is 767 bytes 

这是因为索引字段太长导致的,我这边是通过修改mysql字符集解决的,改为utf8.如果还是不行找到对应的表看看索引字段能不能调整小一点。

转换步骤:


工具-->数据传输,在“源”中选择待复制的数据库(oracle)信息,选中所有表,在“目标”中选择目标数据库(mysql),然后点击“开始”,即可实现批量从oracle库复制表到mysql库了,在“信息日志”栏中可以查看日志信息,如果有"unsuccessly"表示当前表未复制成功,可以查看异常信息作相应处理后再转换。





由于语法差异,函数、视图等不支持自动转换,需要一个一个的复制修改了。


这里简单介绍下oracle与mysql的一些异同点,在转换视图、函数时会用到:


1、mysql查询时,表名必须大写(别名也区分大小写);
2、mysql的使用函数时,函数名和括号之间不能有空格,>= 之间也不能有空格(如,> =会报错);
3、mysql视图中不支持子查询,必须使用视图嵌套;
4、mysql中的系统函数与oracle中的系统函数有很多差异,这里需要特别注意下。