? ? ? ?考慮一個(gè)問題:需要抽取哪部分?jǐn)?shù)據(jù)加載到數(shù)據(jù)倉庫?是完全抽取還是變化數(shù)據(jù)捕獲?
? ? ? ?如果數(shù)據(jù)量很小,則采取完全源數(shù)據(jù)抽??;如果源數(shù)據(jù)量很大,則抽取變化的源數(shù)據(jù),這種數(shù)據(jù)抽取模式叫做變化數(shù)據(jù)捕獲,簡(jiǎn)稱CDC。
? ? ? ?CDC大體分為兩種:侵入式和非侵入式。侵入式指CDC操作會(huì)給源系統(tǒng)帶來性能影響,只要CDC操作以任何一種方式對(duì)源數(shù)據(jù)庫執(zhí)行了SQL操作,就認(rèn)為是侵入式的。
? ? ? ?常用的4種CDC方法是:基于時(shí)間戳的CDC、基于觸發(fā)器的CDC、基于快照的CDC和基于日志的CDC,其中前三種是侵入式的。
1.基于時(shí)間戳的CDC
? ? ? ?抽取過程可以根據(jù)某些屬性列來判斷哪些數(shù)據(jù)是增量的,最常見的屬性列有以下兩種:
1.時(shí)間戳:最好有兩個(gè)列,一個(gè)插入時(shí)間戳,表示何時(shí)創(chuàng)建,一個(gè)更新時(shí)間戳,表示最后一次更新的時(shí)間。
2.序列:大多數(shù)數(shù)據(jù)庫都提供自增功能,如果數(shù)據(jù)庫表列被定義成自增的,就可以很容易地根據(jù)該列識(shí)別新插入的數(shù)據(jù)。
? ? ? ?這種方法是最簡(jiǎn)單且常用的,但是有如下缺點(diǎn):
1.不能記錄刪除記錄的操作
2.無法識(shí)別多次更新
3.不具有實(shí)時(shí)能力
2.基于觸發(fā)器的CDC
? ? ? ?當(dāng)執(zhí)行INSERT、UPDATE、DELETE這些SQL語句時(shí),可以激活數(shù)據(jù)庫里的觸發(fā)器,并執(zhí)行一些動(dòng)作,就是說觸發(fā)器可以用來捕獲變更的數(shù)據(jù)并把數(shù)據(jù)保存在中間臨時(shí)表里。然后這些變更數(shù)據(jù)再從臨時(shí)表取出,抽取到數(shù)據(jù)倉庫的過渡區(qū)中。大多數(shù)場(chǎng)合下,不允許向操作型數(shù)據(jù)庫里添加觸發(fā)器,且這種方法會(huì)降低系統(tǒng)性能,所以用的不多。
? ? ? ?可以使用源數(shù)據(jù)庫的復(fù)制功能,將源庫的數(shù)據(jù)備用到備用庫上,在備庫上創(chuàng)建觸發(fā)器。
3.基于快照的CDC
? ? ? ?如果沒有時(shí)間戳,不允許使用觸發(fā)器,就要使用快照表??梢酝ㄟ^比較源表和快照表來獲得數(shù)據(jù)變化。
? ? ? ?基于快照的CDC可以檢測(cè)到插入、更新和刪除的數(shù)據(jù),這是相對(duì)于基于時(shí)間戳的CDC方案的有點(diǎn)。其缺點(diǎn)是需要大量存儲(chǔ)空間來保存快照。
4.基于日志的CDC
? ? ? ?最復(fù)雜的和沒有侵入性的CDC方法是基于日志的方式。數(shù)據(jù)庫會(huì)把每個(gè)插入、更新、刪除操作記錄到日志里。