天天看點

informatica 資料庫之間的多表資料同步(全量/增量)以及variable的使用問題

兩個資料庫之間的多表資料同步(增量或全量)

中間有一張control table 表結構大概為 table_name varchar(200), load_flag int, 利用load_flag來控制需要同步的表 flag為1 則同步 flag為0 則不同步

實作方法為 用一個mapping 将flag為1 的表名過濾出來,在把這些表名 首位加上特殊字元 再一個個拼接起來 如 ~table1~table2~table3~ 然後指派給 $$v_flag ,mp中的變量可以定義長度,因為有很多表是以$$v_flag的長度一定要很長,建議1000以上。

wf中通過這個session将 $$v_flag傳到後面的session,進行判斷該表名是否在變量中instr($$v_flag,'~table_name~'),如果為真則說明這個表需要同步,否則就不執行session

session fact表需要按照時間戳進行增量抽取 用parameter file建立兩個時間戳變量$$StartDate,$$EndDate 在SQL Qurey中寫SQL進行過濾 select * from table where date between '$$StartDate' and '$$EndDate'

workflow

informatica 資料庫之間的多表資料同步(全量/增量)以及variable的使用問題

在實際運用的過程中發現:

當表的數量不多的時候,wf可以正常運作沒有問題 但是在将所有表進行同步之後,發現有好幾張表沒有資料,檢視log發現,$$V_flag并沒有把所有的表名放進去,然後去計算了一下$$v_flag的字元串長度,發現長度為600。但實際所有表名連起來的長度要不止600。 檢查了mp,裡面的變量長度都是足夠的,而wf中無法指定變量的長度,F1裡也沒有詳細的說明。

Google了一下發現的确也有很多人說 wf 的變量長度最大就是600,那我就對mp和wf做了改善

首先因為wf裡面的worklet是按照db來分的 是以我在control table中再加一列 table_db varchar(100), 用于記錄這張表是在哪一個庫裡面

然後第一個mp中按照table_db進行分類篩選 将同一個庫下的表名對應一個變量 是以有幾個庫,就有幾個$$v_flag

informatica 資料庫之間的多表資料同步(全量/增量)以及variable的使用問題

再傳入後面的session中,這樣wf裡也要和mp中的變量同步

informatica 資料庫之間的多表資料同步(全量/增量)以及variable的使用問題

把表名按照db來分割,傳入各自對應的worklet中進行判斷 這樣就有效避免了wf變量不夠長的問題