十年網(wǎng)站開發(fā)經(jīng)驗(yàn) + 多家企業(yè)客戶 + 靠譜的建站團(tuán)隊(duì)
量身定制 + 運(yùn)營維護(hù)+專業(yè)推廣+無憂售后,網(wǎng)站問題一站解決
數(shù)據(jù)庫增量抽取數(shù)據(jù)。
創(chuàng)新互聯(lián)是專業(yè)的丹東網(wǎng)站建設(shè)公司,丹東接單;提供網(wǎng)站設(shè)計(jì)、成都做網(wǎng)站,網(wǎng)頁設(shè)計(jì),網(wǎng)站設(shè)計(jì),建網(wǎng)站,PHP網(wǎng)站建設(shè)等專業(yè)做網(wǎng)站服務(wù);采用PHP框架,可快速的進(jìn)行丹東網(wǎng)站開發(fā)網(wǎng)頁制作和功能擴(kuò)展;專業(yè)做搜索引擎喜愛的網(wǎng)站,專業(yè)的做網(wǎng)站團(tuán)隊(duì),希望更多企業(yè)前來合作!
比如A表第一次抽有三條數(shù)據(jù):1,2,3
第二次抽的時(shí)候A表里面有:1,2,3,4了。這個(gè)時(shí)候你B表里面還是1,2,3.
你要單獨(dú)把4抽取過來,
可以直接
insert
into
B
select
*
from
A
where
A.ID
not
in
(select
B.ID
from
B)
源表和目標(biāo)表 直接哈希分區(qū) 64個(gè)
目標(biāo)表在關(guān)聯(lián)字段建本地分區(qū)索引 ,分區(qū)鍵和索引鍵一樣
目標(biāo)表的分區(qū)最好分到多個(gè)表空間上
寫個(gè)存儲過程按分區(qū)掃源表,操作目標(biāo)表(更新或插入)
開多個(gè)session調(diào)存儲過程傳分區(qū)為參數(shù)
增量抽取用kettle的話建議使用時(shí)間戳或最大主鍵進(jìn)行區(qū)分增量數(shù)據(jù)
Oracle上沒有自增字段,可以使用索引和觸發(fā)器來達(dá)到此目的
第一步:創(chuàng)建SEQUENCE
create sequence s_country_id increment by 1 start with 1 maxvalue 999999999;
第二步:創(chuàng)建一個(gè)基于該表的before insert 觸發(fā)器,在觸發(fā)器中使用該SEQUENCE
create or replace trigger bef_ins_t_country_define
before insert on t_country_define
referencing old as old new as new for each row
begin
new.country_id=s_country_id.nextval;
end;
ETL中的數(shù)據(jù)增量抽取機(jī)制
(
增量抽取是數(shù)據(jù)倉庫ETL(extraction,transformation,loading,數(shù)據(jù)的抽取、轉(zhuǎn)換和裝載)實(shí)施過程中需要重點(diǎn)考慮的問 題。在ETL過程中,增量更新的效率和可行性是決定ETL實(shí)施成敗的關(guān)鍵問題之一,ETL中的增量更新機(jī)制比較復(fù)雜,采用何種機(jī)制往往取決于源數(shù)據(jù)系統(tǒng)的 類型以及對增量更新性能的要求。
1 ETL概述
ETL包括數(shù)據(jù)的抽取、轉(zhuǎn)換、加載。①數(shù)據(jù)抽?。簭脑磾?shù)據(jù)源系統(tǒng)抽取目的數(shù)據(jù)源系統(tǒng)需要的數(shù)據(jù):②數(shù)據(jù)轉(zhuǎn)換:將從源數(shù)據(jù)源獲取的數(shù)據(jù)按照業(yè)務(wù)需求,轉(zhuǎn)換成目的數(shù)據(jù)源要求的形式,并對錯(cuò)誤、不一致的數(shù)據(jù)進(jìn)行清洗和加工;③數(shù)據(jù)加載:將轉(zhuǎn)換后的數(shù)據(jù)裝載到目的數(shù)據(jù)源。
ETL作為構(gòu)建數(shù)據(jù)倉庫的一個(gè)環(huán)節(jié),負(fù)責(zé)將分布的、異構(gòu)數(shù)據(jù)源中的數(shù)據(jù)如關(guān)系數(shù)據(jù)、平面數(shù)據(jù)文件等抽取到臨時(shí)中間層后進(jìn)行清洗、轉(zhuǎn)換、集成,最后加載到數(shù) 據(jù)倉庫或數(shù)據(jù)集市中,成為聯(lián)機(jī)分析處理、數(shù)據(jù)挖掘的基礎(chǔ)。ETL原來主要用戶構(gòu)建數(shù)據(jù)倉庫和商業(yè)智能項(xiàng)目,現(xiàn)在也越來越多地應(yīng)用于一般信息系統(tǒng)數(shù)據(jù)的遷 移、交換和同步。
在ETL的3個(gè)環(huán)節(jié)中,數(shù)據(jù)抽取直接面對各種分散、異構(gòu)的數(shù)據(jù)源,如何保證穩(wěn)定高效的從這些數(shù)據(jù)源中提取正確的數(shù)據(jù),是ETL設(shè)計(jì)和實(shí)施過程中需要考慮的關(guān)鍵問題之一。
在集成端進(jìn)行數(shù)據(jù)的初始化時(shí),一般需要將數(shù)據(jù)源端的全部數(shù)據(jù)裝載進(jìn)來,這時(shí)需要進(jìn)行全量抽取。全量抽取類似于數(shù)據(jù)遷移或數(shù)據(jù)復(fù)制,它將數(shù)據(jù)源中的表或視圖 的數(shù)據(jù)全部從數(shù)據(jù)庫中抽取出來,再進(jìn)行后續(xù)的轉(zhuǎn)換和加載操作。全量抽取可以使用數(shù)據(jù)復(fù)制、導(dǎo)入或者備份的方式完成,實(shí)現(xiàn)機(jī)制比較簡單。全量抽取完成后,后 續(xù)的抽取操作只需抽取自上次抽取以來表中新增或修改的數(shù)據(jù),這就是增量抽取。
在數(shù)據(jù)庫倉庫中,無論是全量抽取還是增量抽取,抽取工作一般由數(shù)據(jù)倉庫工具來完成,如oracle的OWB,Sql Server的Integration Services以及專業(yè)的ETL商業(yè)產(chǎn)品Informatica PowvrCenter等。如果企業(yè)的預(yù)算有限,也可以考慮使用開源項(xiàng)目Pentaho。這些工具都有一個(gè)特點(diǎn),就是本身并沒有實(shí)現(xiàn)特定的增量抽取機(jī)制, 它們完成全量抽取后,用戶可以通過定制計(jì)劃任務(wù)的方式,實(shí)現(xiàn)按一定的周期從源系統(tǒng)中抽取當(dāng)前周期內(nèi)產(chǎn)生的增量數(shù)據(jù),但至于這些增量數(shù)據(jù)如何產(chǎn)生,工具并沒 有提供自動生成增量數(shù)據(jù)的功能。所以,ETL過程中增量數(shù)據(jù)的產(chǎn)生機(jī)制是一個(gè)需要用戶重點(diǎn)研究和選擇的問題。
2 增量抽取機(jī)制
要實(shí)現(xiàn)增量抽取,關(guān)鍵是如何準(zhǔn)確快速的捕獲變化的數(shù)據(jù)。優(yōu)秀的增量抽取機(jī)制要求ETL能夠?qū)I(yè)務(wù)系統(tǒng)中的變化數(shù)據(jù)按一定的頻率準(zhǔn)確地捕獲到,同時(shí)不能對業(yè) 務(wù)系統(tǒng)造成太大的壓力,影響現(xiàn)有業(yè)務(wù)。相對全量抽取而言,增量抽取的設(shè)計(jì)更復(fù)雜,有一種將全量抽取過程自動轉(zhuǎn)換為增量抽取過程的ETL設(shè)計(jì)思路,前提是必 須捕獲變化的數(shù)據(jù),增量數(shù)據(jù)抽取中常用的捕獲變化數(shù)據(jù)的方法有以下幾種:
2.1 觸發(fā)器方式
觸發(fā)器方式是普遍采取的一種增量抽取機(jī)制。該方式是根據(jù)抽取要求,在要被抽取的源表上建立插入、修改、刪除3個(gè)觸發(fā)器,每當(dāng)源表中的數(shù)據(jù)發(fā)生變化,就被相 應(yīng)的觸發(fā)器將變化的數(shù)據(jù)寫入一個(gè)增量日志表,ETL的增量抽取則是從增量日志表中而不是直接在源表中抽取數(shù)據(jù),同時(shí)增量日志表中抽取過的數(shù)據(jù)要及時(shí)被標(biāo)記 或刪除。
為了簡單起見,增量日志表一般不存儲增量數(shù)據(jù)的所有字段信息,而只是存儲源表名稱、更新的關(guān)鍵字值和更新操作類型(insert、update或 delete),ETL增量抽取進(jìn)程首先根據(jù)源表名稱和更新的關(guān)鍵字值,從源表中提取對應(yīng)的完整記錄,再根據(jù)更新操作類型,對目標(biāo)表進(jìn)行相應(yīng)的處理。
例如,對于源表為Oracle類型的數(shù)據(jù)庫,采用觸發(fā)器方式進(jìn)行增量數(shù)據(jù)捕獲的過程如下:
(1)創(chuàng)建增量日志表DML LOG:
create table DML_LOG(
ID NUMBER primary key,--自增主鍵
TABLE_NAME VARCHAR2(200),--源表名稱
RECORD_ID NUMBER,--源表增量記錄的主鍵值
DML_TYPE CHAR(1),--增量類型,I表示新增;U表示更新;D表示刪除
EXECUTE DATE DATE --發(fā)生時(shí)間
);
(2)為DML_LOG創(chuàng)建一個(gè)序列SEQ_DML_LOG,以便觸發(fā)器寫增量日志表時(shí)生成ID值。
(3)針對要監(jiān)聽的每一張表,創(chuàng)建一個(gè)觸發(fā)器,例如對表Test創(chuàng)建觸發(fā)器如下:
Create or replace trigger T BEFORE INSERT OR UPDATE OR DELETE ON T for each row
declare I_dml_type varchar2(1);
begin
if INSERTING then l_dml type:=’I’;
elsif UPDATING then I_dml_type:=’U’;
elsif DELETING then l_dml_type:=’D’;
end if;
if DELETING then
insert into DML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)
values(seq_dml_log.nextval,’Test’,:old.ID,sysdate,l_dml_type);
else
insert into DML_LOG(ID,TABLE_NAME,RECORD_ID,EXECUTE_DATE,DML_TYPE)
values(seq_dml_log.nextval,’Test’,:new.ID,sysdate,l_dml_type);
end if;
end;
這樣,對表T的所有DML操作就記錄在增量日志表DML_LOG中,注意增量日志表中并沒有完全記錄增量數(shù)據(jù)本身,只是記錄了增量數(shù)據(jù)的來源。進(jìn)行增量ETL時(shí),只需要根據(jù)增量日志表中的記錄情況,反查源表得到真正的增量數(shù)據(jù)。
2.2 時(shí)間戳方式
時(shí)間戳方式是指增量抽取時(shí),抽取進(jìn)程通過比較系統(tǒng)時(shí)間與抽取源表的時(shí)間戳字段的值來決定抽取哪些數(shù)據(jù)。這種方式需要在源表上增加一個(gè)時(shí)間戳字段,系統(tǒng)中更新修改表數(shù)據(jù)的時(shí)候,同時(shí)修改時(shí)間戳字段的值。
有的數(shù)據(jù)庫(例如Sql Server)的時(shí)間戳支持自動更新,即表的其它字段的數(shù)據(jù)發(fā)生改變時(shí),時(shí)間戳字段的值會被自動更新為記錄改變的時(shí)刻。在這種情況下,進(jìn)行ETL實(shí)施時(shí)就 只需要在源表加上時(shí)間戳字段就可以了。對于不支持時(shí)間戳自動更新的數(shù)據(jù)庫,這就要求業(yè)務(wù)系統(tǒng)在更新業(yè)務(wù)數(shù)據(jù)時(shí),通過編程的方式手工更新時(shí)間戳字段。
使用時(shí)間戳方式可以正常捕獲源表的插入和更新操作,但對于刪除操作則無能為力,需要結(jié)合其它機(jī)制才能完成。
2.3 全表刪除插入方式
全表刪除插入方式是指每次抽取前先刪除目標(biāo)表數(shù)據(jù),抽取時(shí)全新加載數(shù)據(jù)。該方式實(shí)際上將增量抽取等同于全量抽取。對于數(shù)據(jù)量不大,全量抽取的時(shí)間代價(jià)小于執(zhí)行增量抽取的算法和條件代價(jià)時(shí),可以采用該方式。
2.4 全表比對方式
全表比對即在增量抽取時(shí),ETL進(jìn)程逐條比較源表和目標(biāo)表的記錄,將新增和修改的記錄讀取出來。
優(yōu)化之后的全部比對方式是采用MD5校驗(yàn)碼,需要事先為要抽取的表建立一個(gè)結(jié)構(gòu)類似的MD5臨時(shí)表,該臨時(shí)表記錄源表的主鍵值以及根據(jù)源表所有字段的數(shù)據(jù) 計(jì)算出來的MD5校驗(yàn)碼,每次進(jìn)行數(shù)據(jù)抽取時(shí),對源表和MD5臨時(shí)表進(jìn)行MD5校驗(yàn)碼的比對,如有不同,進(jìn)行update操作:如目標(biāo)表沒有存在該主鍵 值,表示該記錄還沒有,則進(jìn)行insert操作。然后,還需要對在源表中已不存在而目標(biāo)表仍保留的主鍵值,執(zhí)行delete操作。
2.5 日志表方式
對于建立了業(yè)務(wù)系統(tǒng)的生產(chǎn)數(shù)據(jù)庫,可以在數(shù)據(jù)庫中創(chuàng)建業(yè)務(wù)日志表,當(dāng)特定需要監(jiān)控的業(yè)務(wù)數(shù)據(jù)發(fā)生變化時(shí),由相應(yīng)的業(yè)務(wù)系統(tǒng)程序模塊來更新維護(hù)日志表內(nèi)容。增量抽取時(shí),通過讀日志表數(shù)據(jù)決定加載哪些數(shù)據(jù)及如何加載。日志表的維護(hù)需要由業(yè)務(wù)系統(tǒng)程序用代碼來完成。
2.6 系統(tǒng)日志分析方式
該方式通過分析數(shù)據(jù)庫自身的日志來判斷變化的數(shù)據(jù)。關(guān)系犁數(shù)據(jù)庫系統(tǒng)都會將所有的DML操作存儲在日志文件中,以實(shí)現(xiàn)數(shù)據(jù)庫的備份和還原功能。ETL增量 抽取進(jìn)程通過對數(shù)據(jù)庫的日志進(jìn)行分析,提取對相關(guān)源表在特定時(shí)間后發(fā)生的DML操作信息,就可以得知自上次抽取時(shí)刻以來該表的數(shù)據(jù)變化情況,從而指導(dǎo)增量 抽取動作。
有些數(shù)據(jù)庫系統(tǒng)提供了訪問日志的專用的程序包(例如Oracle的LogMiner),使數(shù)據(jù)庫日志的分析工作得到大大簡化。
2.7 特定數(shù)據(jù)庫的方式
針對特有數(shù)據(jù)庫系統(tǒng)的增量抽取方式:
2.7.1 Oracle改變數(shù)據(jù)捕獲(changed data capture,CDC)方式
OracleCDC特性是在Oraele9i數(shù)據(jù)庫中引入的。CDC能夠幫助識別從上次抽取之后發(fā)生變化的數(shù)據(jù)。利用CDC,在對源表進(jìn)行 insert、update或delete等操作的同時(shí)就可以提取數(shù)據(jù),并且變化的數(shù)據(jù)被保存在數(shù)據(jù)庫的變化表中。這樣就可以捕獲發(fā)生變化的數(shù)據(jù),然后利 用數(shù)據(jù)庫視圖以一種可控的方式提供給ETL抽取進(jìn)程,作為增量抽取的依據(jù)。
CDC方式對源表數(shù)據(jù)變化情況的捕獲有兩種方式:同步CDC和異步CDC。同步CDC使用源數(shù)據(jù)庫觸發(fā)器來捕獲變更的數(shù)據(jù)。這種方式是實(shí)時(shí)的,沒有任何延 遲。當(dāng)DML操作提交后,變更表中就產(chǎn)生了變更數(shù)據(jù)。異步CDC使用數(shù)據(jù)庫重做日志(redolog)文件,在源數(shù)據(jù)庫發(fā)生變更以后,才進(jìn)行數(shù)據(jù)捕獲。
2.7.2 Oracle閃回查詢方式
Oracle9i以上版本的數(shù)據(jù)庫系統(tǒng)提供了閃回查詢機(jī)制,允許用戶查詢過去某個(gè)時(shí)刻的數(shù)據(jù)庫狀態(tài)。這樣,抽取進(jìn)程可以將源數(shù)據(jù)庫的當(dāng)前狀態(tài)和上次抽取時(shí)刻的狀態(tài)進(jìn)行對比,快速得出源表數(shù)據(jù)記錄的變化情況。
3 比較和分析
可見,ETL在進(jìn)行增量抽取操作時(shí),有以上各種機(jī)制可以選擇?,F(xiàn)從兼容性、完備性、性能和侵入性4個(gè)方面對這些機(jī)制的優(yōu)劣進(jìn)行比較分析。
兼容性
數(shù)據(jù)抽取需要面對的源系統(tǒng),并不一定都是關(guān)系型數(shù)據(jù)庫系統(tǒng)。某個(gè)ETL過程需要從若干年前的遺留系統(tǒng)中抽取Excel或者CSV文本數(shù)據(jù)的情形是經(jīng)常發(fā)牛 的。這時(shí),所有基于關(guān)系型數(shù)據(jù)庫產(chǎn)品的增量機(jī)制都無法工作,時(shí)間戳方式和全表比對方式可能有一定的利用價(jià)值,在最壞的情況下,只有放棄增量抽取的思路,轉(zhuǎn) 而采用全表刪除插入方式。
完備性
完備性方面,時(shí)間戳方式不能捕獲delete操作,需要結(jié)合其它方式一起使用。
性能
增量抽取的性能因素表現(xiàn)在兩個(gè)方面,一是抽取進(jìn)程本身的性能,二是對源系統(tǒng)性能的負(fù)面影響。觸發(fā)器方式、日志表方式以及系統(tǒng)日志分析方式由于不需要在抽取 過程中執(zhí)行比對步驟,所以增量抽取的性能較佳。全表比對方式需要經(jīng)過復(fù)雜的比對過程才能識別出更改的記錄,抽取性能最差。在對源系統(tǒng)的性能影響方面,觸發(fā) 器方式由于是直接在源系統(tǒng)業(yè)務(wù)表上建立觸發(fā)器,同時(shí)寫臨時(shí)表,對于頻繁操作的業(yè)務(wù)系統(tǒng)可能會有一定的性能損失,尤其是當(dāng)業(yè)務(wù)表上執(zhí)行批量操作時(shí),行級觸發(fā) 器將會對性能產(chǎn)生嚴(yán)重的影響;同步CDC方式內(nèi)部采用觸發(fā)器的方式實(shí)現(xiàn),也同樣存在性能影響的問題;全表比對方式和日志表方式對數(shù)據(jù)源系統(tǒng)數(shù)據(jù)庫的性能沒 有任何影響,只是它們需要業(yè)務(wù)系統(tǒng)進(jìn)行額外的運(yùn)算和數(shù)據(jù)庫操作,會有少許的時(shí)間損耗;時(shí)間戳方式、系統(tǒng)日志分析方式以及基于系統(tǒng)日志分析的方式(異步 CDC和閃回查詢)對數(shù)據(jù)庫性能的影響也是非常小的。
侵入性
對數(shù)據(jù)源系統(tǒng)的侵入性是指業(yè)務(wù)系統(tǒng)是否要為實(shí)現(xiàn)增量抽取機(jī)制做功能修改和額外操作,在這一點(diǎn)上,時(shí)間戳方式值得特別關(guān)注。該方式除了要修改數(shù)據(jù)源系統(tǒng)表結(jié) 構(gòu)外,對于不支持時(shí)間戳字段自動更新的關(guān)系型數(shù)據(jù)庫產(chǎn)品,還必須要修改業(yè)務(wù)系統(tǒng)的功能,讓它在源表t執(zhí)行每次操作時(shí)都要顯式的更新表的時(shí)間戳字段,這在 ETL實(shí)施過程中必須得到數(shù)據(jù)源系統(tǒng)高度的配合才能達(dá)到,并且在多數(shù)情況下這種要求在數(shù)據(jù)源系統(tǒng)看來是比較“過分”的,這也是時(shí)間戳方式無法得到廣泛運(yùn)用 的主要原因。另外,觸發(fā)器方式需要在源表上建立觸發(fā)器,這種在某些場合中也遭到拒絕。還有一些需要建立臨時(shí)表的方式,例如全表比對和日志表方式。可能因?yàn)?開放給ETL進(jìn)程的數(shù)據(jù)庫權(quán)限的限制而無法實(shí)施。同樣的情況也可能發(fā)生在基于系統(tǒng)日志分析的方式上,因?yàn)榇蠖鄶?shù)的數(shù)據(jù)庫產(chǎn)品只允許特定組的用戶甚至只有 DBA才能執(zhí)行日志分析。閃回杏詢在侵入性方面的影響是最小的。
綜述:
通過對各種增量抽取機(jī)制的對比分析,我們發(fā)現(xiàn),沒有一種機(jī)制具有絕對的優(yōu)勢,不同機(jī)制在各種因素的表現(xiàn)大體上都是相對平衡的。兼容性較差的機(jī)制,像CDC 和閃回查詢機(jī)制,由于充分利用了數(shù)據(jù)源系統(tǒng)DBMS的特性,相對來說具有較好的整體優(yōu)勢;最容易實(shí)現(xiàn)以及兼容性最佳的全表刪除插入機(jī)制,則是以犧牲抽取性 能為代價(jià)的;系統(tǒng)日志分析方式對源業(yè)務(wù)系統(tǒng)的功能無需作任何改變,對源系統(tǒng)表也無需建立觸發(fā)器,而抽取性能也不錯(cuò),但有可能需要源系統(tǒng)開放DBA權(quán)限給 ETL抽取進(jìn)程,并且自行分析日志系統(tǒng)難度較高,不同數(shù)據(jù)庫系統(tǒng)的日志格式不一致,這就在一定程度上限制了它的使用范圍。所以,ETL實(shí)施過程中究競選擇 哪種增量抽取機(jī)制,要根據(jù)實(shí)際的數(shù)據(jù)源系統(tǒng)環(huán)境進(jìn)行決策,需要綜合考慮源系統(tǒng)數(shù)據(jù)庫的類型、抽取的數(shù)據(jù)量(決定對性能要求的苛刻程度)、對源業(yè)務(wù)系統(tǒng)和數(shù) 據(jù)庫的控制能力以及實(shí)現(xiàn)難度等各種因素,甚至結(jié)合各種不同的增量機(jī)制以針對環(huán)境不同的數(shù)據(jù)源系統(tǒng)進(jìn)行ETL實(shí)施。
4 結(jié)束語
為了實(shí)現(xiàn)數(shù)據(jù)倉庫數(shù)據(jù)的高效更新,增量抽取是ETL數(shù)據(jù)抽取過程中非常重要的一環(huán),其實(shí)現(xiàn)機(jī)制直接決定了ETL的整體實(shí)施效果。我們通過對幾種常見的增量 抽取機(jī)制進(jìn)行了對比,總結(jié)了各種機(jī)制的特性并分析了它們的優(yōu)劣。各種增量抽取機(jī)制都有它有存在的價(jià)值和固有的限制條件,在ETL的設(shè)計(jì)和實(shí)施工作過程中, 只能依據(jù)項(xiàng)目的實(shí)際環(huán)境進(jìn)行綜合考慮,甚至需要對可采用的多種機(jī)制進(jìn)行實(shí)際的測試,才能確定一個(gè)最優(yōu)的增量抽取方法。