基於DataX將資料從Sqlserver同步到Oracle
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://22.48.41.26:1433;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:@22.48.1.83:1521: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:@22.48.1.83:1521:imsdev"],
"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