劉 洋 衛紅春
(西安石油大學計算機學院 陜西 西安 710065)
隨著各行業信息化建設的不斷深入,企業各部門信息系統數量不斷增加,這些系統之間存在著不同程度的隔離,導致資源無法相互使用,這就使得數據同步成為必然。
通常,目標數據庫中所需的共享數據都是由源系統提供的。隨著數據量的不斷變化增長,資源和時間的消耗都是巨大的,特別是要求實時或近實時的生產庫,每次數據同步的間隔時間可能更短。因此如果只是加載自上次提取之后發生變化的數據,那么效率就會明顯增加。但是,在數據量巨大的源系統中,識別并提取最新變化的數據即使是可能的,也非常困難。除了識別最新變化數據的挑戰之外,從一個源系統到多個目標系統同步改變數據也是一個挑戰。
變化數據捕獲(Change Data Capture,CDC)就簡化了識別上次提取之后發生數據變化的過程,其也就成為解決各系統數據同步的基礎。CDC策略有多種,無論從實際應用還是理論研究的角度,對于數據同步技術中變化數據捕獲的研究都具有重要的意義。
變化數據捕獲(CDC),是用來描述捕獲增量變化數據到其他數據庫或數據源。CDC能夠識別自上次提取之后發生變化的數據,在對源表進行增刪改操作的同時就可以提取,并且將變化數據保存在變更表中,然后以一種可控的方式利用視圖提供給目標數據庫。
CDC是一個發布者/訂閱者模型。發布者識別捕獲變化數據,將其保存在變更表中,提供給訂閱者;訂閱者創建訂閱者視圖,從發布者那里獲得授權的變化。一個發布者可以支持多個訂閱者用戶,也就是通常提到的一對多關系。
變更表中包含了源表中變更的數據。變更表中的數據分為兩部分,一部分是變更數據本身,發布者將源表的主鍵和訂閱者指定的數據加入到變更表中;另一部分是變更表中必要的和可選的控制數據,可選的控制數據由發布者在創建變更表時指定。控制數據由CDC來管理。
變更集是一組變更的數據,它作為整體來管理,可以保證事務的一致性。一個變更集屬于一個變更源,一個變更源可以包括多個變更集。
當前CDC有兩種捕獲數據方式:同步CDC和異步CDC。異步CDC又分為3種模式:異步HotLog模式、異步分布式HotLog模式、異步AutoLog模式。

圖1 同步CDC模式
同步CDC模式通常都是在源數據庫上配置觸發器進行變化數據捕獲。由于數據實時、連續在源系統中進行捕獲,他是沒有任何延遲的。當對同步對象進行數據增刪改等操作時,觸發器被喚醒,變化數據開始被捕獲。同步CDC利用變更表和訂閱者試圖來實現。變化數據寫入變更表,為使用CDC提供了一個可擴展的基礎架構,訂閱者針對變更表的數據可以獲得一致數據變更集視圖。用戶可以擴展和清除訂閱窗戶,通過數據庫視圖隱式的改變數據集。如果沒有任何用戶訂閱變化數據,變更表中的數據可以被清除。同步CDC通過PL/SQL包進行調用。同步CDC的優勢在于配置簡單,不需要配置復制、傳輸、提取等功能。
在異步HotLog模式中,變化數據捕獲是從源數據庫的online redo log中提取事務數據。在數據提交和寫入日志時存在一定的時間差,這個捕獲會有一些延遲。因為我們要設置變更表來存取變化的數據,所以這個變更表一定要在源數據庫這端。圖 2就是一個簡單的 HotLog配置,LGWR(Log Writer)紀錄提交的事務到在線重做日志文件 (online redo log)文件中,用Oracle Stream方式自動在HotLog數據源中填入變化數據到變更集中的數據變更表。

