本發(fā)明涉及一種數(shù)據(jù)庫數(shù)據(jù)內(nèi)容高速比對方法,屬于數(shù)據(jù)庫數(shù)據(jù)復(fù)制技術(shù)領(lǐng)域。
背景技術(shù):
隨著信息技術(shù)的深入發(fā)展,應(yīng)用系統(tǒng)的不斷升級(jí),系統(tǒng)之間的集成貫通越來越多的需要數(shù)據(jù)交互,數(shù)據(jù)復(fù)制已經(jīng)逐步成為了信息系統(tǒng)融合的關(guān)鍵部分。然而,所有針對數(shù)據(jù)復(fù)制與交互都包含著一個(gè)基本的要求——源端與目標(biāo)端數(shù)據(jù)復(fù)制一致,數(shù)據(jù)庫數(shù)據(jù)內(nèi)容比對技術(shù)正是在這種要求下產(chǎn)生的。國內(nèi)外關(guān)系型數(shù)據(jù)庫數(shù)據(jù)比對技術(shù)主要采用串行數(shù)據(jù)比較的方法實(shí)現(xiàn)兩端數(shù)據(jù)比對,此類比對方法在面對海量數(shù)據(jù)時(shí),不能較好的解決數(shù)據(jù)庫數(shù)據(jù)比對效率問題,嚴(yán)重影響用戶體驗(yàn)。
技術(shù)實(shí)現(xiàn)要素:
為了解決上述技術(shù)問題,本發(fā)明提供了一種數(shù)據(jù)庫數(shù)據(jù)內(nèi)容高速比對方法。
為了達(dá)到上述目的,本發(fā)明所采用的技術(shù)方案是:
一種數(shù)據(jù)庫數(shù)據(jù)內(nèi)容高速比對方法,包括以下步驟,
獲取數(shù)據(jù)庫源表和目標(biāo)表,分別對源表和目標(biāo)表中的數(shù)據(jù)排序;
獲取源表中最小主鍵字段a和最大主鍵字段b,獲取目標(biāo)表中最小主鍵字段c和最大主鍵字段d;
根據(jù)a、b、c、d的大小,定義若干個(gè)區(qū)間,根據(jù)各條數(shù)據(jù)主鍵字段的大小,對源表和目標(biāo)表中的數(shù)據(jù)進(jìn)行區(qū)間劃分;
比較同一區(qū)間內(nèi)源表和目標(biāo)表中的數(shù)據(jù)。
區(qū)間的劃分如下,
當(dāng)a≤c、b≤d,則定義的區(qū)間為[a,c]、[c,b]、[b,d];根據(jù)各條數(shù)據(jù)主鍵字段的大小,源表中的數(shù)據(jù)被劃分成[a,c]和[c,b]兩個(gè)區(qū)間,目標(biāo)表中的數(shù)據(jù)被劃分成[b,d]和[c,b]兩個(gè)區(qū)間;
當(dāng)a≤c、b≥d,則定義的區(qū)間為[a,c]、[c,d]、[d,b];根據(jù)各條數(shù)據(jù)主鍵字段的大小,源表中的數(shù)據(jù)被劃分成[a,c]、[c,d]和[d,b]三個(gè)區(qū)間,目標(biāo)表中的數(shù)據(jù)被劃分成[c,d]一個(gè)區(qū)間;
當(dāng)a≥c、b≤d,則定義的區(qū)間為[c,a]、[a,b]、[b,d];根據(jù)各條數(shù)據(jù)主鍵字段的大小,源表中的數(shù)據(jù)被劃分成[a,b]一個(gè)區(qū)間,目標(biāo)表中的數(shù)據(jù)被劃分成[c,a]、[a,b]和[b,d]三個(gè)區(qū)間;
當(dāng)a≥c、b≥d,則定義的區(qū)間為[c,a]、[a,d]、[d,b];根據(jù)各條數(shù)據(jù)主鍵字段的大小,源表中的數(shù)據(jù)被劃分成[a,d]和[d,b]二個(gè)區(qū)間,目標(biāo)表中的數(shù)據(jù)被劃分成[c,a]和[a,d]二個(gè)區(qū)間。
比較同一區(qū)間內(nèi)源表和目標(biāo)表中數(shù)據(jù)的過程為,
s41,分別獲取源表和目標(biāo)表中的一條數(shù)據(jù);
s42,判斷兩條數(shù)據(jù)是否全部為空,如果是,則結(jié)束;如果不是則轉(zhuǎn)至s43;
s43,判斷兩條數(shù)據(jù)是否全部不為空,如果是,則依次進(jìn)行主鍵字段比較和非主鍵字段比較,如果從源表獲取的數(shù)據(jù)為空,則判定目標(biāo)表數(shù)據(jù)大于源表數(shù)據(jù),分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù),轉(zhuǎn)至步驟s42,如果從目標(biāo)表獲取的數(shù)據(jù)為空,則判定源表數(shù)據(jù)大于目標(biāo)表數(shù)據(jù),分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù),轉(zhuǎn)至步驟s42。
主鍵字段比較的過程為,
比較兩條數(shù)據(jù)的主鍵字段類型,如果類型不相同,則判定兩條數(shù)據(jù)不相等,如果是相同類型,則進(jìn)行主鍵字段內(nèi)容比較,具體日下:
當(dāng)源表數(shù)據(jù)主鍵字段內(nèi)容大于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,判定源表數(shù)據(jù)大于目標(biāo)表數(shù)據(jù),分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較;
當(dāng)源表數(shù)據(jù)主鍵字段內(nèi)容小于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,判定源表數(shù)據(jù)小于目標(biāo)表數(shù)據(jù),分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較;
當(dāng)源表數(shù)據(jù)主鍵字段內(nèi)容等于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,進(jìn)行非主鍵字段比較。
非主鍵字段比較的過程為,
比較兩條數(shù)據(jù)的非主鍵字段類型,如果類型不相同,則判定兩條數(shù)據(jù)不相等,如果是相同類型,則進(jìn)行非主鍵字段內(nèi)容比較,具體日下:
當(dāng)源表數(shù)據(jù)非主鍵字段內(nèi)容大于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,判定源表數(shù)據(jù)大于目標(biāo)表數(shù)據(jù),分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較;
當(dāng)源表數(shù)據(jù)非主鍵字段內(nèi)容小于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,判定源表數(shù)據(jù)小于目標(biāo)表數(shù)據(jù),分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較;
當(dāng)源表數(shù)據(jù)非主鍵字段內(nèi)容等于目標(biāo)表數(shù)據(jù)非主鍵字段內(nèi)容,判定兩條數(shù)據(jù)相等,分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較。
比較過程可在預(yù)先定義的比較器內(nèi)進(jìn)行,比較器的大小根據(jù)實(shí)際計(jì)算資源、存儲(chǔ)資源配置情況動(dòng)態(tài)調(diào)整。
本發(fā)明所達(dá)到的有益效果:本發(fā)明通過對源端與目標(biāo)端數(shù)據(jù)的批量提取并對數(shù)據(jù)分區(qū)批量比對,從而較快速的完成數(shù)據(jù)庫兩端數(shù)據(jù)比對;通過該方法可以快速高效的比對兩端數(shù)據(jù)差異,強(qiáng)化數(shù)據(jù)一致性檢查手段,可以對數(shù)據(jù)復(fù)制過程中產(chǎn)生的不一致及時(shí)做出調(diào)整,對確保數(shù)據(jù)庫的安全穩(wěn)定的運(yùn)行,具有重要的實(shí)際意義。
附圖說明
圖1為本發(fā)明的流程圖;
圖2為數(shù)據(jù)對比的流程圖;
圖3為數(shù)據(jù)對比的架構(gòu)圖。
具體實(shí)施方式
下面結(jié)合附圖對本發(fā)明作進(jìn)一步描述。以下實(shí)施例僅用于更加清楚地說明本發(fā)明的技術(shù)方案,而不能以此來限制本發(fā)明的保護(hù)范圍。
如圖1所示,一種數(shù)據(jù)庫數(shù)據(jù)內(nèi)容高速比對方法,包括以下步驟:
步驟1,獲取數(shù)據(jù)庫源表和目標(biāo)表,分別對源表和目標(biāo)表中的數(shù)據(jù)排序。
具體過程為:
s11,檢查數(shù)據(jù)庫源表與目標(biāo)表是否有主鍵,如果沒有則通過添加附加日志的方式增加主鍵;
s12,采用jdbc或者odbc等方式獲取數(shù)據(jù)庫源表與目標(biāo)表;
s13,采用執(zhí)行sql排序或者自定義排序的方式對數(shù)據(jù)排序。
步驟2,獲取源表中最小主鍵字段a和最大主鍵字段b,獲取目標(biāo)表中最小主鍵字段c和最大主鍵字段d。
步驟3,根據(jù)a、b、c、d的大小,定義若干個(gè)區(qū)間,根據(jù)各條數(shù)據(jù)主鍵字段的大小,對源表和目標(biāo)表中的數(shù)據(jù)進(jìn)行區(qū)間劃分。
具體如下:
當(dāng)a≤c、b≤d,則定義的區(qū)間為[a,c]、[c,b]、[b,d];源表中的數(shù)據(jù)被劃分成[a,c]和[c,b]兩個(gè)區(qū)間,目標(biāo)表中的數(shù)據(jù)被劃分成[b,d]和[c,b]兩個(gè)區(qū)間;
當(dāng)a≤c、b≥d,則定義的區(qū)間為[a,c]、[c,d]、[d,b];源表中的數(shù)據(jù)被劃分成[a,c]、[c,d]和[d,b]三個(gè)區(qū)間,目標(biāo)表中的數(shù)據(jù)被劃分成[c,d]一個(gè)區(qū)間;
當(dāng)a≥c、b≤d,則定義的區(qū)間為[c,a]、[a,b]、[b,d];源表中的數(shù)據(jù)被劃分成[a,b]一個(gè)區(qū)間,目標(biāo)表中的數(shù)據(jù)被劃分成[c,a]、[a,b]和[b,d]三個(gè)區(qū)間;
當(dāng)a≥c、b≥d,則定義的區(qū)間為[c,a]、[a,d]、[d,b];源表中的數(shù)據(jù)被劃分成[a,d]和[d,b]二個(gè)區(qū)間,目標(biāo)表中的數(shù)據(jù)被劃分成[c,a]和[a,d]二個(gè)區(qū)間。
步驟4,比較同一區(qū)間內(nèi)源表和目標(biāo)表中的數(shù)據(jù),位于不同區(qū)間的則認(rèn)為數(shù)據(jù)不同。
根據(jù)上述劃分,當(dāng)a≤c、b≤d時(shí),比較[c,b]區(qū)間內(nèi)源表和目標(biāo)表中的數(shù)據(jù);當(dāng)a≤c、b≥d時(shí),比較[c,d]區(qū)間內(nèi)源表和目標(biāo)表中的數(shù)據(jù);當(dāng)a≥c、b≤d時(shí),比較[a,b]區(qū)間內(nèi)源表和目標(biāo)表中的數(shù)據(jù);當(dāng)a≥c、b≥d時(shí),比較[a,d]區(qū)間內(nèi)源表和目標(biāo)表中的數(shù)據(jù)。
如圖2所示,比較過程如下:
s41,分別獲取源表和目標(biāo)表中的一條數(shù)據(jù)(圖中rowsource為源表數(shù)據(jù),rowtarget為目標(biāo)表數(shù)據(jù));
s42,判斷兩條數(shù)據(jù)是否全部為空,如果是,則結(jié)束;如果不是則轉(zhuǎn)至s43;
s43,判斷兩條數(shù)據(jù)是否全部不為空,如果是,則依次進(jìn)行主鍵字段比較和非主鍵字段比較,如果從源表獲取的數(shù)據(jù)為空,則判定目標(biāo)表數(shù)據(jù)大于源表數(shù)據(jù),分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù),轉(zhuǎn)至步驟s42,如果從目標(biāo)表獲取的數(shù)據(jù)為空,則判定源表數(shù)據(jù)大于目標(biāo)表數(shù)據(jù),分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù),轉(zhuǎn)至步驟s42。
其中,主鍵字段比較的過程為:
比較兩條數(shù)據(jù)的主鍵字段類型,如果類型不相同,則判定兩條數(shù)據(jù)不相等,如果是相同類型,則進(jìn)行主鍵字段內(nèi)容比較,具體日下:
當(dāng)源表數(shù)據(jù)主鍵字段內(nèi)容大于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,判定源表數(shù)據(jù)大于目標(biāo)表數(shù)據(jù),返回1,分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較;
當(dāng)源表數(shù)據(jù)主鍵字段內(nèi)容小于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,判定源表數(shù)據(jù)小于目標(biāo)表數(shù)據(jù),返回-1,分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較;
當(dāng)源表數(shù)據(jù)主鍵字段內(nèi)容等于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,返回0,進(jìn)行非主鍵字段比較。
非主鍵字段比較的過程為:
比較兩條數(shù)據(jù)的非主鍵字段類型,如果類型不相同,則判定兩條數(shù)據(jù)不相等,如果是相同類型,則進(jìn)行非主鍵字段內(nèi)容比較,具體日下:
當(dāng)源表數(shù)據(jù)非主鍵字段內(nèi)容大于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,判定源表數(shù)據(jù)大于目標(biāo)表數(shù)據(jù),返回1,分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較;
當(dāng)源表數(shù)據(jù)非主鍵字段內(nèi)容小于目標(biāo)表數(shù)據(jù)主鍵字段內(nèi)容,判定源表數(shù)據(jù)小于目標(biāo)表數(shù)據(jù),返回-1,分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較;
當(dāng)源表數(shù)據(jù)非主鍵字段內(nèi)容等于目標(biāo)表數(shù)據(jù)非主鍵字段內(nèi)容,判定兩條數(shù)據(jù)相等,返回-0,分別獲取源表和目標(biāo)表中的下一條數(shù)據(jù)進(jìn)行比較。
上述的比較過程可在預(yù)先定義的比較器內(nèi)進(jìn)行,對數(shù)據(jù)進(jìn)行比較,比較器的大小根據(jù)實(shí)際計(jì)算資源、存儲(chǔ)資源配置情況動(dòng)態(tài)調(diào)整;比較器可采用java、c/c++等編程語言自帶的比較函數(shù),也可以采用重寫比較方法實(shí)現(xiàn)數(shù)據(jù)比對。
上述方法的原理如圖3所示,通過對源端與目標(biāo)端數(shù)據(jù)的提取,對數(shù)據(jù)分區(qū)比對,從而較快速的完成數(shù)據(jù)庫兩端數(shù)據(jù)比對;通過該方法可以快速高效的比對兩端數(shù)據(jù)差異,強(qiáng)化數(shù)據(jù)一致性檢查手段,可以對數(shù)據(jù)復(fù)制過程中產(chǎn)生的不一致及時(shí)做出調(diào)整,對確保數(shù)據(jù)庫的安全穩(wěn)定的運(yùn)行,具有重要的實(shí)際意義。
以上所述僅是本發(fā)明的優(yōu)選實(shí)施方式,應(yīng)當(dāng)指出,對于本技術(shù)領(lǐng)域的普通技術(shù)人員來說,在不脫離本發(fā)明技術(shù)原理的前提下,還可以做出若干改進(jìn)和變形,這些改進(jìn)和變形也應(yīng)視為本發(fā)明的保護(hù)范圍。