数据库
首页 > 数据库> > Navicat Premium数据迁移,去O转Mysql

Navicat Premium数据迁移,去O转Mysql

作者:互联网

1.使用工具Navicat Premium连接oracle和mysql

连接本地oracle需下载对应的oci文件
OCI下载地址
将下载的oci文件解压,Navicat Premium->工具->选项,找到oci配置oci文件解压地址

2.迁移遇到的问题及解决方法

1.oracle的date数据类型迁移到mysql前需要转换为timestamp类型,工具迁移时会将timestamp自动转换为mysql中的datetime数据类型。

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

create or replace procedure convert_date_to_timestamp
/**************************
  function: 将数据库中所有的表中含DATE类型的字段改为TIMESTAMP类型;
  需要建立下列类型表:
  create table type_table_info (
    table_name varchar2(30),
    column_name varchar2(30),
    data_type varchar2(100)
  )  
***************************/
is
  v_query_base_sql varchar2(100) := 'SELECT table_name, column_name, data_type FROM all_tab_cols WHERE table_name = ''';
  v_query_table_sql varchar2(150);
  v_alter_sql varchar2(100);
 
  type table_type is table of type_table_info%rowtype;
  table_array table_type;
 
begin
DBMS_OUTPUT.ENABLE (buffer_size=>null);
  for c_tabs in (
       select table_name from user_tables where table_name <> 'type_table_info' 
    )
    loop
      v_query_table_sql := v_query_base_sql || c_tabs.table_name || '''';
      execute immediate v_query_table_sql bulk collect into table_array;
      for i in table_array.first .. table_array.last
        loop
          --DBMS_OUTPUT.put_line(table_array(i).column_name || ':' || table_array(i).data_type);
          if table_array(i).data_type = 'DATE' then
            v_alter_sql := 'alter table ' || table_array(i).table_name || ' modify ' || table_array(i).column_name || ' timestamp';
            DBMS_OUTPUT.put_line(table_array(i).column_name || ': ' || v_alter_sql);
            execute immediate v_alter_sql;
          end if;
          
        end loop;
    end loop;
end convert_date_to_timestamp;

执行注意:
(1).先建存储过程中的表
(2)在plsql程序窗口编译该段代码
(3)调用存储过程,报错buffer问题已在存储过程加入DBMS_OUTPUT.ENABLE (buffer_size=>null);解决

begin
      convert_date_to_timestamp();
  end;

2.mysql下max_allowed_packet参数限制
(1)命令行修改(liunx和windows下都可不重启生效)
mysql -u数据库名 -p进入去修改

这里是引用
set global max_allowed_packet = 210241024*10;
注意:
这样修改会报错:mysql> set max_allowed_packet=16MB;
ERROR 1232 (42000): Incorrect argument type to variable ‘max_allowed_packet’
查看是否修改成功

show VARIABLES like '%max_allowed_packet%';

在这里插入图片描述
3.迁移支持断点迁移,效率考虑我用了一台机器迁了一部分到本地的sql库中导出为sql文件在跳板机往目的库迁移,期间报错mysql导入错误,提示需要super权限

这里是引用
用户权限表一般在mysql库中,切换到该库
授权用户super权限
update user set Super_priv=‘Y’ where User=‘用户名’;
flush privileges;

3.工具迁移

工具->数据传输,选择源库、目的库,高级中将相关参数设置好即可开始迁移
在这里插入图片描述

转载自
https://blog.csdn.net/weixin_40946381/article/details/104003496
https://blog.csdn.net/dd276/article/details/52089216

标签:Premium,name,Mysql,Navicat,sql,mysql,table,array,type
来源: https://blog.csdn.net/weixin_45612169/article/details/122025870