DataX簡單使用


背景

最近在重構權限管理系統(PMS),因此在驗證新開發功能的行為是否和舊功能相同時,采用了一種思路,
控制相同的輸入,比對輸出是否盡可能一致。因為重構選用了微服務的架構,對於數據庫這邊拆分成了
多個庫。因此開發時需要將原先的PMS庫的數據遷移到異構的多個數據庫中。

遷移方案

遷移的基本思路是寫轉換sql語句,查出數據並導入目標庫的目標表

  • 思路1

查出的數據導出到Excel,然后通過Excel導入到目的庫。這種做法想想都讓人絕望。

  • 思路2

如果有個dblink也很棒啊。可是數據庫產品不同,是否存在強大而靈活的dblink功能尚待求證。

  • 思路3

自己搞個程序來連接源數據庫和目標數據庫來轉移數據吧。這個比較靈活。應該是最為靈活也最為復雜的。
但這不是當前開發工作的主要任務。

  • 思路4

對於遷移數據應該是常見的場景,定有現成可用的輪子,結果在一篇介紹多種數據遷移工具的文章里
發現了ali的DataX。稍加了解發現可以滿足需求,就果斷選用了。

DataX環境准備

下載 DataX並解壓

使用前需要安裝python2

Windows安裝python2.6.6

瀏覽器里CTRL+F搜索2.6.6。我是64位機,選擇Download Windows x86-64 MSI installer
安裝過程就不再贅述。
最后將安裝目錄(python.exe的上級目錄)添加到系統環境變量中
(比如C:\Python26)。
注意如果本機事先安裝了python3,需要將剛安裝好的python2的python.exe修改為python2.exe。
這樣待會在使用DataX時可以用python2命令運行

DataX使用

小試一下

cmd先輸入CHCP 65001,解決亂碼

# 先簡單了解下如下命令,D:\soft\datax\datax\為DataX解壓后的目錄,運行如下命令需替換為你的解壓目錄
# 自檢
python2 D:\soft\datax\datax\bin\datax.py D:\soft\datax\datax\job\job.json
# 輸入命令查看配置模板
python2 D:\soft\datax\datax\bin\datax.py -r streamreader -w streamwriter

直接上手

DataX的遷移思路和我們遷移數據的思路差別不大,無非是從源讀取數據,再將數據寫到目標中。只不過
它的實現更為精妙。具體可參考官方介紹

為使用DataX。我們只需要提供一個json配置文件即可。如下為我從oracle遷移bar表數據到postgres bar表的一個
遷移job示例腳本xx.json。

{
  "job": {
    "setting": {
      "speed": {
        "channel": 1
      }
    },
    "content": [
      {
        "reader": {
          "name": "oraclereader",
          "parameter": {
            "username": "foo",
            "password": "bar",
            "where": "",
            "connection": [
              {
                "querySql": [
                  "SELECT fooxx as foo from bar"
                ],
                "jdbcUrl": [
                  "jdbc:oracle:thin:@localhost:1521:orcl"
                ]
              }
            ]
          }
        },
        "writer": {
          "name": "postgresqlwriter",
          "parameter": {
            "username": "foo",
            "password": "bar",
            "column": [
              "foo"
            ],
            "preSql": [
              "delete from bar"
            ],
            "postSql": [
              "update bar set foo = ''"
            ],
            "connection": [
              {
                "jdbcUrl": "jdbc:postgresql://localhost:5432/postgres?characterEncoding=utf8",
                "table": [
                  "bar"
                ]
              }
            ]
          }
        }
      }
    ]
  }
}

開始遷移

#cmd進入遷移job配置文件xx.json所在的目錄,執行如下命令
python2 D:\soft\datax\datax\bin\datax.py xx.json
#結果如下圖

結果

結果中需要關注的是讀出記錄總數和讀寫失敗總數。
如果有讀寫失敗,需要解決錯誤並判斷是否要重新遷移。
如果要重新遷移,那之前已遷移的臟數據可以在preSql里做刪除處理(生產環境中慎用)。
此外有些不能一下子遷移到目標表的情況,我們也可以在目標庫中建一些輔助表。然后在postSql中作處理(比如將輔助表的某個欄位更新到目標表)

批量執行腳本

當job.json文件較多時,用dataX一個個指定json文件並運行,比較麻煩。因此寫了一個
簡單的python2腳本run.py來批量執行,腳本並不算健壯,這邊作為一個示例。

# This Python file uses the following encoding: utf-8
import os

s = os.getcwd()

for f in os.listdir(s):
    if f.endswith('.json'):
        # os.system('python2 D:\\soft\\datax\\datax\\bin\\datax.py  ' + f)
        print('運行' + f)
        result = os.popen('python2 D:\\soft\\datax\\datax\\bin\\datax.py  ' + f)
        res = result.read()
        read = 0
        fail = 0
        for line in res.splitlines():
            if "讀出記錄總數" in line:
                print(line)
                read = int(line.split(':')[1])
            if "讀寫失敗總數" in line:
                print(line)
                fail = int(line.split(':')[1])
        print(fail)
        print(read)
        if (fail > 0) or (read == 0):
            print('pay attention')

進入job.json所在的目錄,執行python2 run.py即可批量運行。運行結束需要關注下失敗的情況。

PS: 我的個人博客 qiang哥


免責聲明!

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



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