抽取增量資料演算法說明

2021-05-23 20:31:27 字數 3917 閱讀 9088

以下例子以sql server資料庫系統為準。

為了實現對資料庫能夠實現增量匯出,要求被匯出的**建立時間戳、建立日期、修改日期、是否有效四個字段(其中,建立日期和修改日期要精確到毫秒)。

當**進行insert操作時,其中時間戳會自動更新,建立日期和修改日期初始化為當前伺服器時間,是否有效初始化為0。這時,建立日期和修改日期是相等的。當一筆記錄固化到資料庫中後,建立日期要保持不變。當執行update操作時,時間戳自動更新,建立日期保持不變,修改日期更新為當前伺服器日期,這時建立日期和修改日期是不相等的,且修改日期是大於建立日期。當執行delete操作時,時間戳自動更新,建立日期和修改日期不變,是否有效改變為1。

在每個**的記錄中,每條記錄可分為如下三種狀態:new(新增)、changed(改變)、deleted(刪除)。我們可通過建立日期、修改日期、是否有效這三個欄位的比較,來判斷一條記錄處於何種狀態。

資料匯出分為全量匯出和增量匯出,全量匯出是對一張表、多張表,甚至整個資料庫的拷貝;而增量匯出只針對後期新增、更新及刪除的資料的匯出。

接下來以例項來說明增量匯出的思路。

當利用資料交換系統進行導資料時,須先註冊外部系統資訊,每個外部系統分配乙個唯一的id,這個id被確定後,是不能被修改的。

在這裡假設已經註冊了乙個id為001的外部系統。

假設一張人員資訊表(userinfo),有id、姓名、時間戳、建立日期、修改日期、是否有效6個字段。

在2010-11-10天,人員資訊表新增了四條記錄,記錄具體如下: id

姓名時間戳

建立日期

修改日期

是否有效 1

張三 1

2010-11-10 09:00:00.120

2010-11-10 09:00:00.120 0

2 李四

22010-11-10 10:21:23.100

2010-11-10 10:21:23.100 0

3 趙五

32010-11-10 11:00:00.420

2010-11-10 11:00:00.420 0

4 王六

42010-11-10 11:09:07.190

2010-11-10 11:09:07.190 0

在2010-11-12這天的9:13:00.001這個時間點進行了第一次資料匯出,匯出後儲存系統操作日誌資訊,資訊如下:

外部系統id

**名稱

時間戳操作日期

001userinfo 4

2010-11-12 09:13:00.001

其中,時間戳獲取的是人員資訊表最大的時間戳。

在2010-11-13修改了id=2的記錄,並新增了一筆記錄,記錄具體如下: id

姓名時間戳

建立日期

修改日期

是否有效 1

張三 1

2010-11-10 09:00:00.120

2010-11-10 09:00:00.120 0

2 李四

52010-11-10 10:21:23.100

2010-11-13 13:38:33.540 0

3 趙五

32010-11-10 11:00:00.420

2010-11-10 11:00:00.420 0

4 王六

42010-11-10 11:09:07.190

2010-11-10 11:09:07.190 0

5 方七

62010-11-13 15:38:33.540

2010-11-13 15:38:33.540 0

6 張飛

72010-11-13 15:40:33.540

2010-11-14 08:0033.540 0

我們現在來分析下這張**,以2010-11-12這天的9:13:00.001這個時間點作為分水嶺, id

姓名時間戳

建立日期

修改日期

是否有效 1

張三 1

2010-11-10 09:00:00.120

2010-11-10 09:00:00.120 0

3 趙五

32010-11-10 11:00:00.420

2010-11-10 11:00:00.420 0

4 王六

42010-11-10 11:09:07.190

2010-11-10 11:09:07.190 0

這三條記錄是匯出前新增,匯出後沒有被修改。

id 姓名

時間戳

建立日期

修改日期

是否有效 2

李四 5

2010-11-10 10:21:23.100

2010-11-13 13:38:33.540 0

這條記錄是匯出前新增,匯出後被修改。

id 姓名

時間戳

建立日期

修改日期

是否有效 5

方七 6

2010-11-13 15:38:33.540

2010-11-13 15:38:33.540 0

這條記錄是匯出後被新增,在下次匯出前沒有被修改。

id 姓名

時間戳

建立日期

修改日期

是否有效 6

張飛 7

2010-11-13 15:40:33.540

2010-11-14 08:0033.540 0

這條記錄是匯出後被新增,在下次匯出前被修改。

2010-11-15這天的9:10:30.221這個時間點進行了第二次資料匯出,要實現的是增量匯出。我們通過**比較,下列幾條記錄這次匯出的物件,記錄具體如下: id

姓名時間戳

建立日期

修改日期

是否有效 2

李四 5

2010-11-10 10:21:23.100

2010-11-13 13:38:33.540 0

5 方七

62010-11-13 15:38:33.540

2010-11-13 15:38:33.540 0

6 張飛

72010-11-13 15:40:33.540

2010-11-14 08:0033.540 0

這三條記錄中,id=2的記錄是changed(改變)狀態,其它兩條處於new(新增)狀態。雖然這三條記錄都是這次匯出的物件,但要加以區分,這樣這三條記錄要匯入其它系統時,才可以區分開是新增,還是修改操作。

那麼如何區分開這三條記錄呢?

我們查詢出最近一次匯出日誌,最近一次匯出日誌具體資訊如下:

外部系統id

**名稱

時間戳操作日期

001userinfo 4

2010-11-12 09:13:00.001

其中,時間戳為4,操作日期為2010-11-12 09:13:00.001,我們分別取出,並設定變數。

我們設定如下變數,timestamp=4,opedate=」 2010-11-12 09:13:00.001」,credate(2)=」 2010-11-10 10:21:23.100」,updatedate(2)=」 2010-11-13 13:38:33.540」,iseffect(2)=」0」(其中,credate(2)代表id=2的使用者資訊,以此類推;updatedate(2)、iseffect(2)等同)。

timestamp變數的作用是通過比較獲取增量資料;opedate、credate(i)(i>0的整數)、updatedate(i) (i>0的整數)這三個變數通過比較,判斷該記錄所狀態(new(新增)、changed(改變));iseffect(i) 判斷該記錄是否處於deleted(刪除)狀態。

如果iseffect(i)=」0」,且updatedate(i)>credate(i),且credate(i)>opedate,就是新增狀態;否則修改狀態。如果iseffect(i)=」1」說明是刪除狀態。

增量資料抽取

a.觸發器 在要抽取的表上建立需要的觸發器,一般要建立插入 修改 刪除三個觸發器,每當源表中的資料發生變化,就被相應的觸發器將變化的資料寫入乙個臨時表,抽取執行緒從臨時表中抽取資料,臨時表中抽取過的資料被標記或刪除。觸發器方式的優點是資料抽取的效能較高,缺點是要求業務表建立觸發器,對業務系統有一定的...

Kettle資料抽取 增量抽取

使用 kettle 實現資料的增量抽取的方法大致如下 從目標表中讀取最大的時間戳或者增量字段 id,作為條件,然後把源表中所有大於這個增量欄位的資料讀出來,插入到目標表當中去 1.開啟 kettle 工具,開啟新建的全量抽取流 2.選擇 input,再拖出來乙個 表輸入 控制項 開啟表輸入 2,配置...

sqlserver cdc實現資料增量抽取

建立測試庫 create database test 建立配置表 create table test.time config tb varchar 20 primary key,enddate binary 10 建立業務表 create table test.tb s id int primary...