首先需要注意的是DATAX是通过JDBC的方式读取ORACLE数据,然后通过OCI的方式写数据,DX也可以通过JDBC写的方式进行,但是OCI比JDBC速度更快。

 

进入DataX安装目录的bin目录,执行命令

./datax.py -e

输入交换数据数据库对应的代码,它会自动生成相应的xml配置文件

 

编辑配置文件参数,有"?"的是必须配置的,默认的可以保持不变

执行代码:

vi /home/taobao/datax/jobs/oraclereader_to_oraclewriter_1459821656288.xml

DataX Job配置文件ORACLEREADER和ORACLEWIRTER配置项清单

Xml配置文件

其中mandatory:true表示必填

需要注意的是其中tnsfile可以不填保持默认的就行,tnsfile,oracle jdbc连接有2种方式,一种是直接通过jdbc:oracle:thin:@ip:1521/dbname,另外一种是通过本地tns连接,具体的可以通过看源文件里面的oraclereader.java文件了解到,如果你选择tnsfile方式连接填写的tns路径就是你本地客户端的tnsname.ora的具体路径。

还有一点需要注意,这里的dbname要注意清楚,xml配置文件里面的oraclereader和oraclewirter里面的dbname都是服务名,由于一开始我不清楚,写成了SID名,后来遇到错误,调试了好久,最后通过看源码进行测试,以为源码错误,源代码里面的是"/"不是":",然后修改了源码,,才不报错,如果你一开始就写的服务名,后面就不需要修改

以下是两种oracle jdbc连接方式:

服务名连接方式:jdbc:oracle:thin:@ip:1521/dbname

SID连接方式:jdbc:oracle:thin:@ip:dbname

两种运行报错:

SID连接方式,我把dbname写成了服务名

Caused by: java.sql.SQLException: Listener refused the connection with the following error:

ORA-12505, TNS:listener does not currently know of SID given in connect descriptor

The Connection descriptor used by the client was:

192.168.35.193:1521:edwfjtest

服务名连接方式,我写成了SID名

Caused by: java.lang.IllegalStateException: java.sql.SQLException: Listener refused the connection with the following error:

ORA-12514, TNS:listener does not currently know of service requested in connect descriptor

The Connection descriptor used by the client was:

192.168.35.193:1521/edworcl

 

运行datax.py文件 ,job.xml文件的路径要是绝对路路径

./datax.py vi /home/taobao/datax/jobs/oraclereader_to_oraclewriter_1459821656288.xml

报错:

Causedby:java.lang.UnsatisfiedLinkError: /home/taobao/datax/plugins/writer/oraclewriter/liboraclewriter.so:libclntsh.so.10.1:cannot open shared object file: No such file or directory

解决办法:先看上面的地址里面的文件是不是存在,一般是存在的。

如果存在,则可能是你的liboraclewriter.so文件和你的当前的版本不匹配,liboraclewirter.so最好需要单独编译

编译符合环境的oraclewriter。

datax的文档是这样写的:

由于Oracle最终通过jni调用oci机制导入数据, 默认情况下,DataX提供基于Intel x86_64 liboraclewriter.so包。如果你使用的平台硬件和默认情况不匹配,需要编译oraclewriter C++代码,liboraclewriter.so需要libiconv库的支持,请先检查该库是否存在。具体编译过程如下:

1) 进入 DataX源码中的c++/src/oracledumper/src/ 目录

2) 输入make命令即可编译

3) 将当前目录下编译完成的liboraclewriter.so 拷贝至/home/taobao/datax/plugins/目录下,覆盖默认的liboraclewriter.so即可

注意事项:如果本地代码使用的包名不同于源码的,需要修改对应的文件。

修改文件:include中:xx_OracleWriterJni.h(修改文件名和 OracleWriterJni.h中方法的包路径名。)

src中:xx_OracleWriterJni.cpp (修改文件名)

*这一步是要在oracle软件安装的那一台机器上上面去编译,并且环境变量中指定ORACLE_HOME

*要指明LD_LIBRARY_PATH

*其中还要安装libiconv库(如果没有安装会提示你找不到这个库)

 

编译的时候还会报错,说找不到文件,但是修改了下面的代码后就没报错了(红色的部分是需要添加的代码)

 

[root@localhost src]# cat Makefile

INCLUDE=-I../include -I${ORACLE_HOME}/jdk/include-I${ORACLE_HOME}/jdk/include/linux

LIBS=-lclntsh -liconv -L../lib -L${ORACLE_HOME}/lib -L../../../../libs/

CC=g++

OBJS=liboraclewriter.so

CFLAGS=-shared -fPIC -Wl,-rpath=/home/taobao/datax/libs

CPP=common.cpp dumper.cpp oradumper.cpp strsplit.cpp com_taobao_datax_plugins_writer_oraclewriter_OracleWriterJni.cpp

 

OBJS: $(CPP)

$(CC) $(INCLUDE) -o $(OBJS) $(CPP) $(CFLAGS) $(LIBS)

clean:

