劉娟娟 劉帥
摘 要:為解決當(dāng)前分布式系統(tǒng)中多數(shù)據(jù)源、多異構(gòu)數(shù)據(jù)庫問題,針對(duì)現(xiàn)有的數(shù)據(jù)庫同步方案在實(shí)際應(yīng)用中所暴露出的資源損耗大、可移植性差、應(yīng)用范圍窄等問題,在分析了現(xiàn)有的數(shù)據(jù)同步技術(shù)的各自優(yōu)缺點(diǎn)的基礎(chǔ)上,提出了采用Sql plus和Merge語句相結(jié)合的數(shù)據(jù)庫同步方案,并對(duì)數(shù)據(jù)同步的系統(tǒng)進(jìn)行了設(shè)計(jì),最后通過功能比較和性能分析,該方案在資源損耗、可移植性、應(yīng)用范圍等方面更具優(yōu)勢(shì)。
關(guān)鍵詞:數(shù)據(jù)同步;數(shù)據(jù)轉(zhuǎn)換;數(shù)據(jù)復(fù)制
中圖分類號(hào):TP311.132 文獻(xiàn)標(biāo)識(shí)碼:A
1 引言(Introduction)
近年來在信息技術(shù)飛速發(fā)展的帶領(lǐng)下,各行業(yè)對(duì)信息管理技術(shù)都逐漸步入深層次的運(yùn)用階段,各個(gè)單位面臨的環(huán)境越來越復(fù)雜,由于各個(gè)行業(yè)的市場(chǎng)發(fā)展和擴(kuò)張,越來越多的單位都邁入了跨區(qū)分布式經(jīng)營(yíng)的行列,而與單位分布式經(jīng)營(yíng)相呼應(yīng)的結(jié)果就是產(chǎn)生了分布式數(shù)據(jù)存儲(chǔ)環(huán)境[1]。并且現(xiàn)代信息技術(shù)的發(fā)展是日新月異的,當(dāng)前正在使用的很多信息系統(tǒng)在不同的時(shí)期使用不同技術(shù)進(jìn)行開發(fā),而且又由不同的團(tuán)隊(duì)各自進(jìn)行設(shè)計(jì),使得這些系統(tǒng)的平臺(tái)往往呈現(xiàn)出異構(gòu)性,導(dǎo)致了現(xiàn)有數(shù)據(jù)的差異性。為保證當(dāng)前使用的各個(gè)信息系統(tǒng)之間數(shù)據(jù)交換的暢通,保障各個(gè)系統(tǒng)之間數(shù)據(jù)傳輸中的安全性及一致性,真正實(shí)現(xiàn)數(shù)據(jù)共享,避免出現(xiàn)數(shù)據(jù)孤島。因此,如何及時(shí)有效地處理這些異構(gòu)數(shù)據(jù)庫中的數(shù)據(jù)成為一個(gè)頗受關(guān)注的研究問題。
為解決當(dāng)前多應(yīng)用系統(tǒng)中使用Sql Server、Oracle等多異構(gòu)分布式數(shù)據(jù)庫的數(shù)據(jù)集成、合并等問題,結(jié)合使用異構(gòu)數(shù)據(jù)庫數(shù)據(jù)合并技術(shù),實(shí)現(xiàn)源數(shù)據(jù)庫Sql Server、Oracle和目標(biāo)數(shù)據(jù)庫Oracle的數(shù)據(jù)同步。另外其常常涉及還包括Access、DB2、MYSql等數(shù)據(jù)庫。
2 數(shù)據(jù)庫同步技術(shù)解析(Analysis of database synchronization technology)
2.1 媒介同步技術(shù)
媒介同步技術(shù)是一種20世紀(jì)后期存在的數(shù)據(jù)同步技術(shù)。其原理是把需要更新的數(shù)據(jù)拷貝到如硬件磁盤等媒介中,通過專用信息通道發(fā)送到需要數(shù)據(jù)同步的區(qū)域,再由目的區(qū)域管理員進(jìn)行新增數(shù)據(jù)的添加與更新[2]。本方法由于更新的時(shí)間長(zhǎng)效率慢等特性,已不再使用。
2.2 發(fā)布/訂閱同步技術(shù)
Sql Server的發(fā)布/訂閱是一種單對(duì)多的依賴關(guān)系備份的機(jī)制,是多個(gè)訂閱數(shù)據(jù)庫監(jiān)聽數(shù)據(jù)源數(shù)據(jù)庫的變更,當(dāng)源數(shù)據(jù)庫數(shù)據(jù)發(fā)生變更時(shí)通知訂閱它的數(shù)據(jù)庫進(jìn)行數(shù)據(jù)同步變更,通過該機(jī)制實(shí)現(xiàn)整個(gè)過程不用代碼編寫。其本質(zhì)是生成源數(shù)據(jù)庫的快照,是Sql Server多數(shù)據(jù)庫間保持?jǐn)?shù)據(jù)變更同步一種方案。在發(fā)布/訂閱中,各個(gè)訂閱數(shù)據(jù)庫采取異步方式來被數(shù)據(jù)同步,也就是當(dāng)源數(shù)據(jù)庫數(shù)據(jù)發(fā)生變更的同時(shí),訂閱數(shù)據(jù)庫要無條件的服從源數(shù)據(jù)庫的數(shù)據(jù)操作并同步完成數(shù)據(jù)變更。
在實(shí)際應(yīng)用中,從專業(yè)的角度來分析,發(fā)布/訂閱技術(shù)存在如下缺陷:
(1)同步雙方的表結(jié)構(gòu)不能更改,并且表結(jié)構(gòu)必須一致,一旦發(fā)布方數(shù)據(jù)庫表結(jié)構(gòu)發(fā)生更改需要重新生成數(shù)據(jù)庫快照。
(2)對(duì)于大數(shù)據(jù)量的同步缺乏可靠的保證,其中主要原因是大數(shù)據(jù)量的數(shù)據(jù)同步過程中不具備可靠的通信鏈路,造成訂閱數(shù)據(jù)庫與源數(shù)據(jù)庫之間數(shù)據(jù)傳輸延時(shí)問題,同時(shí)會(huì)致使有效數(shù)據(jù)嚴(yán)重丟失,最終造成數(shù)據(jù)同步失敗。
(3)源數(shù)據(jù)庫在發(fā)布過程中若設(shè)置為指定時(shí)間廣播發(fā)送同步消息,無論訂閱數(shù)據(jù)庫是否收到消息,源數(shù)據(jù)庫發(fā)送后便終止嘗試發(fā)送,其無法保證訂閱數(shù)據(jù)庫及時(shí)有效的進(jìn)行數(shù)據(jù)同步。
2.3 復(fù)制同步技術(shù)
數(shù)據(jù)復(fù)制同步是指:數(shù)據(jù)必須實(shí)時(shí),如果不是實(shí)時(shí),那只能叫異步數(shù)據(jù)遷移;數(shù)據(jù)必須保證其準(zhǔn)確性,同步端接受的同步數(shù)據(jù)必須保證數(shù)據(jù)的唯一性;復(fù)制的數(shù)據(jù)可實(shí)時(shí)在線查詢;數(shù)據(jù)庫源數(shù)據(jù)不能被更改,其具有獨(dú)立性;復(fù)制過程中具有監(jiān)控機(jī)制。
在具備以上條件的由兩個(gè)及以上數(shù)據(jù)庫平臺(tái)在進(jìn)行數(shù)據(jù)庫復(fù)制的整個(gè)程序,將源數(shù)據(jù)庫中發(fā)生變化的需要復(fù)制的數(shù)據(jù)通過網(wǎng)絡(luò)發(fā)送給同步端需要數(shù)據(jù)變更的數(shù)據(jù)庫中,使得分布式系統(tǒng)得以實(shí)現(xiàn)數(shù)據(jù)同步,數(shù)據(jù)復(fù)制的整個(gè)過程是解決分布式系統(tǒng)數(shù)據(jù)同步的基礎(chǔ)組成部分。
當(dāng)前數(shù)據(jù)復(fù)制技術(shù)在各個(gè)企業(yè)信息管理平臺(tái)下應(yīng)用較為廣泛,其中Oracle數(shù)據(jù)庫中的DATAGUARD完全免費(fèi)并且支持?jǐn)嚯娎m(xù)傳,但在使用過程中需要打開歸檔模式并且寬帶傳輸要求比較高,并且對(duì)目的數(shù)據(jù)庫跟源數(shù)據(jù)庫的操作系統(tǒng)跟軟件版本有一定限制;還有支持Oracle、DB2等傳統(tǒng)關(guān)系型數(shù)據(jù)庫的HVR技術(shù),支持異構(gòu)數(shù)據(jù)庫,可實(shí)現(xiàn)一對(duì)多、多對(duì)一等復(fù)雜情況處理,但是需要單獨(dú)收費(fèi)。
上述兩種比較具體的數(shù)據(jù)復(fù)制技術(shù)在具體應(yīng)用過程中都有一定的局限性,選擇一種免費(fèi)的安全性,以及穩(wěn)定性較高的復(fù)制技術(shù)是實(shí)現(xiàn)數(shù)據(jù)同步的關(guān)鍵,本文結(jié)合Sql plus和Merge語句實(shí)現(xiàn)數(shù)據(jù)同步應(yīng)運(yùn)而生。
3 數(shù)據(jù)復(fù)制的變更數(shù)據(jù)捕捉方式(Data copy change data capture method)
變更數(shù)據(jù)捕捉是為了獲取自上次數(shù)據(jù)同步后需要同步的源數(shù)據(jù)庫中的數(shù)據(jù)表進(jìn)行插入、更新和刪除等活動(dòng)需要變更的數(shù)據(jù)。變更數(shù)據(jù)是源數(shù)據(jù)庫中信息發(fā)生改變的數(shù)據(jù),變更的數(shù)據(jù)主要包括當(dāng)前變更數(shù)據(jù)的映像或者變化序列,還包括詳細(xì)的控制信息來保證數(shù)據(jù)差異性產(chǎn)生后的監(jiān)測(cè)與解決[3]。
2010年以來,使用次數(shù)比較多的數(shù)據(jù)捕獲方法包括基于數(shù)據(jù)日志法、基于觸發(fā)器法、基于API法、影子表法和控制變化法等幾種,結(jié)合不同方法實(shí)現(xiàn)過程中的不同原理介紹如下。
3.1 基于數(shù)據(jù)日志法
在數(shù)據(jù)庫操作過程中數(shù)據(jù)庫日志記錄了數(shù)據(jù)庫中對(duì)數(shù)據(jù)表進(jìn)行增、刪、改等操作信息,作為維護(hù)數(shù)據(jù)庫中數(shù)據(jù)信息的依據(jù)。它包含對(duì)數(shù)據(jù)庫中數(shù)據(jù)表增、刪、改等操作中100%正確的具體數(shù)據(jù)變更序列和數(shù)據(jù)操作信息,因此,可以把數(shù)據(jù)庫日志作為數(shù)據(jù)庫恢復(fù)以及維護(hù)數(shù)據(jù)完整性的重要工具。
基于數(shù)據(jù)庫日志的變更數(shù)據(jù)捕捉方法就是通過分析源數(shù)據(jù)庫日志中的操作和被操作的數(shù)據(jù)來確定復(fù)制對(duì)象的變化序列[1]。基于數(shù)據(jù)日志法的捕捉流程,如圖1所示。
基于數(shù)據(jù)日志法的好處在于它對(duì)任何類型的數(shù)據(jù)庫復(fù)制都適用,因?yàn)楫?dāng)前多個(gè)數(shù)據(jù)庫平臺(tái)都擁有日志文件,使用數(shù)據(jù)庫日志文件作為數(shù)據(jù)同步的基本方式,其優(yōu)點(diǎn)表現(xiàn)在耗費(fèi)極少的系統(tǒng)資源,并且更加方便快捷。但本方法也存在一些缺點(diǎn):在具體應(yīng)用中有些數(shù)據(jù)庫系統(tǒng)為保證其軟件的安全性而沒有向第三方公布其日志的存儲(chǔ)格式,使得要開發(fā)一個(gè)基于日志的變化捕捉的程序非常困難,除非在具體開發(fā)過程中向數(shù)據(jù)庫廠家索取相應(yīng)日志存儲(chǔ)格式以及日志文件相應(yīng)操作接口;為解決異構(gòu)數(shù)據(jù)庫數(shù)據(jù)復(fù)制問題,其數(shù)據(jù)模式、數(shù)據(jù)類型等方面有著不同的操作方式,還需要對(duì)通過系統(tǒng)日志提取出來的變化操作信息進(jìn)行一些處理。Oracle、MySql、Sql Server等主要數(shù)據(jù)庫廠商都使用的是基于日志的捕捉方法進(jìn)行數(shù)據(jù)復(fù)制。
3.2 基于觸發(fā)器法
基于觸發(fā)器法是在源數(shù)據(jù)庫中建立觸發(fā)器,實(shí)時(shí)監(jiān)控源數(shù)據(jù)庫中數(shù)據(jù)表的insert、delete、update等操作,當(dāng)對(duì)源數(shù)據(jù)對(duì)象進(jìn)行insert、delete、update操作時(shí),觸發(fā)器將變化的數(shù)據(jù)表中的數(shù)據(jù)序列提取出來。其捕捉流程,如圖2所示。
基于觸發(fā)器法的優(yōu)點(diǎn)是Sql Server、Oracle等主流數(shù)據(jù)庫軟件都可以使用觸發(fā)器,并且在捕獲數(shù)據(jù)變化過程中耗時(shí)少有較高的應(yīng)用效率。但是使用觸發(fā)器捕捉變更數(shù)據(jù)的缺點(diǎn)是消耗操作系統(tǒng)物理資源比較大,在具體項(xiàng)目實(shí)現(xiàn)過程中相對(duì)較為復(fù)雜的邏輯業(yè)務(wù),使用觸發(fā)器過程中管理不便,并且當(dāng)前項(xiàng)目使用的數(shù)據(jù)庫系統(tǒng)若不支持觸發(fā)器,則觸發(fā)器復(fù)制方法失效。
3.3 基于API法
基于API法是解決當(dāng)前開發(fā)系統(tǒng)中使用的有些不具有觸發(fā)器接口和日志管理機(jī)制的非關(guān)系型等數(shù)據(jù)庫不能同步問題[3]。其在系統(tǒng)平臺(tái)和數(shù)據(jù)庫之間引入中間件,通過API中間件實(shí)現(xiàn)具有類似觸發(fā)器或者日志管理機(jī)制相似功能[4]。在項(xiàng)目具體開發(fā)過程中中間件的具體使用包括記錄需要復(fù)制的數(shù)據(jù)對(duì)象的變化序列,并且根據(jù)變化序列操作相應(yīng)數(shù)據(jù)庫的數(shù)據(jù)表從而完成數(shù)據(jù)復(fù)制的功能,基于API法的捕捉流程,如圖3所示。
在具體使用過程中,基于API法的優(yōu)點(diǎn)是使用的系統(tǒng)資源基本不足1%,并且可以根據(jù)需求與絕大多數(shù)復(fù)制數(shù)據(jù)類型相互匹配;它還是有一定的不足,其表現(xiàn)在不能記錄源數(shù)據(jù)庫的操作過程,例如使用數(shù)據(jù)操縱語言在CMD命令行中進(jìn)行新增,更新,刪除操作時(shí)所造成的數(shù)據(jù)變更,API無法監(jiān)控到,除此之外在使用API法操作海量級(jí)數(shù)據(jù)復(fù)制過程中,由于數(shù)據(jù)處理的邏輯性較高,可能會(huì)造成程序運(yùn)行效率低下[4]。
3.4 影子表法
影子表法是在數(shù)據(jù)庫初始化時(shí)為需要操作的對(duì)象表(T)建立與之相對(duì)應(yīng)的影子表(S),其原理是在時(shí)間節(jié)點(diǎn)A時(shí)刻記錄一份對(duì)象表(T)的數(shù)據(jù)并且將其存儲(chǔ)進(jìn)影子表(S),對(duì)象表(T)操作完成后的時(shí)間節(jié)點(diǎn)B時(shí)刻將對(duì)象表(T)與影子表(S)進(jìn)行內(nèi)容對(duì)比獲取增量數(shù)據(jù)內(nèi)容用于目的數(shù)據(jù)庫進(jìn)行數(shù)據(jù)復(fù)制[5]?;谟白颖矸ǖ牟蹲搅鞒?,如圖4所示。
基于影子表法能基于任何一個(gè)數(shù)據(jù)庫完成,并且程序只需編寫一次便可以在多種系統(tǒng)平臺(tái)下運(yùn)行。其程序運(yùn)行消耗是使用很低的管理成本和與對(duì)象表一樣的存儲(chǔ)空間即可,具體操作過程中其傳輸?shù)臄?shù)據(jù)只是增量,具有較高的工作效率。但是這種方式的缺陷是得到的僅僅是發(fā)生變化的增量數(shù)據(jù),而沒有記錄下中間操作過程的信息,故不能提供足夠的控制信息用以完成數(shù)據(jù)回滾。
以上四種變化捕捉方式機(jī)制和資源等的比較,詳見表1。
4 跨平臺(tái)Oracle數(shù)據(jù)庫同步設(shè)計(jì)方案(Cross platform Oracle database synchronization design)
本論文研究的是在分布式異構(gòu)數(shù)據(jù)庫環(huán)境下,由系統(tǒng)管理員啟動(dòng)此同步程序,從而將省局的Linux服務(wù)器中下的Oracle數(shù)據(jù)庫中的數(shù)據(jù)單向同步到Windows服務(wù)器下的Oracle數(shù)據(jù)庫中。若數(shù)據(jù)有變更,只更新變更數(shù)據(jù),如圖5所示。
結(jié)合此系統(tǒng)的背景和需求,該系統(tǒng)要實(shí)現(xiàn)的同步過程的目標(biāo)包括:
(1)高效快捷:系統(tǒng)中涉及險(xiǎn)情等信息,在緊急情況下,省級(jí)數(shù)據(jù)庫數(shù)據(jù)要能通過系統(tǒng)立即更新到Windows數(shù)據(jù)庫中,故該同步應(yīng)能保證在即時(shí)狀態(tài)下實(shí)現(xiàn)省中心數(shù)據(jù)庫與Windows數(shù)據(jù)庫的數(shù)據(jù)的一致。
(2)查看方便:能反映出同步狀況,提供一個(gè)便于查看和分析的方式。
(3)準(zhǔn)確無誤:應(yīng)能確保數(shù)據(jù)傳輸結(jié)果的正確性。
(4)安全可靠:此系統(tǒng)是數(shù)據(jù)管理部門對(duì)整個(gè)數(shù)據(jù)管理過程中所有資料數(shù)據(jù)進(jìn)行管理的重要工具,因此在系統(tǒng)的設(shè)計(jì)、開發(fā)中必須重視系統(tǒng)的安全性和可靠性。
具體實(shí)施步驟如下:
步驟一:在Linux服務(wù)器上的Oracle數(shù)據(jù)庫創(chuàng)建用戶并賦予權(quán)限,如圖6所示。
步驟二:在Windows服務(wù)器上的Oracle數(shù)據(jù)庫創(chuàng)建DBlink,如圖7所示。
步驟三:調(diào)用web服務(wù)器相應(yīng)數(shù)據(jù)同步函數(shù)進(jìn)行同步操作,如圖8所示。
步驟四:web服務(wù)器通過調(diào)用Sql plus程序處理相應(yīng)表的*.sql文件,如圖9所示。
通過以上步驟實(shí)現(xiàn)了跨平臺(tái)Orale數(shù)據(jù)庫的數(shù)據(jù)同步功能其在數(shù)據(jù)捕獲上的具體性能,詳見表2。
5 結(jié)論(Conclusion)
本文描述了以J2EE為平臺(tái)對(duì)跨平臺(tái)Oracle數(shù)據(jù)庫的同步模塊的具體實(shí)現(xiàn)方法。其采用Sql plus動(dòng)態(tài)調(diào)用Merge語句來作為變更數(shù)據(jù)的捕捉方式。這種方式靈活易實(shí)現(xiàn),對(duì)模塊進(jìn)行測(cè)試后得出該模塊能保證數(shù)據(jù)的準(zhǔn)確傳輸,并且對(duì)復(fù)制對(duì)象的表可進(jìn)行自定義,但是也存在一定的局限性就是web服務(wù)器上必須安裝有Sql plus客戶端。
參考文獻(xiàn)(References)
[1] 覃章榮,張軍洲,諸葛雋.基于Web Service的異構(gòu)數(shù)據(jù)庫同步系統(tǒng)設(shè)計(jì)與實(shí)現(xiàn)[J].計(jì)算機(jī)技術(shù)與發(fā)展,2009,19(12):221-224.
[2] 劉瀟,邵定宏.基于多代理的異構(gòu)數(shù)據(jù)庫轉(zhuǎn)換系統(tǒng)的實(shí)現(xiàn)[J].化工自動(dòng)化及儀表,2012(04):518-520.
[3] 傅穎勛,羅圣美,舒繼武.一種云存儲(chǔ)環(huán)境下的安全網(wǎng)盤系統(tǒng)[J].軟件學(xué)報(bào),2014,25(08):1831-1843.
[4] 李林,等.田間數(shù)據(jù)傳輸同步策略與中間件研究[J].農(nóng)業(yè)機(jī)械學(xué)報(bào),2016,47(1):279-288.
[5] 鮑愛華,等.基于哈希樹的分布式目錄同步方法[J].解放軍理工大學(xué)學(xué)報(bào),2013,14(6):608-616.
作者簡(jiǎn)介:
劉娟娟(1983-),女,本科,助理工程師.研究領(lǐng)域:軟件開發(fā).
劉 帥(1983-),男,本科,副高級(jí)工程師.研究領(lǐng)域:軟件開發(fā).