数据库:跨数据库,服务器数据迁移

注意点:

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

  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.   v_query_base_sql varchar2(100) := '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.   type table_type 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.       v_query_table_sql := v_query_base_sql || c_tabs.table_name || '''';  
  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.           if table_array(i).data_type = 'DATE' then  
  30.             v_alter_sql := 'alter table ' || table_array(i).table_name || ' modify ' || table_array(i).column_name || ' timestamp';  
  31.             DBMS_OUTPUT.put_line(table_array(i).column_name || ': ' || 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中的系统函数有很多差异,这里需要特别注意下。

另一种方法:

1.从源数据库导出数据:

语法:

exp user1/pwd1@test1 file='E:test.dmp';
  • 1

示例:

exp tianzhi_smart/tianzhi_smart@192.168.56.60:1521/orcl file='E:\tianzhi_smart.dmp';


2.向目标数据库导入数据:

语法:

imp user2/pwd@test2 file='E:test.dmp' full=y;
  • 1

示例:

imp tianzhi_smart/tianzhi_smart@192.168.10.129:1521/orcl file='E:\tianzhi_smart.dmp' full=y;

 

 

 

posted on 2017-12-21 15:56  Cynthin  阅读(1511)  评论(1编辑  收藏  举报

导航