rm -rf $(OBJS)

 

 

覆盖原来的liboraclewriter.so后,再执行原来的文件。

./datax.py vi /home/taobao/datax/jobs/oraclereader_to_oraclewriter_1459821656288.xml

我的系统又报了一个错误,这个错误很好解决

Causedby:java.lang.UnsatisfiedLinkError:/home/taobao/datax/plugins/writer/oraclewriter/liboraclewriter.so: /home/taobao/datax/plugins/writer/oraclewriter/libclntsh.so.11.1:

cannot restore segment prot after reloc: Permission denied

错误信息:

cannot restore segment prot after reloc: Permission denied

解决办法:

[root@enterprice64 ~]# getenforce

Enforcing

[root@enterprice64 ~]# setenforce 0

[root@enterprice64 ~]# getenforce

Permissive

解决成功,然后,测试成功

DataX实现oracle到oracle之间的数据传递的更多相关文章

  1. sqoop实现关系型数据库与hadoop之间的数据传递-import篇

    由于业务数据量日益增长,计算量非常庞大,传统的数仓已经无法满足计算需求了,所以现在基本上都是将数据放到hadoop平台去实现逻辑计算,那么就涉及到如何将oracle数仓的数据迁移到hadoop平台的问 ...

  2. ASP.NET MVC3中Controller与View之间的数据传递

    在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一.  Controller向Vie ...

  3. Activity之间的数据传递

    最常用的Activity之间的数据传递. btnStartAty1.setOnClickListener(new View.OnClickListener() { @Override public v ...

  4. ASP.NET MVC 之控制器与视图之间的数据传递

    今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...

  5. (转载)Javascript操作表单之间的数据传递

    (转载)http://www.aspxhome.com/javascript/skills/200710/214825.htm 今天有朋友问我关于用JAVASCRIPT来进行页面各表单之间的数据传递的 ...

  6. iOS开发中视图控制器ViewControllers之间的数据传递

    iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...

  7. React中父组件与子组件之间的数据传递和标准化的思考

    React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...

  8. Vue 爬坑之路(二)—— 组件之间的数据传递

    Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...

  9. Activity之间的数据传递-android学习之旅(四十七)

    activity之间的数据传递主要有两种,一种是直接发送数据,另一种接受新启动的activity返回的数据,本质是一样的 使用Bundle传递数据 Intent使用Bundle在activity之间传 ...

  10. activity之间的数据传递方法

    1  基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Inte ...

随机推荐

  1. SQL Server 利用WITH AS递归获取层级关系数据

    WITH AS短语,也叫做子查询部分(subquery factoring),在SQL Server 2005中提供了一种解决方案,这就是公用表表达式(CTE),使用CTE,可以使SQL语句的可维护性 ...

  2. 高通平台MSM8916LCM模块移植(一)-bootloader部分【转】

    本文转载自:http://www.mobile-open.com/2016/970947.html 高通平台中的bootloader叫做LK(Little Kernel,对于LCM来说LK部分相当重要 ...

  3. 修改和重置WAMP的phpMyAdmin密码

    WAMP是Windows下的Apache+Mysql/MariaDB+Perl/PHP/Python,常用来搭建动态网站或者服务器的开源软件. 1.下载页面:http://www.wampserver ...

  4. 转:gdb相关学习

    声明本文转自:http://www.cnblogs.com/rosesmall/archive/2012/04/12/2444431.html (查看内存部分有补充) 另推荐一个入门级的好文章:htt ...

  5. cdq分治入门and持续学习orz

    感觉cdq分治是一个很有趣的算法 能将很多需要套数据结构的题通过离线来做 目前的一些微小的理解 在一般情况下 就像求三维偏序xyz 就可以先对x排序 然后分治 1 cdq_x(L,M) ; 2 提取出 ...

  6. jQuery Fancybox插件使用参数详解

    Fancybox的特点如下: 可以支持图片.html文本.flash动画.iframe以及ajax的支持 可以自定义播放器的CSS样式 可以以组的形式进行播放 如果将鼠标滚动插件(mouse whee ...

  7. CSS基础(float属性与清除浮动)

    3.8 这是CSS里比较重要的属性:浮动,这个属性会在以后经常用到,算是一个重点吧 浮动 语法:float:left  |  right  |  none 特点: 浮动的元素不占位置,脱离了标准文档流 ...

  8. es6语法入门let 和 const 命令

    let块级作用域 { let a = 10; var b = 1; } a // ReferenceError: a is not defined. b for循环的计数器,就很合适使用let命令(防 ...

  9. Atom设置震撼的编辑效果

    在代码编辑器.文本编辑器领域,有着不少的「神器」级的产品,如历史悠久的 VIM.Emacs 以及如今当红的SublimeText.另外还有 EditPlus.NotePad++.UltraEdit 等 ...

  10. C++结构体成员列表初始化

    C++关于struct和class的区别,可以看上一篇文章:c ++ class和struct[转] 结构体成员列表初始化,来个例子: #include <iostream> #inclu ...