同步數據常見的應用場景包括以下4個種類型:
Ø 只增加、無更新、無刪除
Ø 只更新、無增加、無刪除
Ø 增加+更新、無刪除
Ø 增加+更新+刪除
只增加、無更新、無刪除
對於這種只增加數據的情況,可細分爲以下2種類型:
1) 基表存在更新字段。
通過獲取目標表上最大的更新時間或最大ID,在“表輸入”步驟中加入條件限制只讀取新增的數據。
這裏要注意的是,獲取最大更新時間或最大ID時,如果目標表還沒有數據,最大值會獲取不了。其中的一個解決方法是在“獲取最大ID”步驟的SQL中,加入最小日期或ID的聯合查詢即可,如:
SELECT MAX(ID) FROM
(SELECT MAX(ID) AS ID FROM T1 UNION ALL SELECT 0 AS ID FROM DUAL)
2) 基表不存在更新字段。
通過“插入/更新”步驟進行插入。
插入/更新步驟選項:
只更新、無增加、無刪除
通過“更新”步驟進行更新。
更新選項:
只更新、無增加、無刪除
通過“更新”步驟進行更新。
更新選項:
增加+更新+刪除
這種數據同步情況,可細分爲以下2種情況:
1) 源庫有表保存刪除、更新和新增的信息。
通過條件判斷,分別進行“插入/更新”和“刪除”即可,如下圖所示。
2) 源庫沒有保存增刪改信息
Kettle提供了一種對比增量更新的機制處理這種情況,可通過“合併記錄”步驟實現,該步驟的輸入是新舊兩個數據源,通過關鍵字進行數據值比對,對比結果分爲以下4種類型:
“Identical” : 關鍵字在新舊數據源中都存在,域值相同
“changed” : 關鍵字在新舊數據源中都存在,但域值不同
“new” : 舊數據源中沒有找到關鍵字
“deleted”: 新數據源中沒有找到關鍵字
兩個數據源的數據都進入下一步驟,上述4種結果類型作爲輸出表的標誌字段進行保存。
以下爲示例:
Ø 源數據庫測試腳本
create table k1 (f1 varchar2(200),f2varchar2(200))
truncate table k1;
insert into k1(f1,f2) values('1','11');
insert into k1(f1,f2) values('2','22');
insert into k1(f1,f2) values('5','5');
commit;
Ø 目標數據庫測試腳本
create table k1 (f1 varchar2(200),f2varchar2(200))
truncate table k1;
insert into k1(f1,f2) values('1','1');
insert into k1(f1,f2) values('2','2');
insert into k1(f1,f2) values('3','3');
insert into k1(f1,f2) values('4','4');
commit;
合併過程如下:
其中“合併記錄”步驟的選項:
執行後,查詢K1_TEST結果如下:
可以看到,該結果表的BZ字段保存了更新、刪除、新增的記錄信息,通過條件分支即可分別對這些記錄進行相應的處理。
“條件”選項:
Kettle提供了可視化的設計工具,基本上可通過拖拉配置的方式實現以上4種類型的數據同步,操作上相對較爲簡單。
數據同步的性能與源數據庫、目標數據庫以及執行Kettle轉換操作的主機相關,在筆者的測試環境上(源數據庫和目標數據庫部署在雙核CPU/4G內存的PC機上、執行Kettle轉換操作的主機配置爲雙核CPUx2/4G內存,JVM內存堆棧爲256M)、最後一種類型的數據同步,15w的數據,在3分鐘內可以完成。