吳秀君
摘要:當(dāng)前信息化的時(shí)代,數(shù)據(jù)成為了最重要的資源,如何能消化信息孤島,更好地完成同一組織內(nèi)部、上下級(jí)、不同組織間的數(shù)據(jù)匯總、統(tǒng)計(jì)、分析等問(wèn)題就凸顯出來(lái);只有很好地完成了數(shù)據(jù)的整合,才能更進(jìn)一步地支撐起上層數(shù)據(jù)的挖掘、分析,能對(duì)企事業(yè)單位的未來(lái)發(fā)展戰(zhàn)略提供有效的數(shù)據(jù)依據(jù)。在這種如何消化信息孤島的背景下,數(shù)據(jù)集成應(yīng)運(yùn)而生。在實(shí)施數(shù)據(jù)集成的過(guò)程中,ETL是實(shí)現(xiàn)數(shù)據(jù)集成的主要技術(shù),其主要提供數(shù)據(jù)抽取、數(shù)據(jù)轉(zhuǎn)換、數(shù)據(jù)加載功能,數(shù)據(jù)抽取的方式常見(jiàn)的有觸發(fā)器、日志比對(duì)、CDC等。該文主要介紹基于CDC技術(shù)實(shí)現(xiàn)數(shù)據(jù)自動(dòng)同步。
關(guān)鍵詞:ORACLE;CDC;數(shù)據(jù)同步
中圖分類號(hào):TP393 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2015)27-0008-02
當(dāng)前信息化的時(shí)代,數(shù)據(jù)成為了最重要的資源,如何能消化信息孤島,更好地完成同一組織內(nèi)部、同一組織上下級(jí)、不同組織間的數(shù)據(jù)匯總、分析等問(wèn)題就凸顯出來(lái);只有很好地完成了數(shù)據(jù)的整合,才能更進(jìn)一步地支撐起上層數(shù)據(jù)的挖掘、分析,才能對(duì)企事業(yè)單位的未來(lái)發(fā)展戰(zhàn)略提供有效的數(shù)據(jù)依據(jù)。
在這種背景下,數(shù)據(jù)集成應(yīng)運(yùn)而生。在實(shí)施數(shù)據(jù)集成的過(guò)程中,由于不同用戶提供的數(shù)據(jù)可能來(lái)自不同的途徑,其數(shù)據(jù)內(nèi)容、數(shù)據(jù)格式和數(shù)據(jù)質(zhì)量千差萬(wàn)別,有時(shí)甚至?xí)龅綌?shù)據(jù)格式不能轉(zhuǎn)換或數(shù)據(jù)轉(zhuǎn)換格式后丟失信息等棘手問(wèn)題,嚴(yán)重阻礙了數(shù)據(jù)在各部門和各應(yīng)用系統(tǒng)中的流動(dòng)與共享。因此,如何對(duì)數(shù)據(jù)進(jìn)行有效的集成管理已成為增強(qiáng)企業(yè)商業(yè)競(jìng)爭(zhēng)力的必然選擇。ETL是實(shí)現(xiàn)數(shù)據(jù)集成的主要技術(shù)。數(shù)據(jù)抽取即從源數(shù)據(jù)抽取目的數(shù)據(jù)源系統(tǒng)需要的數(shù)據(jù),數(shù)據(jù)抽取的方式常見(jiàn)的有觸發(fā)器、全面數(shù)據(jù)對(duì)比、日志比對(duì)、狀態(tài)位、時(shí)間戳、CDC等。本文主要介紹以CDC技術(shù)為基礎(chǔ)實(shí)現(xiàn)源與目標(biāo)數(shù)據(jù)的自動(dòng)同步。
1 CDC簡(jiǎn)介
CDC是Oracle數(shù)據(jù)庫(kù)的特性。CDC能夠幫助你識(shí)別從上次提取之后發(fā)生變化的數(shù)據(jù),包括對(duì)源表進(jìn)行增、刪、改等操作。而且,變化數(shù)據(jù)保存在變化表中,這樣就可以捕獲發(fā)生變化的數(shù)據(jù)。CDC技術(shù)主要設(shè)計(jì)的對(duì)象包括:源表、變化表、變化集、訂閱視圖、訂閱窗口。
CDC同步模式分為兩種:同步模式和異步模式,本文主要采用同步模式實(shí)現(xiàn)變化數(shù)據(jù)的抽取。
2 CDC的配置步驟
2.1 創(chuàng)建訂閱、發(fā)布用戶
在ORACLE中創(chuàng)建訂閱cdc_dy_test、發(fā)布用戶cdc_fb_test,并給cdc_fb_test授予select_catalog_role、execute_ catalog_role、dbms_cdc_publish等權(quán)限;給cdc_dy_test授予create any procedure、create any job等權(quán)限。
2.2 創(chuàng)建源、目標(biāo)用戶
在ORACLE中創(chuàng)建源用戶test、目標(biāo)用戶target,并給用戶授權(quán)。
目標(biāo)用戶下創(chuàng)建表student_test (id,name ,sex ),并授所有權(quán)限給cdc_dy_test。
源用戶下創(chuàng)建表student_test (id,name ,sex ),并授所有權(quán)限給cdc_fb_test和cdc_dy_test。
2.3 發(fā)布數(shù)據(jù)
2.3.1 創(chuàng)建改變集
登錄cdc_fb_test,利用dbms_cdc_publish.create_change_set創(chuàng)建改變集student_test_change_set。
2.3.2 創(chuàng)建改變表
登錄cdc_fb_test,利用dbms_cdc_publish.create_change_table創(chuàng)建改變表student_test_ct、改變集參數(shù)為student_test_change_set,并且把改變表查詢權(quán)限授權(quán)給訂閱用戶cdc_dy_test。
2.4 訂閱數(shù)據(jù)
2.4.1 創(chuàng)建訂閱
以訂閱者(cdc_dy_test)登錄,使用dbms_cdc_subscribe.create_subscription創(chuàng)建訂閱student_test_cdc_sub。
2.4.2 訂閱表
登錄cdc_dy_test,針對(duì)發(fā)布表建立訂閱視圖,將來(lái)訂閱時(shí)從這些視圖讀取數(shù)據(jù),使用dbms_cdc_subscribe.subscribe創(chuàng)建訂閱student_test_cdc_sub對(duì)應(yīng)的訂閱表cdc_student_test_sub_v。
2.4.3 激活訂閱
訂閱需要激活,才能生效,使用dbms_cdc_subscribe.activate_subscription激活訂閱student_test_cdc_sub,激活后CDC就開(kāi)始捕獲改變數(shù)據(jù)。
至此,發(fā)布、訂閱的管理工作完成。接下來(lái)基于CDC獲取變化數(shù)據(jù)并同步至目標(biāo)表。
3 基于CDC技術(shù)實(shí)現(xiàn)數(shù)據(jù)同步
基于CDC實(shí)現(xiàn)數(shù)據(jù)同步,主要思路是:創(chuàng)建存儲(chǔ)過(guò)程,在存儲(chǔ)過(guò)程中借助之前已經(jīng)完成的工作,讀取變化數(shù)據(jù),并向目標(biāo)同步數(shù)據(jù);之后,創(chuàng)建作業(yè)定時(shí)調(diào)度該存儲(chǔ)過(guò)程,從而實(shí)現(xiàn)數(shù)據(jù)自動(dòng)同步。
3.1 創(chuàng)建數(shù)據(jù)同步存儲(chǔ)過(guò)程
通過(guò)存儲(chǔ)過(guò)程同步處理源表test.student_test與目標(biāo)表target.student_test的數(shù)據(jù)。
create or replace procedure proc_cdc
is
v_rowcount number;
v_rowcount1 number;
begin
--目標(biāo)表有沒(méi)有數(shù)據(jù)
select count(1) into v_rowcount from target.student_test;
--獲得下一組變更數(shù)據(jù)
dbms_cdc_subscribe.extend_window(subscription_name => 'student_test_cdc_sub');
--源表數(shù)據(jù)是否變化
select count(1) into v_rowcount1 from cdc_student_test_sub_v;
if v_rowcount=0 then
insert into target.student_test(id ,name,sex)
select id ,name,sex from test.student_test;
commit;
elsif v_rowcount1>0 then
--同步刪除
delete from target.student_test a
where a.id in (select b.id from cdc_student_test_sub_v b where trim(b.operation$)='d');
--同步更新
update target.student_test a
set id=(select id from cdc_student_test_sub_v b
where a.id=b.id and trim(b.operation$)='un'),
name=(select name from cdc_student_test_sub_v b
where a.id=b.id and trim(b.operation$)='un'),
sex=(select sex from cdc_student_test_sub_v b
where a.id=b.id and trim(b.operation$)='un');
--同步插入
insert into target.student_test
select id,name,sex from cdc_student_test_sub_v b where trim(b.operation$)='i';
commit;
dbms_cdc_subscribe.purge_window(subscription_name => 'student_test_cdc_sub');
end if;
end proc_cdc;
3.2 創(chuàng)建作業(yè)
通過(guò)創(chuàng)建ORACLE作業(yè),定時(shí)執(zhí)行存儲(chǔ)過(guò)程來(lái)實(shí)現(xiàn)數(shù)據(jù)自動(dòng)同步。作業(yè)創(chuàng)建可以借助工具,作業(yè)名稱為cdc_job,作業(yè)執(zhí)行周期為1分鐘。
4 結(jié)束語(yǔ)
綜上所述,ORACLE CDC與存儲(chǔ)過(guò)程、作業(yè)等技術(shù)結(jié)合即可實(shí)現(xiàn)數(shù)據(jù)的同步,而無(wú)需開(kāi)發(fā)應(yīng)用軟件,為數(shù)據(jù)的同步提供了一種數(shù)據(jù)庫(kù)層面的技術(shù)手段。當(dāng)然,本文只介紹了基本的CDC數(shù)據(jù)同步方式,但掌握了CDC的基礎(chǔ)技能后,就可以在此基礎(chǔ)上進(jìn)行擴(kuò)展,實(shí)現(xiàn)更多、更強(qiáng)的功能。
參考文獻(xiàn):
[1] 鄒先霞.基于數(shù)據(jù)庫(kù)日志的變化數(shù)據(jù)捕獲研究,2012.
[2] Oracle CDC部署流程.http://blog.itpub.net/24930246/viewspace-1069835/.
[3] ORACLE_CDC.http://my.oschina.net/u/140663/blog/307967.
[4] 王冰.基于ETL的數(shù)據(jù)管理方法的分析和實(shí)現(xiàn),2008.
[5] 顧云鋒.Oracle數(shù)據(jù)庫(kù)中存儲(chǔ)過(guò)程開(kāi)發(fā)研究,2011.
[6] 王忠民.解析Oracle存儲(chǔ)過(guò)程的使用,2009.
[7] 肖慧.王魯珊.用Oracle的DBMS_JOB來(lái)實(shí)現(xiàn)任務(wù)計(jì)劃管理,2004.