首先需要注意的是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
解決成功,然后,測試成功