在oracle数据库迁移至mysql数据库,除了oracle数据库模型移到mysql外,还一个重点环节就是要将oracle数据库的数据移到mysql数据库,本人尝试用过多个数据迁移程序,性能都不是很好的,于是自己动手写一个针对于oracle数据库数据迁移到mysql数据程序,其详细过程如下:

1、要抽取mysql表、字段及过滤条件的配制文件imp_data.sql

2、建立一个目录ETL_DIR

3、运行oracle数据库程序P_ETL_ORA_DATA,生成各表的csv数据文件,同时也生成一个导入mysql的脚本文件imp_data.sql

4、导入mysql数据,文件内容如下

load data infile "alarm_hist_inc.csv" into table alarm_hist_inc fields terminated by "," enclosed by "^" lines terminated by "\r\n";

load data infile "button_authority.csv" into table button_authority fields terminated by "," enclosed by "^" lines terminated by "\r\n";

load data infile "c3_sms_hist_inc.csv" into table c3_sms_hist_inc fields terminated by "," enclosed by "^" lines terminated by "\r\n";

load data infile "datapermisson.csv" into table datapermisson fields terminated by "," enclosed by "^" lines terminated by "\r\n";

附:数据库脚本P_ETL_ORA_DATA

CREATE OR REPLACE PROCEDURE P_ETL_ORA_DATA

(

P_ORA_DIR VARCHAR2,

P_DATA_PATH VARCHAR2

) IS

TYPE T_REC IS RECORD(

TBN VARCHAR2(40),

WHR VARCHAR2(4000));

TYPE T_TABS IS TABLE OF T_REC;

V_TABS T_TABS := T_TABS();

V_ETL_DIR VARCHAR2(40) := P_ORA_DIR;

V_LOAD_FILE UTL_FILE.FILE_TYPE;

PROCEDURE ETL_DATA

(

P_SQL_STMT VARCHAR2,

P_DATA_PATH VARCHAR2,

P_TB_NAME VARCHAR2

) IS

BEGIN

DECLARE

V_VAR_COL VARCHAR2(32767);

V_NUM_COL NUMBER;

V_DATE_COL DATE;

V_TMZ TIMESTAMP;

V_COLS NUMBER;

V_COLS_DESC DBMS_SQL.DESC_TAB;

V_ROW_STR VARCHAR2(32767);

V_COL_STR VARCHAR2(32767);

V_SQL_ID NUMBER;

V_SQL_REF SYS_REFCURSOR;

V_EXP_FILE UTL_FILE.FILE_TYPE;

V_DATA_PATH VARCHAR2(200);

BEGIN

V_DATA_PATH := P_DATA_PATH;

IF REGEXP_SUBSTR(V_DATA_PATH, '\\$') IS NULL

THEN

V_DATA_PATH := V_DATA_PATH || '\';

END IF;

