DataX实现oracle到oracle之间数据传递

文章讲的是 DataX实现oracle到oracle之间数据传递首先需要注意的是DATAX是通过JDBC的方式读取ORACLE数据,然后通过OCI的方式写数据,DX也可以通过JDBC写的方式进行,但是OCI比JDBC速度更快。

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

  ./datax.py -e

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

  DataX实现oracle到oracle之间数据传递

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

  执行代码:

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

  DataX实现oracle到oracle之间数据传递

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

  DataX实现oracle到oracle之间数据传递

  DataX实现oracle到oracle之间数据传递

  Xml配置文件

  DataX实现oracle到oracle之间数据传递

  其中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

  DataX实现oracle到oracle之间数据传递

  报错:

  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

  DataX实现oracle到oracle之间数据传递

  我的系统又报了一个错误,这个错误很好解决 Causedby:java.lang.UnsatisfiedLinkError:/home/taobao/datax/plugins/writer/oraclewriter/liboraclew  riter.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之间数据传递


作者:旷世 

来源:IT168

原文链接:DataX实现oracle到oracle之间数据传递

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值