1. 程式人生 > >基於DataX將資料從Sqlserver同步到Oracle

基於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