背景
最近在重構權限管理系統(PMS),因此在驗證新開發功能的行為是否和舊功能相同時,采用了一種思路,
控制相同的輸入,比對輸出是否盡可能一致。因為重構選用了微服務的架構,對於數據庫這邊拆分成了
多個庫。因此開發時需要將原先的PMS庫的數據遷移到異構的多個數據庫中。
遷移方案
遷移的基本思路是寫轉換sql語句,查出數據並導入目標庫的目標表
- 思路1
查出的數據導出到Excel,然后通過Excel導入到目的庫。這種做法想想都讓人絕望。
- 思路2
如果有個dblink也很棒啊。可是數據庫產品不同,是否存在強大而靈活的dblink功能尚待求證。
- 思路3
自己搞個程序來連接源數據庫和目標數據庫來轉移數據吧。這個比較靈活。應該是最為靈活也最為復雜的。
但這不是當前開發工作的主要任務。
- 思路4
對於遷移數據應該是常見的場景,定有現成可用的輪子,結果在一篇介紹多種數據遷移工具的文章里
發現了ali的DataX。稍加了解發現可以滿足需求,就果斷選用了。
DataX環境准備
下載 DataX並解壓
使用前需要安裝python2
瀏覽器里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哥