本發(fā)明屬于無(wú)主鍵數(shù)據(jù)表的一致性檢測(cè)領(lǐng)域,更具體地說(shuō),涉及一種檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的系統(tǒng)及方法。
背景技術(shù):
隨著信息化建設(shè)的高速發(fā)展,信息系統(tǒng)已經(jīng)成為企業(yè)維持業(yè)務(wù)運(yùn)轉(zhuǎn)的關(guān)鍵,企業(yè)迫切需要提高信息系統(tǒng)的可用性,保證業(yè)務(wù)的連續(xù)性,最大限度地減少因?yàn)?zāi)難或故障所帶來(lái)的損失。另一方面,多樣化的業(yè)務(wù)類型導(dǎo)致數(shù)據(jù)訪問(wèn)需求的日趨復(fù)雜化,數(shù)據(jù)量的急劇攀升也導(dǎo)致數(shù)據(jù)庫(kù)服務(wù)器不堪重負(fù),企業(yè)同樣迫切需要提高信息系統(tǒng)的運(yùn)行效率。
數(shù)據(jù)庫(kù)實(shí)時(shí)同步系統(tǒng)基于成熟的關(guān)系數(shù)據(jù)模型和標(biāo)準(zhǔn)接口,能以極少的系統(tǒng)開(kāi)支實(shí)現(xiàn)秒級(jí)數(shù)據(jù)實(shí)時(shí)同步,可廣泛應(yīng)用于應(yīng)急系統(tǒng)、容災(zāi)備份、負(fù)載均衡、數(shù)據(jù)移植、聯(lián)機(jī)維護(hù)、多業(yè)務(wù)中心等業(yè)務(wù)領(lǐng)域。
目前存在的一些數(shù)據(jù)復(fù)制系統(tǒng),例如Oracle的GoldenGate,它的數(shù)據(jù)比對(duì)系統(tǒng),只能進(jìn)行存在主鍵的基表的一致性檢測(cè),這就限制了數(shù)據(jù)復(fù)制中一致性檢測(cè)的適用范圍。為了滿足要求,需要人工給進(jìn)行比較的基表增加主鍵,這對(duì)于源數(shù)據(jù)庫(kù)的業(yè)務(wù)系統(tǒng)可能造成性能和功能上的影響。
由此可見(jiàn),為了盡可能減少對(duì)于業(yè)務(wù)系統(tǒng)的影響,需要設(shè)計(jì)一種檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的系統(tǒng)及方法,適用于數(shù)據(jù)復(fù)制系統(tǒng)。
技術(shù)實(shí)現(xiàn)要素:
為克服現(xiàn)有技術(shù)存在的缺陷,本發(fā)明提供一種檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的系統(tǒng)及方法。
本發(fā)明解決其技術(shù)問(wèn)題所采用的技術(shù)方案是:
設(shè)計(jì)一種檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的系統(tǒng),包括始端數(shù)據(jù)代理AGENT、終端數(shù)據(jù)代理AGENT及數(shù)據(jù)校驗(yàn)VERI,所述始端數(shù)據(jù)代理AGENT、終端數(shù)據(jù)代理AGENT用于獲取對(duì)比數(shù)據(jù)集、計(jì)算MD5跳表、三路快速排序、管理MD5跳表,所述數(shù)據(jù)校驗(yàn)VERI用于對(duì)比數(shù)據(jù)并生成對(duì)比報(bào)告;還包括被檢測(cè)的數(shù)據(jù)庫(kù)同步系統(tǒng)、源數(shù)據(jù)庫(kù)、目的數(shù)據(jù)庫(kù);所述始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別從源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)獲取待檢測(cè)的最新版本表數(shù)據(jù)并計(jì)算出MD5摘要值,所述數(shù)據(jù)校驗(yàn)VERI接收始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT發(fā)送的數(shù)據(jù)包并進(jìn)行分塊、排序、與MD5跳表比對(duì)以檢測(cè)源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)的一致性。
在上述方案中,所述始端數(shù)據(jù)代理AGENT、終端數(shù)據(jù)代理AGENT為服務(wù)程序。
在上述方案中,所述數(shù)據(jù)包包含ROWID和MD5摘要值。
本發(fā)明還提供一種檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的方法,包括以下步驟:
步驟S010,始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別從源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)獲取待檢測(cè)的最新版本表數(shù)據(jù)后計(jì)算出MD5摘要值;
步驟S020,數(shù)據(jù)校驗(yàn)VERI接收始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT發(fā)送的數(shù)據(jù)包;
步驟S030,數(shù)據(jù)校驗(yàn)VERI對(duì)數(shù)據(jù)包進(jìn)行分塊、排序,并與MD5跳表比對(duì)。
在上述步驟S010中,包括以下步驟:
步驟S010-1,始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別在源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)上執(zhí)行數(shù)據(jù)查詢;
步驟S010-2,始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別計(jì)算MD5摘要值;
步驟S010-3,始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別將ROWID、MD5摘要值填充在數(shù)據(jù)包中發(fā)送給數(shù)據(jù)校驗(yàn)VERI,其中始端數(shù)據(jù)代理AGENT發(fā)送的數(shù)據(jù)包放置于左列表,終端數(shù)據(jù)代理AGENT發(fā)送的數(shù)據(jù)包放置于右列表。
在上述步驟S030中,設(shè)置兩個(gè)變量left_over和right_over管理左列表和右列表,left_over初始化為FALSE,right_over初始化為FALSE,數(shù)據(jù)校驗(yàn)VERI對(duì)數(shù)據(jù)包的排序包括以下步驟:
步驟S031-1,若left_over為T(mén)RUE,轉(zhuǎn)至步驟S031-4,否則從左列表取出一個(gè)數(shù)據(jù)包,放到左排序內(nèi)存中;
步驟S031-2,重復(fù)步驟S031-1直到左排序內(nèi)存無(wú)法放入完整數(shù)據(jù)包,或者已經(jīng)到達(dá)左列表最后一個(gè)數(shù)據(jù)包;
步驟S031-3,將左排序內(nèi)存的數(shù)據(jù)包進(jìn)行排序,排序結(jié)果寫(xiě)入文件中,文件名由系統(tǒng)自動(dòng)生成,如果取到最后一個(gè)數(shù)據(jù)包,標(biāo)記left_over為T(mén)RUE,轉(zhuǎn)至步驟S031-1繼續(xù)處理左列表;
步驟S031-4,若right_over為T(mén)RUE,轉(zhuǎn)至步驟S031-7,否則從右列表取出一個(gè)數(shù)據(jù)包,放到右排序內(nèi)存中;
步驟S031-5,重復(fù)步驟S031-4直到右排序內(nèi)存無(wú)法放入完整數(shù)據(jù)包,或者已經(jīng)到達(dá)右列表最后一個(gè)數(shù)據(jù)包;
步驟S031-6,將右排序內(nèi)存的數(shù)據(jù)包進(jìn)行排序,排序結(jié)果寫(xiě)入文件,文件名系統(tǒng)自動(dòng)生成,如果取到最后一個(gè)排序結(jié)果包,標(biāo)記right_over=TRUE,轉(zhuǎn)至步驟S031-4繼續(xù)處理右列表;
步驟S031-7,若left_over為T(mén)RUE且right_over為T(mén)RUE,排序結(jié)束,否則轉(zhuǎn)至步驟S031-1。
在上述步驟S030中,數(shù)據(jù)校驗(yàn)VERI對(duì)數(shù)據(jù)包的比對(duì)包括以下步驟:
步驟S032-1,左排序內(nèi)存生成的排序文件由左skiplist管理,右排序內(nèi)存生成的排序文件由右skiplist管理,從每個(gè)排序文件中取出固定數(shù)量的記錄初始化左skiplist和右skiplist,代表每個(gè)排序文件中初始化的MD5值數(shù)據(jù);
步驟S032-2,從左skiplist取出最小元素L,從右skiplist取出最小元素R;
步驟S032-3,根據(jù)MD5值,比較L和R;
步驟S032-4,如果L>R或者L為空、R非空,則R的ROWID放置到DELETE文件中,從R所在的排序文件中取下一個(gè)記錄放入右skiplist,從右skiplist取出最小元素存放到R,轉(zhuǎn)至步驟S032-3;
步驟S032-5,如果L=R并且L與R非空,從L所在的排序文件中取下一個(gè)記錄放入左skiplist,從R所在的排序文件中取下一個(gè)記錄放入右skiplist,直至已經(jīng)取完排序文件的記錄,轉(zhuǎn)至步驟S032-2;
步驟S032-6,如果L<R或者L非空、R為空,則將L的ROWID放置到結(jié)果文件夾的INSERT文件中,從L所在的排序文件中取下一個(gè)記錄放入左skiplist,從左skiplist取出最小元素存放到L,轉(zhuǎn)至步驟S032-3;
步驟S032-7,如果L與R均為空,算法結(jié)束;如果INSERT文件和DELETE文件均為空,則源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)一致,否則將INSERT文件中的數(shù)據(jù)插入到目的數(shù)據(jù)庫(kù),然后從目的數(shù)據(jù)庫(kù)刪除DELETE文件中的數(shù)據(jù)。
實(shí)施本發(fā)明檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的系統(tǒng)及方法,具有以下有益效果:
本發(fā)明利用MD5跳表檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性,減少需要比對(duì)的數(shù)據(jù)量,并避免數(shù)據(jù)表必須存在主鍵的限制條件;利用MD5跳表管理比對(duì)數(shù)據(jù),避免在無(wú)主鍵基表可能存在大量相同數(shù)據(jù)記錄情況下比對(duì)算法性能退化的情形。
附圖說(shuō)明
下面將結(jié)合附圖及實(shí)施例對(duì)本發(fā)明作進(jìn)一步說(shuō)明,附圖中:
圖1為檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的系統(tǒng)的結(jié)構(gòu)示意圖;
圖2為始端數(shù)據(jù)代理AGENT、終端數(shù)據(jù)代理AGENT的工作流程示意圖;
圖3為檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的方法的工作流程示意圖。
具體實(shí)施方式
為了對(duì)本發(fā)明的技術(shù)特征、目的和效果有更加清楚的理解,現(xiàn)對(duì)照附圖詳細(xì)說(shuō)明本發(fā)明的具體實(shí)施方式。
如圖1所示,本發(fā)明檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的系統(tǒng),包括始端數(shù)據(jù)代理AGENT、終端數(shù)據(jù)代理AGENT及數(shù)據(jù)校驗(yàn)VERI,始端數(shù)據(jù)代理AGENT、終端數(shù)據(jù)代理AGENT用于獲取對(duì)比數(shù)據(jù)集、計(jì)算MD5跳表、三路快速排序、管理MD5跳表,數(shù)據(jù)校驗(yàn)VERI用于對(duì)比數(shù)據(jù)并生成對(duì)比報(bào)告;還包括被檢測(cè)的數(shù)據(jù)庫(kù)同步系統(tǒng)、源數(shù)據(jù)庫(kù)、目的數(shù)據(jù)庫(kù);始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別從源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)獲取待檢測(cè)的最新版本表數(shù)據(jù)并計(jì)算出MD5摘要值,數(shù)據(jù)校驗(yàn)VERI接收始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT發(fā)送的數(shù)據(jù)包并進(jìn)行分塊、排序、與MD5跳表比對(duì)以檢測(cè)源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)的一致性。其中,始端數(shù)據(jù)代理AGENT、終端數(shù)據(jù)代理AGENT為服務(wù)程序;數(shù)據(jù)包包含ROWID和MD5摘要值。
如圖2-3所示,本發(fā)明還提供一種檢測(cè)無(wú)主鍵數(shù)據(jù)表一致性的方法,包括以下步驟:
步驟S010,始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別從源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)獲取待檢測(cè)的最新版本表數(shù)據(jù)后計(jì)算出MD5摘要值。步驟S010具體包括以下步驟:
步驟S010-1,始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別在源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)上執(zhí)行數(shù)據(jù)查詢;
步驟S010-2,始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別計(jì)算MD5摘要值;
步驟S010-3,始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT分別將ROWID、MD5摘要值填充在數(shù)據(jù)包中發(fā)送給數(shù)據(jù)校驗(yàn)VERI,其中始端數(shù)據(jù)代理AGENT發(fā)送的數(shù)據(jù)包放置于左列表,終端數(shù)據(jù)代理AGENT發(fā)送的數(shù)據(jù)包放置于右列表。
步驟S020,數(shù)據(jù)校驗(yàn)VERI接收始端數(shù)據(jù)代理AGENT和終端數(shù)據(jù)代理AGENT發(fā)送的數(shù)據(jù)包;
步驟S030,數(shù)據(jù)校驗(yàn)VERI對(duì)數(shù)據(jù)包進(jìn)行分塊、排序,并與MD5跳表比對(duì)。
在上述步驟S030中,設(shè)置兩個(gè)變量left_over和right_over管理左列表和右列表,left_over初始化為FALSE,right_over初始化為FALSE,數(shù)據(jù)校驗(yàn)VERI對(duì)數(shù)據(jù)包的排序包括以下步驟:
步驟S031-1,若left_over為T(mén)RUE,轉(zhuǎn)至步驟S031-4,否則從左列表取出一個(gè)數(shù)據(jù)包,放到左排序內(nèi)存中;
步驟S031-2,重復(fù)步驟S031-1直到左排序內(nèi)存無(wú)法放入完整數(shù)據(jù)包,或者已經(jīng)到達(dá)左列表最后一個(gè)數(shù)據(jù)包;
步驟S031-3,將左排序內(nèi)存的數(shù)據(jù)包進(jìn)行排序,排序結(jié)果寫(xiě)入文件中,文件名由系統(tǒng)自動(dòng)生成,如果取到最后一個(gè)數(shù)據(jù)包,標(biāo)記left_over為T(mén)RUE,轉(zhuǎn)至步驟S031-1繼續(xù)處理左列表;
步驟S031-4,若right_over為T(mén)RUE,轉(zhuǎn)至步驟S031-7,否則從右列表取出一個(gè)數(shù)據(jù)包,放到右排序內(nèi)存中;
步驟S031-5,重復(fù)步驟S031-4直到右排序內(nèi)存無(wú)法放入完整數(shù)據(jù)包,或者已經(jīng)到達(dá)右列表最后一個(gè)數(shù)據(jù)包;
步驟S031-6,將右排序內(nèi)存的數(shù)據(jù)包進(jìn)行排序,排序結(jié)果寫(xiě)入文件,文件名系統(tǒng)自動(dòng)生成,如果取到最后一個(gè)排序結(jié)果包,標(biāo)記right_over=TRUE,轉(zhuǎn)至步驟S031-4繼續(xù)處理右列表;
步驟S031-7,若left_over為T(mén)RUE且right_over為T(mén)RUE,排序結(jié)束,否則轉(zhuǎn)至步驟S031-1。
在上述步驟S030中,數(shù)據(jù)校驗(yàn)VERI對(duì)數(shù)據(jù)包的比對(duì)包括以下步驟:
步驟S032-1,左排序內(nèi)存生成的排序文件由左skiplist管理,右排序內(nèi)存生成的排序文件由右skiplist管理,從每個(gè)排序文件中取出固定數(shù)量的記錄初始化左skiplist和右skiplist,代表每個(gè)排序文件中初始化的MD5值數(shù)據(jù);
步驟S032-2,從左skiplist取出最小元素L,從右skiplist取出最小元素R;
步驟S032-3,根據(jù)MD5值,比較L和R;
步驟S032-4,如果L>R或者L為空、R非空,則R的ROWID放置到DELETE文件中,從R所在的排序文件中取下一個(gè)記錄放入右skiplist,從右skiplist取出最小元素存放到R,轉(zhuǎn)至步驟S032-3;
步驟S032-5,如果L=R并且L與R非空,從L所在的排序文件中取下一個(gè)記錄放入左skiplist,從R所在的排序文件中取下一個(gè)記錄放入右skiplist,直至已經(jīng)取完排序文件的記錄,轉(zhuǎn)至步驟S032-2;
步驟S032-6,如果L<R或者L非空、R為空,則將L的ROWID放置到結(jié)果文件夾的INSERT文件中,從L所在的排序文件中取下一個(gè)記錄放入左skiplist,從左skiplist取出最小元素存放到L,轉(zhuǎn)至步驟S032-3;
步驟S032-7,如果L與R均為空,算法結(jié)束;如果INSERT文件和DELETE文件均為空,則源數(shù)據(jù)庫(kù)和目的數(shù)據(jù)庫(kù)一致,否則將INSERT文件中的數(shù)據(jù)插入到目的數(shù)據(jù)庫(kù),然后從目的數(shù)據(jù)庫(kù)刪除DELETE文件中的數(shù)據(jù)。
上面結(jié)合附圖對(duì)本發(fā)明的實(shí)施例進(jìn)行了描述,但是本發(fā)明并不局限于上述的具體實(shí)施方式,上述的具體實(shí)施方式僅僅是示意性的,而不是限制性的,本領(lǐng)域的普通技術(shù)人員在本發(fā)明的啟示下,在不脫離本發(fā)明宗旨和權(quán)利要求所保護(hù)的范圍情況下,還可做出很多形式,這些均屬于本發(fā)明的保護(hù)之內(nèi)。