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


    注意点:

    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:	ianzhi_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:	ianzhi_smart.dmp' full=y;
  • 相关阅读:
    决定你人生高度的,不是你的才能,而是你的态度
    享受六一的最后几分钟
    DB9 公头母头引脚定义及连接
    bzoj3207--Hash+主席树
    bzoj1901 [ Zju2112 ] --树状数组套主席树
    bzoj1723 [ Usaco2009 Feb ] --前缀和(水题)
    bzoj3932 [ CQOI2015 ] --可持久化线段树
    bzoj3037--贪心
    bzoj3388 [ Usaco2004 Dec ] (神奇的解法)
    bzoj2693--莫比乌斯反演+积性函数线性筛
  • 原文地址:https://www.cnblogs.com/zxm2016-6/p/8081001.html
Copyright © 2020-2023  润新知