一種基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法【專利摘要】本發(fā)明公開了一種基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法,包括以下步驟:在進行雙向同步的數(shù)據(jù)庫中分別建立特殊表;當增量數(shù)據(jù)由源數(shù)據(jù)庫傳輸?shù)侥康臄?shù)據(jù)庫時,首先在目的數(shù)據(jù)庫中插入一條特殊表數(shù)據(jù),然后在目的數(shù)據(jù)庫中執(zhí)行完畢所有增量數(shù)據(jù),最后在目的數(shù)據(jù)庫手動提交增量數(shù)據(jù)事務;進行增量數(shù)據(jù)同步時具體操作如下:從日志中以事務為單位獲取增量數(shù)據(jù),檢查事務中是否包含一條數(shù)據(jù)庫B的特殊表B的插入數(shù)據(jù),如果此條插入數(shù)據(jù)存在且數(shù)據(jù)的來源為數(shù)據(jù)庫A,則不再將增量數(shù)據(jù)同步至數(shù)據(jù)庫A;否則,將增量數(shù)據(jù)同步至數(shù)據(jù)庫A。本發(fā)明在不影響數(shù)據(jù)庫性能的同時,利用事務的原子性,簡單方便地解決了數(shù)據(jù)循環(huán)的問題。【專利說明】一種基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法【
技術領域:
】[0001]本發(fā)明涉及數(shù)據(jù)庫同步【
技術領域:
】,具體涉及一種基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法?!?br>背景技術:
】[0002]數(shù)據(jù)庫是IT架構中的一種基礎構件,是對數(shù)據(jù)進行存儲、管理的一種有效設施,現(xiàn)在幾乎所有的應用都離不開數(shù)據(jù)庫的支持。由于現(xiàn)在海量數(shù)據(jù)和數(shù)據(jù)訪問地區(qū)分布不均衡,單個數(shù)據(jù)庫已經(jīng)不能承載所有的訪問,一般需要在多個不同的地方分別部署一個數(shù)據(jù)庫來提供服務,其中每一個數(shù)據(jù)庫對外界來說都是數(shù)據(jù)完整和服務完整的,但是事實上每兩個數(shù)據(jù)庫之間的數(shù)據(jù)都是不一致的,所以這些不同地方的數(shù)據(jù)庫之間就需要進行增量數(shù)據(jù)的同步來保證所有數(shù)據(jù)庫的數(shù)據(jù)一致性和服務完整性。[0003]增量數(shù)據(jù)是指一個數(shù)據(jù)庫在某一段時間內產(chǎn)生或變化的數(shù)據(jù),按照操作類型區(qū)分又分為插入數(shù)據(jù)、刪除數(shù)據(jù)、修改數(shù)據(jù),分別對應SQL中insert、delete、update操作。[0004]數(shù)據(jù)庫增量同步就是把增量數(shù)據(jù)從主數(shù)據(jù)庫傳輸?shù)綇臄?shù)據(jù)庫中,以達到主從數(shù)據(jù)庫的數(shù)據(jù)一致性,過程依次如下:獲取A數(shù)據(jù)庫的增量數(shù)據(jù)、傳輸?shù)紹數(shù)據(jù)庫、在B數(shù)據(jù)庫中執(zhí)行SQL語句進行數(shù)據(jù)載入。[0005]不同地方的活動數(shù)據(jù)庫之間需要進行增量雙向同步,即A數(shù)據(jù)庫的增量數(shù)據(jù)需要同步到B數(shù)據(jù)庫,同時B數(shù)據(jù)庫的增量數(shù)據(jù)也需要同步到A數(shù)據(jù)庫。[0006]增量雙向同步過程中會面臨數(shù)據(jù)循環(huán)的問題,數(shù)據(jù)循環(huán)問題的產(chǎn)生是因為A數(shù)據(jù)庫的增量數(shù)據(jù)同步到B數(shù)據(jù)庫之后,這部分增量數(shù)據(jù)又會成為B數(shù)據(jù)庫的增量數(shù)據(jù)再次同步到A數(shù)據(jù)庫,然后這部分數(shù)據(jù)加上B數(shù)據(jù)庫的增量數(shù)據(jù)又再次成為A數(shù)據(jù)庫的增量數(shù)據(jù),以此類推,增量數(shù)據(jù)就在不斷增多、循環(huán)過程中。[0007]解決增量雙向同步過程中數(shù)據(jù)循環(huán)問題的關鍵是在A數(shù)據(jù)庫的增量數(shù)據(jù)同步到B數(shù)據(jù)庫之后,不允許這部分數(shù)據(jù)再次同步回A數(shù)據(jù)庫,而解決問題的難點在于識別B數(shù)據(jù)庫的增量數(shù)據(jù)到底是不是A數(shù)據(jù)庫產(chǎn)生的。【
發(fā)明內容】[0008]本發(fā)明提供了一種基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法,在不影響數(shù)據(jù)庫性能的同時,利用數(shù)據(jù)庫事務的原子性,簡單方便地解決了數(shù)據(jù)循環(huán)的問題。[0009]一種基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法,所述異構數(shù)據(jù)庫同步系統(tǒng)包括至少兩個能夠進行雙向同步的數(shù)據(jù)庫,兩個數(shù)據(jù)庫進行增量數(shù)據(jù)傳遞時,其中一個為提供增量數(shù)據(jù)的源數(shù)據(jù)庫,另一個為接收增量數(shù)據(jù)的目的數(shù)據(jù)庫,包括以下步驟:[0010](I)在進行雙向同步的數(shù)據(jù)庫中分別建立特殊表,各個特殊表中用于記錄所在數(shù)據(jù)庫中增量數(shù)據(jù)的來源信息;[0011]將所有進行雙向同步的數(shù)據(jù)庫的事務提交模式設定為手動事務提交模式;[0012](2)當增量數(shù)據(jù)由源數(shù)據(jù)庫傳輸?shù)侥康臄?shù)據(jù)庫時,首先在目的數(shù)據(jù)庫中插入一條特殊表數(shù)據(jù),該條特殊表數(shù)據(jù)記載此次增量數(shù)據(jù)的來源信息,然后在目的數(shù)據(jù)庫中執(zhí)行完畢所有增量數(shù)據(jù),最后在目的數(shù)據(jù)庫手動提交增量數(shù)據(jù)事務;[0013](3)若兩個能夠進行雙向同步的數(shù)據(jù)庫分別為數(shù)據(jù)庫A和數(shù)據(jù)庫B,數(shù)據(jù)庫A中建立有特殊表A,數(shù)據(jù)庫B中建立有特殊表B,判斷是否需要將數(shù)據(jù)庫B中的增量數(shù)據(jù)同步至數(shù)據(jù)庫A,具體操作如下:[0014]從數(shù)據(jù)庫B的日志中以事務為單位獲取增量數(shù)據(jù),檢查事務中是否包含一條數(shù)據(jù)庫B的特殊表B的插入數(shù)據(jù),如果此條插入數(shù)據(jù)存在且此插入數(shù)據(jù)顯示增量數(shù)據(jù)的來源為數(shù)據(jù)庫A,則不再將增量數(shù)據(jù)同步至數(shù)據(jù)庫A;否則,將增量數(shù)據(jù)同步至數(shù)據(jù)庫A。[0015]本發(fā)明的目的在于解決增量數(shù)據(jù)雙向同步過程中的數(shù)據(jù)循環(huán)問題,因此,對于異構數(shù)據(jù)庫中僅能實現(xiàn)單向同步的數(shù)據(jù)庫的同步過程可以采用現(xiàn)有技術。[0016]本發(fā)明所述的異構數(shù)據(jù)庫同步系統(tǒng)中能夠進行雙向同步的數(shù)據(jù)庫不允許3個及以上相互之間構成雙向數(shù)據(jù)循環(huán)回路,例如,數(shù)據(jù)庫A和數(shù)據(jù)庫B進行雙向同步,數(shù)據(jù)庫B和數(shù)據(jù)庫C進行雙向同步,數(shù)據(jù)庫C和數(shù)據(jù)庫A進行雙向同步,則數(shù)據(jù)庫A、數(shù)據(jù)庫B和數(shù)據(jù)庫C構成3個數(shù)據(jù)庫的雙向數(shù)據(jù)循環(huán)回路。[0017]所述特殊表為利用標準SQL建立的名稱固定的表,各個特殊表中用于記錄相應數(shù)據(jù)庫中增量數(shù)據(jù)的來源信息,能夠表征增量數(shù)據(jù)的來源信息的字段可以依據(jù)需要進行選擇,例如,所述增量數(shù)據(jù)的來源信息包括三個字段,分別為主機IP、端口以及數(shù)據(jù)庫名稱。[0018]為了保持異構數(shù)據(jù)庫中各個特殊表的兼容性,表述增量數(shù)據(jù)來源信息的三個字段的數(shù)據(jù)類型均采用varchar。[0019]每次記錄增量數(shù)據(jù)的來源信息時,在特殊表中插入一條數(shù)據(jù),數(shù)據(jù)包括能夠表述該增量數(shù)據(jù)的來源信息的三個字段數(shù)據(jù),分別為主機IP、端口以及數(shù)據(jù)庫名稱。[0020]將增量數(shù)據(jù)事務提交模式設定為手動提交模式是為了保持數(shù)據(jù)庫中增量數(shù)據(jù)和增量數(shù)據(jù)來源信息的一致性,執(zhí)行整個增量數(shù)據(jù)事務后,由用戶手動將增量數(shù)據(jù)提交到數(shù)據(jù)庫中,使數(shù)據(jù)庫發(fā)生變化,增量數(shù)據(jù)和增量數(shù)據(jù)來源信息一起被寫入數(shù)據(jù)庫。[0021]首先從數(shù)據(jù)庫B的日志中以事務為單位獲取增量數(shù)據(jù),然后檢查事務中是否包含特殊表的插入數(shù)據(jù),如果不存在,那么增量數(shù)據(jù)肯定不是來源于數(shù)據(jù)庫A,如果存在,那么根據(jù)此條插入數(shù)據(jù)判斷增量數(shù)據(jù)的來源是否為數(shù)據(jù)庫A的方法為將數(shù)據(jù)來源信息的主機IP、端口以及數(shù)據(jù)庫名稱與數(shù)據(jù)庫A的主機IP、端口以及數(shù)據(jù)庫名稱做比較,若三個字段均完全一致,則增量數(shù)據(jù)的來源為數(shù)據(jù)庫A。[0022]在特殊表中插入記錄之后,所有操作包括特殊表中插入的記錄,都會被記錄在日志文件中,所以不需要保存特殊表的數(shù)據(jù),為了防止數(shù)據(jù)表中的數(shù)據(jù)量過大,依據(jù)預定時間間隔清除特殊表中的記錄。[0023]本發(fā)明一種基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法,在不影響數(shù)據(jù)庫性能的同時,利用事務的原子性,簡單方便地解決了數(shù)據(jù)循環(huán)的問題。【專利附圖】【附圖說明】[0024]圖1為本發(fā)明基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法的流程圖。【具體實施方式】[0025]下面結合附圖,對本發(fā)明一種基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法做詳細描述。[0026]本發(fā)明適用的異構數(shù)據(jù)庫同步系統(tǒng)包括至少兩個能夠進行雙向同步的數(shù)據(jù)庫,若某兩個數(shù)據(jù)庫僅能進行單向同步,則采用現(xiàn)有技術,若某兩個數(shù)據(jù)庫能夠進行雙向同步,則采用本發(fā)明的方法避免產(chǎn)生數(shù)據(jù)增量雙向同步中的數(shù)據(jù)循環(huán)問題。[0027]為便于敘述,以下以能夠進行雙向同步的數(shù)據(jù)庫A和數(shù)據(jù)庫B為例,詳述同步方法,如圖1所示,具體包括以下步驟:[0028](I)在數(shù)據(jù)庫A中建立特殊表A,特殊表A中用于記錄數(shù)據(jù)庫A中增量數(shù)據(jù)的來源信息;在數(shù)據(jù)庫B中建立特殊表B,特殊表B中用于記錄數(shù)據(jù)庫B中增量數(shù)據(jù)的來源信息。[0029]特殊表為標準SQL建立的一個名稱固定的表,包括能夠表述增量數(shù)據(jù)來源信息的主機IP、端口、數(shù)據(jù)庫名稱三個字段,為了數(shù)據(jù)庫之間的兼容性,使用varchar作為特殊表中所有字段的數(shù)據(jù)類型。[0030]建立特殊表的SQL語句為:createtabledatabase_sync(host_strvarchar(50),port_strvarchar(50),database_strvarchar(50))。[0031](2)來自數(shù)據(jù)庫A的增量數(shù)據(jù)傳輸?shù)綌?shù)據(jù)庫B,將數(shù)據(jù)庫B中的事務提交模式設定為手動提交模式,首先在數(shù)據(jù)庫B中執(zhí)行插入一條特殊表數(shù)據(jù)(該條數(shù)據(jù)記載此次增量數(shù)據(jù)的來源信息),然后執(zhí)行所有的增量數(shù)據(jù),最后手動將事務提交到數(shù)據(jù)庫B。[0032]插入數(shù)據(jù)記錄增量數(shù)據(jù)的來源信息,插入數(shù)據(jù)包括增量數(shù)據(jù)來源數(shù)據(jù)庫所對應的主機IP、端口和數(shù)據(jù)庫名稱,分別對應特殊表B中的三個字段,每個字段均為字符串類型。[0033](3)首先從數(shù)據(jù)庫B中的日志中以事務為單位獲取增量數(shù)據(jù),然后檢查事務中是否包含一條特殊表B的插入數(shù)據(jù),若需要將數(shù)據(jù)庫B中的增量數(shù)據(jù)同步到數(shù)據(jù)庫A,則進行以下判斷:[0034]a)、若事務中不包含一條特殊表B中的插入數(shù)據(jù),則將相應數(shù)據(jù)同步至數(shù)據(jù)庫A;[0035]增量數(shù)據(jù)可能來自于數(shù)據(jù)庫的同步,也可能來自于用戶的操作,即用戶對數(shù)據(jù)庫中的數(shù)據(jù)做插入、刪除或者修改,若增量數(shù)據(jù)來自于數(shù)據(jù)庫的同步,則該增量數(shù)據(jù)有來源記錄;若增量數(shù)據(jù)來自于用戶的操作,則該增量數(shù)據(jù)沒有來源記錄,所有沒有來源信息的增量數(shù)據(jù)都需要同步至數(shù)據(jù)庫A。[0036]b)、若事務中包含一條特殊表B中的插入數(shù)據(jù)記錄,但此插入數(shù)據(jù)顯示增量數(shù)據(jù)的來源并非數(shù)據(jù)庫A,則將相應數(shù)據(jù)同步至數(shù)據(jù)庫A;[0037]若特殊表B中的插入數(shù)據(jù)記錄的增量數(shù)據(jù)來源信息的主機IP、端口以及數(shù)據(jù)庫名稱與數(shù)據(jù)庫A的主機IP、端口以及數(shù)據(jù)庫名稱不完全一致或者完全不一致,則該增量數(shù)據(jù)不是數(shù)據(jù)庫A的增量數(shù)據(jù),需要同步至數(shù)據(jù)庫A;[0038]C)、若事務中包含一條特殊表B中的插入數(shù)據(jù)記錄,且此插入數(shù)據(jù)顯示增量數(shù)據(jù)的來源為數(shù)據(jù)庫A,則不再將數(shù)據(jù)同步至數(shù)據(jù)庫A;[0039]若特殊表B中的插入數(shù)據(jù)記錄的增量數(shù)據(jù)來源信息的主機IP、端口以及數(shù)據(jù)庫名稱與數(shù)據(jù)庫A的主機IP、端口以及數(shù)據(jù)庫名稱做比較,若三個字段均完全一致,則數(shù)據(jù)的來源為數(shù)據(jù)庫A。[0040](4)若需要將數(shù)據(jù)庫A中的增量數(shù)據(jù)同步到數(shù)據(jù)庫B中,則采取和步驟(3)相類似的操作。[0041](5)啟動一個守護線程定時清除特殊表的數(shù)據(jù),防止特殊表中的數(shù)據(jù)量過大?!緳嗬蟆?.一種基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法,所述異構數(shù)據(jù)庫同步系統(tǒng)包括至少兩個能夠進行雙向同步的數(shù)據(jù)庫,兩個數(shù)據(jù)庫進行增量數(shù)據(jù)傳遞時,其中一個為提供增量數(shù)據(jù)的源數(shù)據(jù)庫,另一個為接收增量數(shù)據(jù)的目的數(shù)據(jù)庫,其特征在于,包括以下步驟:(1)在進行雙向同步的數(shù)據(jù)庫中分別建立特殊表,各個特殊表中用于記錄所在數(shù)據(jù)庫中增量數(shù)據(jù)的來源信息;將所有進行雙向同步的數(shù)據(jù)庫的事務提交模式設定為手動事務提交模式;(2)當增量數(shù)據(jù)由源數(shù)據(jù)庫傳輸?shù)侥康臄?shù)據(jù)庫時,首先在目的數(shù)據(jù)庫中插入一條特殊表數(shù)據(jù),該條特殊表數(shù)據(jù)記載此次增量數(shù)據(jù)的來源信息,然后在目的數(shù)據(jù)庫中執(zhí)行完畢所有增量數(shù)據(jù),最后在目的數(shù)據(jù)庫手動提交增量數(shù)據(jù)事務;(3)若兩個能夠進行雙向同步的數(shù)據(jù)庫分別為數(shù)據(jù)庫A和數(shù)據(jù)庫B,數(shù)據(jù)庫A中建立有特殊表A,數(shù)據(jù)庫B中建立有特殊表B,判斷是否需要將數(shù)據(jù)庫B中的增量數(shù)據(jù)同步至數(shù)據(jù)庫A,具體操作如下:從數(shù)據(jù)庫B的日志中以事務為單位獲取增量數(shù)據(jù),檢查事務中是否包含一條數(shù)據(jù)庫B的特殊表B的插入數(shù)據(jù),如果此條插入數(shù)據(jù)存在且此插入數(shù)據(jù)顯示增量數(shù)據(jù)的來源為數(shù)據(jù)庫A,則不再將增量數(shù)據(jù)同步至數(shù)據(jù)庫A;否則,將增量數(shù)據(jù)同步至數(shù)據(jù)庫A。2.如權利要求1所述的基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法,其特征在于,依據(jù)預定時間間隔清除特殊表中的記錄。3.如權利要求2所述的基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法,其特征在于,所述增量數(shù)據(jù)的來源信息包括三個字段數(shù)據(jù),分別為主機IP、端口以及數(shù)據(jù)庫名稱。4.如權利要求3所述的基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法,其特征在于,表述增量數(shù)據(jù)來源信息的三個字段的數(shù)據(jù)類型均采用varchar。5.如權利要求4所述的基于日志的異構數(shù)據(jù)庫同步系統(tǒng)中雙向同步數(shù)據(jù)循環(huán)的解決方法,其特征在于,判斷數(shù)據(jù)的來源是否為數(shù)據(jù)庫A,將數(shù)據(jù)來源信息的主機IP、端口以及數(shù)據(jù)庫名稱與數(shù)據(jù)庫A的主機IP、端口以及數(shù)據(jù)庫名稱做比較,若三個字段均完全一致,則數(shù)據(jù)的來源為數(shù)據(jù)庫A?!疚臋n編號】G06F17/30GK103970833SQ201410131529【公開日】2014年8月6日申請日期:2014年4月2日優(yōu)先權日:2014年4月2日【發(fā)明者】李瑩,姚祥龍,尹建偉,鄧水光,吳健,吳朝暉申請人:浙江大學