圖2 異步HotLog模式
在一個異步HotLog模式下,變化數據捕獲是從源數據庫的online redo log文件中提取事務數據。不像上述的兩種模式,異步分布HotLog模式需要創建中間數據庫(Staging Database),變化數據捕獲的對象和動作橫跨源數據庫和中間庫。變更源在源數據庫中被定義,在中間庫發布。圖3說明異步HotLog分布模式的配置,源數據庫的變更源 從在線重做日志文件中捕獲變化的數據,寫入源數據庫的變更源,再用Stream方式填充到中間庫的變更集中,數據會保存到變更集的變更表中。
在這種模式中,有兩個發布者,一個是在源數據庫、一個是在中間數據庫。源數據庫發布者定義一個數據庫鏈接(DB Link)連接到中間數據庫作為中間數據庫的發布者,同時在中間數據庫發布者也定義一個反向的數據庫鏈接到源數據庫作為源數據庫的發布者。中間庫發布者執行所有的發布操作,也就是源數據庫操作引起的。
在這種模式下,反向的數據庫鏈接創建是必須存在的,主要是為了創建、修改、刪除中間數據庫中的變更源、變更集、變更表使用的,在變化捕獲的時候這個反向數據庫鏈接并沒有起作用。一旦中間庫中的變化數據源、變更集、變更表啟用后,這個數據庫鏈接是可以被刪除的,若要重新建立中間庫,就需要重新啟用這個數據庫鏈接了。

圖3 異步分布HotLog模式
在異步AutoLog模式下,數據變化通過重做傳輸服務(Redo Transport Services)服務從重做日志文件或者歸檔日志文件(Archived Log Files)中進行捕獲。重做傳輸服務自動捕獲日志從源數據庫到中間庫。配置這種模式,需要設置數據庫參數LOG_ARCHIVE_DEST_n做本地日志的歸檔目錄。源數據庫的發布者配置日志傳輸服務,然后從源數據庫拷貝重做日志文件到中間庫,在中間庫自動注冊重做日志文件進行數據同步。異步AutoLog模式中,異步AutoLog online模式是從重做日志文件中進行捕獲,異步Autolog Archive模式是從歸檔日志文件中進行捕獲。如果設置了AutoLog Online模式,重做日志傳輸服務會從源庫拷貝重做日志到中間庫或者目的庫的備用重做日志(Standby Redo Log)文件中。源數據庫提交事務后,中間庫的變更集被填充數據。在中間庫,只能有一個AutoLog Online變更源,也只能包含一個變更集。如果設置了AutoLog Archive模式,日志傳輸服務是拷貝歸檔日志到中間庫,等中間庫接受到歸檔日志后,變更集將被填充。

圖4 異步Autolog Archive模式
圖4顯示的是AutoLog online配置模式,LGWR進程拷貝重做日志文件到中間庫的備用重做日志文件。LGWR進程是用Oracle Net網絡發送數據給中間庫的遠程文件服務(remote file server,RFS)進程。中間庫的RFS進程會寫重做日志數據到備用重做日志文件。變化數據再通過Oracle Stream downstream的方式填充變化數據到變更表中。

圖5 異步AutoLog Archive模式
圖5顯示的是AutoLog Archive配置模式,歸檔進程歸檔重做日志到LOG_ARCHIVE_DEST_1,然后再拷貝數據到LOG_ARCHIVE_DEST_2指定的中間庫。歸檔進程也是通過Oracle Net發送重做日志數據給RFS進程。在中間庫,RFS進程將重做日志數據寫到被拷貝的日志文件。再通過Streams downstream方式填充變化數據到變更表中。
上述共研究4類變化數據的捕獲方式,各種方式都有其優缺點,各自依托于實際的技術領域和運行的業務環境,沒有哪一種方式能取代其他方式成為通用標準。通過表1我們將各種方式對實際系統的特點及影響做一個簡單比較。
通過比較,我們可以看出各類CDC模式的技術特點。比如,同步CDC模式通過在源數據庫上建立觸發器的方式來獲取增量數據,因此可以做到實時抽取,但是對源系統影響較大;異步HotLog模式需要直接從源數據庫解析日志文件,會有一段時間的延時,并會對源數據庫有一定的壓力;異步AutoLog模式則是直接把源數據庫的日志文件傳到中間庫,然后進行日志分析,這樣的方式對源庫性能影響最小、數據傳遞性能最大。

表1
因此,根據數據庫規模,合理的利用變化數據捕獲技術能使我們更好的達到數據快速抽取的目標,以滿足業務需求。
[1]尤玉林,張憲民.一種可靠的數據倉庫中ETL策略與架構設計[J].計算機工程與應用,2005,41(10):172-174.
[2]張震.異構數據庫同步系統的研究與實現[J].計算機應用,2002,22:43-45.
[3]Ooi B C,Shu Y F,Tan K L.Relational data sharing in peer-based data management systems[J].ACM SIGMOD Record,2003,32:59-64.