V_DATA_PATH := REPLACE(V_DATA_PATH, '\', '\\');

OPEN V_SQL_REF FOR P_SQL_STMT;

V_SQL_ID := DBMS_SQL.TO_CURSOR_NUMBER(V_SQL_REF);

DBMS_SQL.DESCRIBE_COLUMNS(V_SQL_ID, V_COLS, V_COLS_DESC);

FOR I IN V_COLS_DESC.FIRST .. V_COLS_DESC.LAST

LOOP

CASE

WHEN V_COLS_DESC(I).COL_TYPE IN (1, 9, 96) THEN

DBMS_SQL.DEFINE_COLUMN(V_SQL_ID, I, V_VAR_COL, 32767);

WHEN V_COLS_DESC(I).COL_TYPE = 2 THEN

DBMS_SQL.DEFINE_COLUMN(V_SQL_ID, I, V_NUM_COL);

WHEN V_COLS_DESC(I).COL_TYPE = 12 THEN

DBMS_SQL.DEFINE_COLUMN(V_SQL_ID, I, V_DATE_COL);

WHEN V_COLS_DESC(I).COL_TYPE = 180 THEN

DBMS_SQL.DEFINE_COLUMN(V_SQL_ID, I, V_TMZ);

END CASE;

END LOOP;

DECLARE

V_FLUSH_OVER PLS_INTEGER := 1;

V_FILE_OVER PLS_INTEGER := 1;

V_FILE_NO PLS_INTEGER := 1;

V_FILE_NAME VARCHAR2(200);

V_LINE VARCHAR2(400);

BEGIN

WHILE DBMS_SQL.FETCH_ROWS(V_SQL_ID) > 0

LOOP

IF V_FILE_OVER = 1

THEN

V_FILE_NAME := P_TB_NAME || '_' || V_FILE_NO || '.csv';

V_EXP_FILE := UTL_FILE.FOPEN(V_ETL_DIR, V_FILE_NAME, OPEN_MODE => 'w', MAX_LINESIZE => 32767);

END IF;

V_ROW_STR := '';

FOR I IN 1 .. V_COLS

LOOP

V_COL_STR := '\N';

BEGIN

CASE

WHEN V_COLS_DESC(I).COL_TYPE IN (1, 9, 96) THEN

DBMS_SQL.COLUMN_VALUE(V_SQL_ID, I, V_VAR_COL);

IF V_VAR_COL IS NOT NULL

THEN

V_COL_STR := '^' || V_VAR_COL || '^';

END IF;

WHEN V_COLS_DESC(I).COL_TYPE = 2 THEN

DBMS_SQL.COLUMN_VALUE(V_SQL_ID, I, V_NUM_COL);

IF V_NUM_COL IS NOT NULL

THEN

V_COL_STR := V_NUM_COL;

END IF;

WHEN V_COLS_DESC(I).COL_TYPE = 12 THEN

DBMS_SQL.COLUMN_VALUE(V_SQL_ID, I, V_DATE_COL);

IF V_DATE_COL IS NOT NULL

THEN

V_COL_STR := '^' || TO_CHAR(V_DATE_COL, 'yyyy-mm-dd hh24:mi:ss') || '^';

END IF;

WHEN V_COLS_DESC(I).COL_TYPE IN (180, 181, 231) THEN

DBMS_SQL.COLUMN_VALUE(V_SQL_ID, I, V_TMZ);

IF V_TMZ IS NOT NULL

THEN

V_COL_STR := '^' || TO_CHAR(V_TMZ, 'yyyy-mm-dd hh24:mi:ss.ff6') || '^';

END IF;

END CASE;

IF I = 1

THEN

V_ROW_STR := V_COL_STR;

ELSE

V_ROW_STR := V_ROW_STR || ',' || V_COL_STR;

END IF;

END;

END LOOP;

UTL_FILE.PUT_LINE(V_EXP_FILE, CONVERT(V_ROW_STR, 'UTF8'));

IF V_FILE_OVER > 200000 /*每200000条记录就产生一个新版的文件*/

THEN

V_FILE_OVER := 1;

V_FLUSH_OVER := 1;

V_FILE_NO := V_FILE_NO + 1;

UTL_FILE.FCLOSE(V_EXP_FILE);

V_LINE := 'load data infile "' || V_DATA_PATH || V_FILE_NAME || '" into table ' || P_TB_NAME;

V_LINE := V_LINE || ' fields terminated by "," enclosed by "^" lines terminated by "\r\n";';

UTL_FILE.PUT_LINE(V_LOAD_FILE, V_LINE);

UTL_FILE.FFLUSH(V_LOAD_FILE);

CONTINUE;

END IF;

V_FILE_OVER := V_FILE_OVER + 1;

IF V_FLUSH_OVER > 2000 /*每2000条记录就刷新版缓存,写到文件中 */

THEN

UTL_FILE.FFLUSH(V_EXP_FILE);

V_FLUSH_OVER := 1;

ELSE

V_FLUSH_OVER := V_FLUSH_OVER + 1;

END IF;

END LOOP;

DBMS_SQL.CLOSE_CURSOR(V_SQL_ID);

IF UTL_FILE.IS_OPEN(V_EXP_FILE)

THEN

UTL_FILE.FCLOSE(V_EXP_FILE);

V_LINE := 'load data infile "' || V_DATA_PATH || V_FILE_NAME || '" into table ' || P_TB_NAME;

V_LINE := V_LINE || ' fields terminated by "," enclosed by "^" lines terminated by "\r\n";';

UTL_FILE.PUT_LINE(V_LOAD_FILE, V_LINE);

UTL_FILE.FFLUSH(V_LOAD_FILE);

END IF;

END;

EXCEPTION

WHEN OTHERS THEN

IF DBMS_SQL.IS_OPEN(V_SQL_ID)

THEN

DBMS_SQL.CLOSE_CURSOR(V_SQL_ID);

END IF;

IF UTL_FILE.IS_OPEN(V_EXP_FILE)

THEN

UTL_FILE.FCLOSE(V_EXP_FILE);

END IF;

DBMS_OUTPUT.PUT_LINE(SQLERRM);

DBMS_OUTPUT.PUT_LINE(P_SQL_STMT);

END;

END;

BEGIN

BEGIN

EXECUTE IMMEDIATE 'create table mysql_etl_tbs(tn varchar2(40),cn varchar2(40),ci number) ';

EXCEPTION

WHEN OTHERS THEN

NULL;

END;

EXECUTE IMMEDIATE 'truncate table mysql_etl_tbs';

DECLARE

V_CI PLS_INTEGER;

V_CN VARCHAR2(40);

V_ETL_COLS VARCHAR2(32767);

V_TBN VARCHAR2(30);

V_ETL_CFG VARCHAR2(32767);

V_CNF_FILE UTL_FILE.FILE_TYPE;

V_FROM_POS PLS_INTEGER;

BEGIN

V_CNF_FILE := UTL_FILE.FOPEN(V_ETL_DIR, 'ETL_TABS.CNF', 'r', 32767);

LOOP

UTL_FILE.GET_LINE(V_CNF_FILE, V_ETL_CFG, 32767);

V_FROM_POS := REGEXP_INSTR(V_ETL_CFG, 'from', 1, 1, 0, 'i');

V_ETL_COLS := SUBSTR(V_ETL_CFG, 1, V_FROM_POS - 1);

V_ETL_COLS := REGEXP_SUBSTR(V_ETL_COLS, '(select)(.+)', 1, 1, 'i', 2);

V_TBN := REGEXP_SUBSTR(V_ETL_CFG, '(\s+from\s+)(\w+)(\s*)', 1, 1, 'i', 2);

V_TBN := UPPER(V_TBN);

V_TABS.EXTEND();

V_TABS(V_TABS.LAST).TBN := V_TBN;

V_TABS(V_TABS.LAST).WHR := REGEXP_SUBSTR(V_ETL_CFG, '\s+where .+', 1, 1, 'i');

V_CI := 1;

LOOP

V_CN := REGEXP_SUBSTR(V_ETL_COLS, '\S+', 1, V_CI);

EXIT WHEN V_CN IS NULL;

V_CN := UPPER(V_CN);

EXECUTE IMMEDIATE 'insert into mysql_etl_tbs(tn,cn,ci) values(:1,:2,:3)'

USING V_TBN, V_CN, V_CI;

COMMIT;

V_CI := V_CI + 1;

END LOOP;

END LOOP;

EXCEPTION

WHEN UTL_FILE.INVALID_PATH THEN

DBMS_OUTPUT.PUT_LINE('指定的目录:ETL_DIR"' || '"无效!');

RETURN;

WHEN UTL_FILE.INVALID_FILENAME THEN

DBMS_OUTPUT.PUT_LINE('指定的文件:" ETL_TABS.CNF' || '"无效!');

RETURN;

WHEN NO_DATA_FOUND THEN

UTL_FILE.FCLOSE(V_CNF_FILE);

WHEN OTHERS THEN

DBMS_OUTPUT.PUT_LINE(SQLERRM);

RETURN;

END;

DECLARE

V_CUR_MATCH SYS_REFCURSOR;

V_SQL_SMT VARCHAR2(32767);

V_TN VARCHAR2(40);

V_CN VARCHAR2(40);

V_CI PLS_INTEGER;

V_COLUMN_NAME VARCHAR2(40);

V_ETL_COLS VARCHAR2(32767);

V_LINE VARCHAR2(4000);

V_TBN VARCHAR2(40);

BEGIN

V_LOAD_FILE := UTL_FILE.FOPEN(V_ETL_DIR, 'load_data.sql', OPEN_MODE => 'w', MAX_LINESIZE => 32767);

FOR T_IX IN V_TABS.FIRST .. V_TABS.LAST

LOOP

V_SQL_SMT := 'select tn,cn,column_name,ci from ( select * from mysql_etl_tbs where tn='':tbn:'' ) l left join user_tab_columns r on l.tn = r.table_name and l.cn= r.column_name order by ci';

V_TBN := V_TABS(T_IX).TBN;

V_SQL_SMT := REPLACE(V_SQL_SMT, ':tbn:', V_TBN);

V_ETL_COLS := NULL;

OPEN V_CUR_MATCH FOR V_SQL_SMT;

LOOP

FETCH V_CUR_MATCH

INTO V_TN, V_CN, V_COLUMN_NAME, V_CI;

EXIT WHEN V_CUR_MATCH%NOTFOUND;

IF V_CI > 1

THEN

V_ETL_COLS := V_ETL_COLS || ' , ';

END IF;

IF V_COLUMN_NAME IS NULL

THEN

V_ETL_COLS := V_ETL_COLS || ' cast(null as number) ' || V_CN;

ELSE

V_ETL_COLS := V_ETL_COLS || V_CN;

END IF;

END LOOP;

CLOSE V_CUR_MATCH;

V_TBN := LOWER(V_TBN);

V_SQL_SMT := 'select ' || V_ETL_COLS || ' from ' || V_TBN || V_TABS(T_IX).WHR;

ETL_DATA(V_SQL_SMT, P_DATA_PATH, V_TBN);

END LOOP;

IF UTL_FILE.IS_OPEN(V_LOAD_FILE)

THEN

UTL_FILE.FCLOSE(V_LOAD_FILE);

END IF;

END;

END P_ETL_ORA_DATA;

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习网上卖,谢谢大家对乐购源码的支持。如果你想理解更多相关内容请查看下面相关链接

orcle抽数据到mysql_抽取oracle数据到mysql数据库的实现过程相关推荐

  1. 关于flink cdc 抽取oracle数据 oracle表名大小写的问题

    使用flink cdc 抽取oracle数据 报错ALTER TABLE XXXXX ADD SUPPLEMENTAL LOG DATA (ALL) COLUMNS; 我使用的是flink cdc的 ...

  2. php 分表 实战,PHP实战:1亿条数据如何分表100张到Mysql数据库中(PHP)

    <PHP实战:1亿条数据如何分表100张到Mysql数据库中(PHP)>要点: 本文介绍了PHP实战:1亿条数据如何分表100张到Mysql数据库中(PHP),希望对您有用.如果有疑问,可 ...

  3. python爬取玉米、小麦、水稻信息数据到本地为网页形式和mysql数据库中

    1.创建Scrapy项目 scrapy startproject ExGrain 2.进入项目目录,使用命令genspider创建Spider scrapy genspider exgrain ex- ...

  4. oracle脚本导入mysql数据库_oracle脚本导入mysql数据库

    关于 oracle脚本导入mysql数据库的搜索结果 问题 如何将一个mysql 风格的 sql 脚本转换为 oracle 导入的 sql 脚本 - 数据库报错 如何将一个 mysql 风格的 sql ...

  5. Debezium 抽取oracle数据

    1.环境介绍 操作系统:centos 7.9 jdk版本:11.0.12 kafka版本:2.8.0 Debezium版本:1.6(debezium-connector-oracle-1.6.1.Fi ...

  6. oracle 数据导入 mysql_将oracle的数据导入到mysql的三种方法

    为了生产库释放部分资源,需要将API模块迁移到MysqL中,及需要导数据. 尝试了oracle to MysqL工具,迁移时报错不说,这么大的数据量,用这种简陋的工具不大可靠. 意外发现平时用的数据库 ...

  7. ubuntu下oracle数据的导入,导入oracle数据库命令行

    Windows DOS窗体下Oracle 数据库的导入导出命令 oracle 用户创建 数据库的导入导出imp/exp 可以在SQLPLUS.EXE或者DOS(命令行)中执行 执行环境:可以在SQLP ...

  8. oracle数据提交不上去,oracle数据库命令窗口执行了语句但是没有提交会有什么影响吗...

    Oracle数据库里面有DCL语句(Data Control Language),一共有四个关键字,commit.rollback.grant和revoke.它们执行的时候,你都不会有什么感觉.com ...

  9. oracle数据泵的原理,oracle 数据泵 详解

    导出数据 1)按用户导 expdp scott/tiger@orcl schemas=scott dumpfile=expdp.dmp DIRECTORY=dir logfile=expdp.log ...

最新文章

  1. 编程的50种基础算法_[校招基础算法]常见的ML、DL编程题
  2. 会议报名丨CSSNLP 2020 第一届中国自然语言处理学生研讨会开放注册
  3. http://forensics.idealtest.org CASIA图像篡改数据库
  4. SpringMVC+MyBatis+Druid使用MySQL8.0.11版本
  5. Servlet的Cookie和HttpSession
  6. SolrJ添加商品数据
  7. js调用php和php调用js的方法举例
  8. C#核编之系统数据类型和相应的C#关键字
  9. 云端计算机可以玩游戏么,手机掌上云电脑是什么?为什么可以玩PC游戏?
  10. python excel数据框_python – 熊猫数据框到Excel表
  11. ros创建工作空间_ROS 初级 - 安装和配置 ROS 环境
  12. 将PHP对象转换为关联数组
  13. 阻塞模式下的超时等待
  14. 计算机考研调剂学校2019有哪些,2019考研调剂:最全的调剂攻略千万别错过!
  15. 数学建模美赛历年优秀论文(O奖)
  16. 基于CNN的车牌识别
  17. python爬取下载有妖气漫画网站免费漫画
  18. 销售管理软件系统的两大优势是什么?
  19. C# 之 TcpClient和Socket
  20. win10如何调整计算机时间同步,Win10系统时间不准如何解决 win10系统设置时间同步的方法...

热门文章

  1. 编译bluez-5.25 通过 Linux环境下运行
  2. 26 | 案例篇:如何找出狂打日志的“内鬼”?
  3. consul 自动发现与自动注册
  4. java 时间处理_JAVA处理日期时间常用方法
  5. python缓存技术_Python中整数的缓存机制讲解
  6. python 全部缩进一行_Python(48)语言参考2:词法分析
  7. 一文了解结构体字节对齐
  8. 阿里云智能物联网解决方案宣讲会,帮助天津东丽临空经济区数字腾飞
  9. 快手基于RocketMQ的在线消息系统建设实践
  10. 朱峰谈概念设计(六):美术部门