DataX是阿里雲推出的一款開源的ETL工具,通過配置json文件實現不同數據庫之間的數據同步。先有需求是從Sqlserver同步數據到Oracle,網上關於DataX的介紹很多。
框架設計
DataX本身作為離線數據同步框架,采用Framework + plugin架構構建。將數據源讀取和寫入抽象成為Reader/Writer插件,納入到整個同步框架中。
Reader:Reader為數據采集模塊,負責采集數據源的數據,將數據發送給Framework。
Writer: Writer為數據寫入模塊,負責不斷向Framework取數據,並將數據寫入到目的端。
Framework:Framework用於連接reader和writer,作為兩者的數據傳輸通道,並處理緩沖,流控,並發,數據轉換等核心技術問題。
實踐
1.環境
datax不需要安裝,直接解壓縮可用,但要先部署JDK環境和python環境。這里只說配置python環境時遇到的問題,python使用的是2.7.版本,python也是免安裝版,直接配好環境變量即可。在配置python環境時,遇到“無法啟動此程序 因為計算機中丟失python27.dll"報錯,下載python27.dll,將其扔到System32和SysWOW64中可解決問題。
2.Sqlserver同步數據到Oracle
{
"job": {
"content": [
{
"reader": {
"name": "sqlserverreader",
"parameter": {
"column":["id",
"accid",
"accno",
"ismainacc",
"parentid",
"bindname",
"opentime",
"endtime",
"matuday",
"recordtime",
"isquery",
"remark",
"lastupdateuser",
"lastupdatetime"
],
"connection": [
{
"jdbcUrl": ["jdbc:sqlserver://{ip}:{端口號};DatabaseName=ReportServer$SQLEXPRESS"],//sqlserver數據庫連接,注意端口號和數據庫名
"table":["b2edb.dbo.BOE_ACCOUNT"]//sqlserver的表名
}
],
"password": "123456789",
"username": "sa",//登陸Sqlserver數據庫的賬號密碼
}
},
"writer": {
"name": "oraclewriter",
"parameter": {
"username":"BOCZBT",
"password":"BOCZBT",//Oracle數據庫的登陸名和密碼
"column": ["id",
"accid",
"accno",
"ismainacc",
"parentid",
"bindname",
"opentime",
"endtime",
"matuday",
"recordtime",
"isquery",
"remark",
"lastupdateuser",
"lastupdatetime"
],
"connection": [
{
"jdbcUrl": "jdbc:oracle:thin:@{ip}:{端口號}:imsdev",//oracle數據庫的連接串
"table": ["BOE_ACCOUNT"]//Oracle表
}
]
}
}
}
],
"setting": {
"speed": {
"channel": "1"
}
}
}
}
在實際操作中遇到了一些問題,記錄如下:
1).執行是在Dos窗口中進入Datax的bin目錄下執行,一般我們通過cmd命令默認在C盤下,更改盤符,進入datax的bin目錄。
2).開始執行時,沒有報錯,沒有日志,也沒有同步成功,檢查執行文件名是否有空格,保存的json文件有空格造成了執行沒成功。
3).文件名稱沒有問題后,日志報錯信息為Datax無法連接對應的數據庫,並提示是Sqlserver連接有誤,查看Sqlserver的連接IP,端口號,數據庫名等是否正確。Sqlserver是傻瓜式安裝,查看端口號為動態端口號,修改了端口號為1344,具體修改方法是:打開Sqlserver配置管理器-----SQL Server網絡配置----SQLEXPRESS的協議(我的數據庫實例是SQLEXPRESS)----TCP/IP,將狀態改為已啟用,右鍵屬性,修改IPALLA的TCP端口為1433,應用,重啟數據庫服務。可利用存儲過程exec sys.sp_readerrorlog 0,1,'listening'查看端口號。
4).開始在writer中寫了”writeMode“:"insert",結果報”寫入模式(writeMode)配置錯誤。因為Oracle不支持配置項writeMode:insert,Oracle只能使用insert sql插入數據,請檢查您的配置並做出修改“。將”writeMode“:"insert"刪掉。
5).sqlserver和oracle連接串的格式都有固定的樣式,而且有的需要有[ ],可以通過向streamwriter寫入打印的方式查看是否連接成功。
{
"job": {
"content": [
{
"reader": {
"name": "oraclereader",
"parameter": {
"column":["id",
"accid",
"accno",
"ismainacc",
"parentid",
"bindname",
"opentime",
"endtime",
"matuday",
"recordtime",
"isquery",
"remark",
"lastupdateuser",
"lastupdatetime"
],
"connection": [
{
"jdbcUrl": ["jdbc:oracle:thin:@{ip}:{端口號}:imsdev"],//oracle服務器IP&端口號
"table":["BOE_ACCOUNT"]
}
],
"password": "BOCZBT",
"username": "BOCZBT",
}
},
"writer": {
"name": "streamwriter",
"parameter": {
"encoding":"UTF-8",
"print":true
}
}
}
],
"setting": {
"speed": {
"channel": "5"
}
}
}
}
關於datax的介紹參考
https://blog.csdn.net/u011410529/article/details/74352549