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

解決成功,然后,測試成功


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM