DataX实现oracle到oracle之间的数据传递
首先需要注意的是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之间的数据传递的更多相关文章
- sqoop实现关系型数据库与hadoop之间的数据传递-import篇
由于业务数据量日益增长,计算量非常庞大,传统的数仓已经无法满足计算需求了,所以现在基本上都是将数据放到hadoop平台去实现逻辑计算,那么就涉及到如何将oracle数仓的数据迁移到hadoop平台的问 ...
- ASP.NET MVC3中Controller与View之间的数据传递
在ASP.NET MVC中,经常会在Controller与View之间传递数据,因此,熟练.灵活的掌握这两层之间的数据传递方法就非常重要.本文从两个方面进行探讨: 一. Controller向Vie ...
- Activity之间的数据传递
最常用的Activity之间的数据传递. btnStartAty1.setOnClickListener(new View.OnClickListener() { @Override public v ...
- ASP.NET MVC 之控制器与视图之间的数据传递
今天,我们来谈谈控制器与视图之间的数据传递. 数据传递,指的是视图与控制器之间的交互,包括两个方向上的数据交互,一个是把控制器的数据传到视图中,在视图中如何显示数据,一个是把视图数据传递到控制器中, ...
- (转载)Javascript操作表单之间的数据传递
(转载)http://www.aspxhome.com/javascript/skills/200710/214825.htm 今天有朋友问我关于用JAVASCRIPT来进行页面各表单之间的数据传递的 ...
- iOS开发中视图控制器ViewControllers之间的数据传递
iOS开发中视图控制器ViewControllers之间的数据传递 这里我们用一个demo来说明ios是如何在视图控制器之间传递重要的参数的.本文先从手写UI来讨论,在下一篇文章中讨论在storybo ...
- React中父组件与子组件之间的数据传递和标准化的思考
React中父组件与子组件之间的数据传递的的实现大家都可以轻易做到,但对比很多人的实现方法,总是会有或多或少的差异.在一个团队中,这种实现的差异体现了每个人各自的理解的不同,但是反过来思考,一个团队用 ...
- Vue 爬坑之路(二)—— 组件之间的数据传递
Vue 的组件作用域都是孤立的,不允许在子组件的模板内直接引用父组件的数据.必须使用特定的方法才能实现组件之间的数据传递. 首先用 vue-cli 创建一个项目,其中 App.vue 是父组件,com ...
- Activity之间的数据传递-android学习之旅(四十七)
activity之间的数据传递主要有两种,一种是直接发送数据,另一种接受新启动的activity返回的数据,本质是一样的 使用Bundle传递数据 Intent使用Bundle在activity之间传 ...
- activity之间的数据传递方法
1 基于消息的通信机制 Intent--------boudle,extra 用这种简单的形式,一般而言传递一些简单的类型是比较容易的,如int.string等 详细介绍下Intent机制 Inte ...
随机推荐
- INSPIRED启示录 读书笔记 - 前言
好的产品具备三个基本条件 价值.可用性.可行性,三者缺一不可 产品经理日常工作 1.人员是指负责定义和开发产品的团队成员的角色和职责 2.流程是指探索.开发富有创意的产品时,反复应用的和成功的实践经验 ...
- [Android]开源中国源码分析之二---DrawerLayout
从启动界面到主界面之后的效果如图所示,采用的是v4包下的DrawerLayout, activity_main.xml文件如下: <!-- A DrawerLayout is intended ...
- SEM竞价数据基本分析方法
今天我们从账户数据表现来看一看怎样通过数据分析,判断账户出现的问题及解决思路.也欢迎大家提出意见,共同讨论进步. 首先我们从关键词报告来分析数据: 以上图数据为例.(设定该行业CPC均价为8) 先说下 ...
- 操作文件和目录【TLCL】
cp – Copy files and directories mv – Move/rename files and directories mkdir – Create directories rm ...
- HDU 3966 & POJ 3237 & HYSBZ 2243 & HRBUST 2064 树链剖分
树链剖分是一个很固定的套路 一般用来解决树上两点之间的路径更改与查询 思想是将一棵树分成不想交的几条链 并且由于dfs的顺序性 给每条链上的点或边标的号必定是连着的 那么每两个点之间的路径都可以拆成几 ...
- WinDBG__独立安装文件
debugging tools for windows 1. 来自于网页:http://rxwen.blogspot.hk/2010/04/standalone-windbg-v6120002633. ...
- HTML5 拖放---drag和drop
拖放四步走:第一步:设置元素可拖放,即把 draggable属性设置为 true: 例:<div id="div" draggable="true"&g ...
- 洛谷P1027 Car的旅行路线
洛谷P1027 Car的旅行路线 题目描述 又到暑假了,住在城市A的Car想和朋友一起去城市B旅游.她知道每个城市都有四个飞机场,分别位于一个矩形的四个顶点上,同一个城市中两个机场之间有一条笔直的高速 ...
- .parent()和.parents()的区别
parent的取值很明确,就是当前元素的父元素:parents则是当前元素的祖先元素.下面列出例子说明: 如下: <div id='div1'><div id='div2'>& ...
- 《Advanced Bash-scripting Guide》学习(十四):HERE Document和cat <<EOF
本文所选的例子来自于<Advanced Bash-scripting Gudie>一书,译者 杨春敏 黄毅 #here document cat <<EOF \z EOF ca ...