專利名稱:一種主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法及裝置的制作方法
技術(shù)領(lǐng)域:
本發(fā)明屬于數(shù)據(jù)同步技術(shù)領(lǐng)域,尤其涉及一種主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn) 方法及裝置。
背景技術(shù):
隨著電信技術(shù)的發(fā)展,電信網(wǎng)管系統(tǒng)需要提供越來越多的新業(yè)務(wù)和新功能,與此 同時,網(wǎng)管服務(wù)器機器以及網(wǎng)管服務(wù)器本身的壓力也越來越大,經(jīng)常會出現(xiàn)網(wǎng)管服務(wù)器機 器拓機或網(wǎng)管服務(wù)器進程跑死的現(xiàn)象。為了使網(wǎng)管服務(wù)器在上述異常情況發(fā)生后能在短時 間內(nèi)重新提供服務(wù),提出了網(wǎng)管服務(wù)器備份的方案,即部署一臺備用機器運行網(wǎng)管服務(wù)器 的備份程序,這里稱之為備機,當(dāng)當(dāng)前提供網(wǎng)管功能和業(yè)務(wù)的網(wǎng)管服務(wù)器出現(xiàn)異常不能繼 續(xù)工作后,馬上切換到備機,備機在短時間內(nèi)接管主機的資源,并對外提供業(yè)務(wù)支持。要實現(xiàn)網(wǎng)管服務(wù)器的備份,最主要的工作就是要保證主備網(wǎng)管系統(tǒng)中數(shù)據(jù)庫數(shù)據(jù) 的一致,即數(shù)據(jù)庫的同步。目前網(wǎng)管服務(wù)器基本都是通過獨立于服務(wù)器本身的數(shù)據(jù)庫同步 工具實現(xiàn)數(shù)據(jù)庫同步,同步的過程也不是基于服務(wù)器生成的數(shù)據(jù)庫操作信息。因此現(xiàn)有技 術(shù)中主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)需要配備專用的數(shù)據(jù)庫同步工具來實現(xiàn),增加了網(wǎng) 管服務(wù)器備份操作的成本。
發(fā)明內(nèi)容
本發(fā)明要解決的技術(shù)問題是提供一種主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法及裝 置,不需要專用的數(shù)據(jù)庫同步工具即能實現(xiàn)主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫的準(zhǔn)實時同步。為解決上述技術(shù)問題,本發(fā)明主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法包括如下步 驟數(shù)據(jù)庫操作攔截步驟,該步驟用于利用主機數(shù)據(jù)庫應(yīng)用代碼層提供的標(biāo)準(zhǔn)接口攔 截主機數(shù)據(jù)庫的操作信息;操作日志生成步驟,該步驟用于基于所述攔截的數(shù)據(jù)庫操作信息,生成主機的數(shù) 據(jù)庫操作日志;操作日志傳輸步驟,該步驟用于將所述主機的數(shù)據(jù)庫操作日志傳輸給備機;操作日志入庫步驟,該步驟用于根據(jù)備機收到的所述數(shù)據(jù)庫操作日志執(zhí)行備機數(shù) 據(jù)庫同步寫入。進一步地,在操作日志生成步驟中,所述生成的主機數(shù)據(jù)庫操作日志是基于事務(wù) 劃分的數(shù)據(jù)庫操作日志。更進一步地,所述基于事務(wù)劃分?jǐn)?shù)據(jù)庫操作日志的策略包括如果是基于在事務(wù)中獲取的數(shù)據(jù)庫連接來生成所述主機數(shù)據(jù)庫操作日志,則采用 從事務(wù)管理容器中獲取的全局事務(wù)號來唯一標(biāo)識該數(shù)據(jù)庫事務(wù);如果是基于不在事務(wù)中獲取的數(shù)據(jù)庫連接來生成所述主機數(shù)據(jù)庫操作日志,則采 用數(shù)據(jù)庫連接編號與對應(yīng)于同一個數(shù)據(jù)庫連接的提交或回滾次數(shù)序號的組合來唯一標(biāo)識該數(shù)據(jù)庫事務(wù)。再進一步地,在操作日志入庫步驟中,所述根據(jù)備機收到的所述數(shù)據(jù)庫操作日志 執(zhí)行備機數(shù)據(jù)庫同步寫入的方案包括對于各條所述數(shù)據(jù)庫操作日志,如果其存在全局事務(wù)號,則以該全局事務(wù)號作為 其數(shù)據(jù)庫事務(wù)標(biāo)識,如果其不存在全局事務(wù)號,則以數(shù)據(jù)庫連接編號與對應(yīng)于同一個數(shù)據(jù) 庫連接的提交或回滾次數(shù)序號的組合作為其數(shù)據(jù)庫事務(wù)標(biāo)識;為各個正在執(zhí)行的數(shù)據(jù)庫事務(wù)均創(chuàng)建一個連接池,該連接池的結(jié)構(gòu)為數(shù)據(jù)源名稱 到該數(shù)據(jù)源對應(yīng)的數(shù)據(jù)庫連接的映射;對于各條所述數(shù)據(jù)庫操作日志,根據(jù)其所述數(shù)據(jù)庫事務(wù)標(biāo)識取出對應(yīng)的所述數(shù)據(jù) 庫連接池,然后根據(jù)該條數(shù)據(jù)庫操作日志中的數(shù)據(jù)源名稱取出對應(yīng)于該數(shù)據(jù)源的數(shù)據(jù)庫連 接,最后通過該數(shù)據(jù)庫連接執(zhí)行數(shù)據(jù)庫操作日志的入庫,即根據(jù)備機收到的所述數(shù)據(jù)庫操 作日志執(zhí)行備機數(shù)據(jù)庫同步寫入。又進一步地,為提高數(shù)據(jù)庫同步的效率,本發(fā)明方法采用多同步任務(wù)并發(fā)執(zhí)行的 方式來執(zhí)行主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步。為解決上述技術(shù)問題,本發(fā)明主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置包括數(shù)據(jù)庫操作攔截模塊,該模塊用于利用主機數(shù)據(jù)庫應(yīng)用代碼層提供的標(biāo)準(zhǔn)接口攔 截主機數(shù)據(jù)庫的操作信息;操作日志生成模塊,該模塊用于基于所述攔截的數(shù)據(jù)庫操作信息,生成主機的數(shù) 據(jù)庫操作日志;操作日志傳輸模塊,該模塊用于將所述主機的數(shù)據(jù)庫操作日志傳輸給備機;操作日志入庫模塊,該模塊用于根據(jù)備機收到的所述數(shù)據(jù)庫操作日志執(zhí)行備機數(shù) 據(jù)庫同步寫入。進一步地,所述攔截的主機數(shù)據(jù)庫操作信息包括執(zhí)行存儲過程的操作信息和更新 數(shù)據(jù)庫數(shù)據(jù)的操作信息。進一步地,所述利用主機數(shù)據(jù)庫應(yīng)用代碼層提供的標(biāo)準(zhǔn)接口攔截主機數(shù)據(jù)庫的操 作信息的具體方案包括通過包裝模式將數(shù)據(jù)庫應(yīng)用代碼需要獲取的數(shù)據(jù)庫連接進行基于接口的包裝,然 后再交由數(shù)據(jù)庫應(yīng)用代碼執(zhí)行相應(yīng)的數(shù)據(jù)庫操作,即能實現(xiàn)對主機數(shù)據(jù)庫操作的攔截。進一步地,為了能夠劃分?jǐn)?shù)據(jù)庫操作的事務(wù)并能在備機解析入庫時能正確地獲取 數(shù)據(jù)源對應(yīng)的數(shù)據(jù)庫連接,所述基于攔截的數(shù)據(jù)庫操作信息,生成的所述主機數(shù)據(jù)庫操作 日志是基于事務(wù)劃分的數(shù)據(jù)庫操作日志。更進一步地,所述基于事務(wù)劃分?jǐn)?shù)據(jù)庫操作日志的策略包括如果是基于在事務(wù)中獲取的數(shù)據(jù)庫連接來生成所述主機數(shù)據(jù)庫操作日志,則采用 從事務(wù)管理容器中獲取的全局事務(wù)號(GlcAal ID)來唯一標(biāo)識該數(shù)據(jù)庫事務(wù);如果是基于不在事務(wù)中獲取的數(shù)據(jù)庫連接來生成所述主機數(shù)據(jù)庫操作日志,則采 用數(shù)據(jù)庫連接編號(Connection ID)和對應(yīng)于同一個數(shù)據(jù)庫連接的提交或回滾次數(shù)序號 ((Group ID)的組合來唯一標(biāo)識該數(shù)據(jù)庫事務(wù),即采用Connection ID+Group ID的組合來 唯一標(biāo)識該數(shù)據(jù)庫事務(wù)。再進一步地,所述操作日志入庫模塊包括數(shù)據(jù)庫事務(wù)標(biāo)識確定子模塊、連接池創(chuàng)建子模塊和入庫執(zhí)行子模塊;其中,所述數(shù)據(jù)庫事務(wù)標(biāo)識確定子模塊用于對于各條所述數(shù)據(jù)庫操作日志,如果 其存在全局事務(wù)號Global ID,則以該全局事務(wù)號作為其數(shù)據(jù)庫事務(wù)標(biāo)識,如果其不存在全 局事務(wù)號,則以數(shù)據(jù)庫連接編號與對應(yīng)于同一個數(shù)據(jù)庫連接的提交或回滾次數(shù)序號的組合 作為其數(shù)據(jù)庫事務(wù)標(biāo)識;所述連接池創(chuàng)建子模塊用于為各個正在執(zhí)行的數(shù)據(jù)庫事務(wù)均創(chuàng)建一個連接池, 該連接池的結(jié)構(gòu)為數(shù)據(jù)源名稱到該數(shù)據(jù)源對應(yīng)的數(shù)據(jù)庫連接的映射;所述入庫執(zhí)行子模塊用于對于各條所述數(shù)據(jù)庫操作日志,根據(jù)其所述數(shù)據(jù)庫事 務(wù)標(biāo)識取出對應(yīng)的所述數(shù)據(jù)庫連接池,然后根據(jù)該條數(shù)據(jù)庫操作日志中的數(shù)據(jù)源名稱取出 對應(yīng)于該數(shù)據(jù)源的數(shù)據(jù)庫連接,最后通過該數(shù)據(jù)庫連接執(zhí)行數(shù)據(jù)庫操作日志的入庫。進一步地,所述操作日志傳輸模塊在將所述主機的數(shù)據(jù)庫操作日志傳輸給備機 時,采用了主備機之間的消息傳輸成功確認(rèn)機制,以保證將所述主機的數(shù)據(jù)庫操作日志正 確傳輸給備機。本發(fā)明的有益效果為本發(fā)明利用主機數(shù)據(jù)庫應(yīng)用代碼層提供的標(biāo)準(zhǔn)接口攔截主機數(shù)據(jù)庫的操作信息, 并根據(jù)攔截的主機數(shù)據(jù)庫操作信息生成基于事務(wù)劃分的數(shù)據(jù)庫操作日志,并將數(shù)據(jù)庫操作 日志發(fā)送到備機,供備機實現(xiàn)這些數(shù)據(jù)庫操作日志的入庫操作,因此本發(fā)明主、備網(wǎng)管系統(tǒng) 數(shù)據(jù)庫同步的實現(xiàn)方法及裝置,不需要專用的數(shù)據(jù)庫同步工具即能實現(xiàn)主、備網(wǎng)管系統(tǒng)數(shù) 據(jù)庫的準(zhǔn)實時同步,節(jié)省了主、備網(wǎng)管系統(tǒng)備份操作的費用,并且本發(fā)明還具有實施簡便, 易于推廣使用的特點。
圖1是本發(fā)明主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法流程示意圖;圖2是數(shù)據(jù)庫操作日志傳輸鏈路建鏈過程示意圖;圖3是本發(fā)明主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置結(jié)構(gòu)示意圖。
具體實施例方式下面結(jié)合附圖和具體實施方式
對本發(fā)明作進一步詳細(xì)說明。在目前的網(wǎng)管系統(tǒng)中,對數(shù)據(jù)庫的訪問都是通過標(biāo)準(zhǔn)的數(shù)據(jù)庫訪問接口,而這些 接口的實現(xiàn)則是由各數(shù)據(jù)庫廠商提供。以JDBCCJava Data BaseConnectivity, java數(shù)據(jù) 庫連接)接 口禾口 JBoss (—種 J2EE(Java 2Platform, Enterprise Edition, Java2 平臺企 業(yè)版)服務(wù)器)為例,當(dāng)數(shù)據(jù)庫應(yīng)用代碼想要訪問數(shù)據(jù)庫時,首先通過JBoss的Jca(J2EE Connectorarchitecture,J2EE連接器架構(gòu))獲取數(shù)據(jù)庫連接接口實現(xiàn),然后再執(zhí)行數(shù)據(jù)庫 訪問或操作,并且,從Jca返回給數(shù)據(jù)庫應(yīng)用代碼的依然是JDBC的標(biāo)準(zhǔn)數(shù)據(jù)庫接口,也就是 說具體的實現(xiàn)對數(shù)據(jù)庫應(yīng)用代碼是透明的,因此可以考慮在Jca返回的連接上通過包裝模 式再封裝一層實現(xiàn)數(shù)據(jù)庫操作攔截和日志記錄的實現(xiàn),以獲取在數(shù)據(jù)庫備份時必須的數(shù)據(jù) 庫操作信息。另一方面,數(shù)據(jù)庫操作和事務(wù)是密不可分的,因此需要在包裝的數(shù)據(jù)庫連接中 準(zhǔn)確地劃分出數(shù)據(jù)庫事務(wù)。本發(fā)明首先攔截數(shù)據(jù)庫操作信息并生成、記錄基于事務(wù)的數(shù)據(jù)庫操作日志,然后將數(shù)據(jù)庫操作日志傳遞到備機并在備機上解析數(shù)據(jù)庫操作日志,最終執(zhí)行增量入數(shù)據(jù)庫操 作,以實現(xiàn)數(shù)據(jù)庫之間的準(zhǔn)實時同步。圖1是本發(fā)明主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法流程示意圖,為便于說明,本 發(fā)明實施例中引入了數(shù)據(jù)庫操作攔截、數(shù)據(jù)庫日志記錄組件,主機數(shù)據(jù)庫日志傳輸組件,備 機數(shù)據(jù)庫日志接收組件以及數(shù)據(jù)庫分析入庫組件的概念。如圖1所示,本發(fā)明主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法流程包括主機1、數(shù)據(jù)庫操作攔截、數(shù)據(jù)庫日志記錄組件截獲存儲過程執(zhí)行或增、刪、改數(shù)據(jù)的 SQL (Structured Query Language,結(jié)構(gòu)化查i旬i吾言)i吾句執(zhí);2、數(shù)據(jù)庫操作攔截、數(shù)據(jù)庫日志記錄組件基于截獲到的SQL語句或者存儲過程生 成數(shù)據(jù)庫操作日志;3、數(shù)據(jù)庫操作攔截、數(shù)據(jù)庫日志記錄組件將數(shù)據(jù)庫操作日志記錄到與數(shù)據(jù)庫日志 傳輸組件約定的日志文件中;4、在攔截數(shù)據(jù)庫操作和記錄數(shù)據(jù)庫操作日志之后,向被包裝的數(shù)據(jù)庫連接透明傳 遞數(shù)據(jù)庫操作,這樣不會影響應(yīng)用代碼的執(zhí)行;5、主機數(shù)據(jù)庫日志傳輸組件從與數(shù)據(jù)庫操作攔截、數(shù)據(jù)庫日志記錄組件約定的日 志文件中讀取數(shù)據(jù)庫操作日志,并將這些日志逐條傳給備機數(shù)據(jù)庫日志接收組件。備機1、備機數(shù)據(jù)庫日志接收組件接收來自主機的數(shù)據(jù)庫操作日志,并將操作日志寫入 與數(shù)據(jù)庫分析入庫組件約定好的文件中;2、數(shù)據(jù)庫分析入庫組件從與數(shù)據(jù)庫日志接收組件約定好的文件讀取數(shù)據(jù)庫操作 日志;3、數(shù)據(jù)庫分析入庫組件分析讀取的每條數(shù)據(jù)庫操作日志,并按數(shù)據(jù)庫事務(wù)劃分這 些日志;4、數(shù)據(jù)庫分析入庫組件按事務(wù)執(zhí)行數(shù)據(jù)庫入庫操作。下面對本發(fā)明的各個環(huán)節(jié)進行進一步闡述。一、數(shù)據(jù)庫操作的攔截一般情況下數(shù)據(jù)庫應(yīng)用代碼都是通過接口的方式獲取數(shù)據(jù)庫連接,本發(fā)明通過包 裝模式將數(shù)據(jù)庫應(yīng)用代碼需要獲取的數(shù)據(jù)庫連接進行基于接口的包裝后再交由應(yīng)用代碼 執(zhí)行相應(yīng)的數(shù)據(jù)庫操作,包裝的目的是為了攔截數(shù)據(jù)庫,并且應(yīng)用代碼獲取的數(shù)據(jù)庫連接 依然是接口的方式,這樣就不會影響到應(yīng)用代碼。應(yīng)用代碼執(zhí)行的數(shù)據(jù)庫操作可以分為兩種最終可以轉(zhuǎn)換為SQL語句執(zhí)行的數(shù) 據(jù)庫操作和執(zhí)行存儲過程的數(shù)據(jù)庫操作,對于執(zhí)行存儲過程的數(shù)據(jù)庫操作,全部攔截,而對 于執(zhí)行SQL語句數(shù)據(jù)庫操作,由于查詢操作不會影響數(shù)據(jù)庫中的數(shù)據(jù),所以只需要攔截增、 刪、改這三種更新數(shù)據(jù)庫數(shù)據(jù)的操作。 二、生成基于事務(wù)的數(shù)據(jù)庫操作日志 為了能夠劃分?jǐn)?shù)據(jù)庫操作的事務(wù)并能在備機解析入庫時能正確的獲取數(shù)據(jù)源對 應(yīng)的數(shù)據(jù)庫連接,在記錄數(shù)據(jù)庫操作日志時,除了執(zhí)行的SQL語句或儲存過程需要記錄之 外,還需要記錄其他相關(guān)內(nèi)容,例如數(shù)據(jù)源名稱。
從有沒有事務(wù)控制的角度,數(shù)據(jù)庫連接可以劃分為兩類,下面分別介紹這兩類數(shù) 據(jù)庫連接如何生成基于事務(wù)的數(shù)據(jù)庫操作日志。(一 )在事務(wù)中獲取的數(shù)據(jù)庫連接數(shù)據(jù)庫應(yīng)用代碼一般都會有自己的事務(wù)機制,比如很多企業(yè)級應(yīng)用服務(wù)器都提供 了事務(wù)管理容器來管理數(shù)據(jù)庫事務(wù)。對于這些存在于事務(wù)當(dāng)中的數(shù)據(jù)庫操作,本發(fā)明在包 裝數(shù)據(jù)庫連接時,先從事務(wù)管理容器中獲取全局事務(wù)號GlcAallD,然后將Global ID保存 在包裝后的數(shù)據(jù)庫連接中,對于包含多個數(shù)據(jù)庫連接并且各個數(shù)據(jù)庫連接可能對應(yīng)不同數(shù) 據(jù)源的數(shù)據(jù)庫事務(wù),因此在每個數(shù)據(jù)庫連接中都保存Global ID。這樣,不論一個事務(wù)包含 多少個不同的數(shù)據(jù)庫連接,對應(yīng)多少個不同的數(shù)據(jù)源,都只需要通過保存在各個數(shù)據(jù)庫連 接中的Global ID就能夠唯一標(biāo)識這個數(shù)據(jù)庫事務(wù)。( 二)不在事務(wù)中獲取的數(shù)據(jù)庫連接對于不是在事務(wù)中獲取的數(shù)據(jù)庫連接,可以針對同一個數(shù)據(jù)庫連接的提交或回 滾操作來劃分?jǐn)?shù)據(jù)庫事務(wù)。同時,由于一個數(shù)據(jù)庫連接可能被多次用于數(shù)據(jù)庫操作的執(zhí) 行,所以對于這類數(shù)據(jù)庫連接需要在包裝過后的數(shù)據(jù)庫連接中保存該數(shù)據(jù)庫連接編號 Connection ID和該數(shù)據(jù)庫連接執(zhí)行提交或回滾操作的次數(shù)Group ID,每執(zhí)行一次提交或 回滾操作,Group ID加1,這樣,只需要通過Connection ID+Group ID的組合就能夠唯一標(biāo) 識一個數(shù)據(jù)庫事務(wù)。在記錄數(shù)據(jù)庫操作日志時,是把這些日志記錄到各組件約定的文件中,這種10操 作可能會很耗時,如果單線程執(zhí)行,就有可能影響數(shù)據(jù)庫應(yīng)用代碼的效率。本發(fā)明實施例 中通過生產(chǎn)者-消費者模式優(yōu)化數(shù)據(jù)庫操作日志的記錄生產(chǎn)者線程將攔截到的數(shù)據(jù)庫操 作日志寫入指定的隊列中,同時消費者線程從該隊列中讀取數(shù)據(jù)庫操作日志并將這些日志 記錄到文件中,這種策略對數(shù)據(jù)庫應(yīng)用代碼效率的影響就變得非常的小,甚至可以忽略。同 時,由于使用隊列作為保存數(shù)據(jù)庫操作日志的中間介質(zhì),能夠保證在文件中記錄的數(shù)據(jù)庫 操作日志和攔截到的數(shù)據(jù)庫操作日志順序完全一致,這樣就能夠避免在備機執(zhí)行這些數(shù)據(jù) 庫操作時由于SQL或存儲過程執(zhí)行順序不一致而造成的執(zhí)行失敗。三、主機將數(shù)據(jù)庫操作日志傳輸?shù)絺錂C數(shù)據(jù)庫操作日志從主機到備機的傳輸是整個數(shù)據(jù)庫同步中很重要的一個環(huán)節(jié),為 了使在主機執(zhí)行的數(shù)據(jù)庫操作在備機也能正確的執(zhí)行,必須保證數(shù)據(jù)庫傳輸日志在主備機 之間傳輸?shù)恼_性。影響數(shù)據(jù)庫操作日志正確傳輸?shù)囊蛩睾芏?,包括主機數(shù)據(jù)庫日志傳輸組件未啟動 或不能正常工作,備機數(shù)據(jù)庫日志接收組件未啟動或不能正常工作,主備機之間通信鏈路 不通或通信鏈路不穩(wěn)定、經(jīng)常出現(xiàn)鏈路瞬間斷開的情況等,總的說來就是不能建立穩(wěn)定的 主備機之間數(shù)據(jù)庫操作日志傳輸鏈路,對于這些情況,本發(fā)明通過主備機之間的消息確認(rèn) 機制加以解決,下面詳細(xì)描述主備機數(shù)據(jù)庫操作日志傳輸鏈路的建立以及數(shù)據(jù)庫操作日志 的可靠傳輸。(一 )備機作為建立數(shù)據(jù)庫操作日志傳輸鏈路的服務(wù)端;( 二)主機作為建立數(shù)據(jù)庫操作日志傳輸鏈路的客戶端;(三)備機在指定的端口上監(jiān)聽來自于主機的建鏈請求,主機不斷嘗試和備機建 鏈,當(dāng)鏈路建立成功以后主備機之間開始發(fā)送、接收數(shù)據(jù)庫操作日志以及確認(rèn)消息,并同時在主備機之間發(fā)送心跳消息,如果心跳握手失敗,則說明主備機之間的網(wǎng)絡(luò)不通或?qū)Ψ讲?能正常工作,此時便主動關(guān)閉傳輸鏈路,同時如果是主機就重新嘗試向備機發(fā)送建鏈請求, 如果是備機則繼續(xù)監(jiān)聽來自于主機的建鏈請求,直到數(shù)據(jù)庫日志傳輸鏈路再次建立成功;對于備機返回給主機的數(shù)據(jù)庫操作日志接收確認(rèn)信息,如果針對每條數(shù)據(jù)庫操作 日志備機都生成一條確認(rèn)信息返回給主機,同時,主機向備機發(fā)送一條數(shù)據(jù)庫操作日志后 要等待直到備機返回確認(rèn)信息再向備機發(fā)送下一條數(shù)據(jù)庫操作日志,那就相當(dāng)于將數(shù)據(jù)庫 傳輸鏈路的吞吐量增加了一倍,加上主機等待確認(rèn)消息的時間,數(shù)據(jù)庫操作日志的傳輸效 率很可能會減半。因此本發(fā)明采用下面的策略實現(xiàn)主備機之間數(shù)據(jù)庫操作日志的傳輸以及 傳輸確認(rèn)。1、主機數(shù)據(jù)庫操作攔截、數(shù)據(jù)庫日志記錄組件分文件記錄數(shù)據(jù)庫操作日志,主機 的數(shù)據(jù)庫操作日志傳輸組件和主機數(shù)據(jù)庫操作攔截、數(shù)據(jù)庫日志記錄組件約定日志記錄文 件的下列內(nèi)容文件名格式統(tǒng)一的前綴+文件序號;文件的行數(shù)約定固定的行數(shù);文件序號一個文件記滿固定的行數(shù)以后,將文件序號加1后以文件名格式生成 下一個日志記錄文件。2、主機數(shù)據(jù)庫操作日志傳輸組件向備機數(shù)據(jù)庫操作日志接收組件發(fā)送數(shù)據(jù)庫操 作日志時,加上下列內(nèi)容日志文件序號、日志在文件中的行號這兩個信息能夠唯一標(biāo)識一條數(shù)據(jù)庫操作 日志;請求刪除文件序號對應(yīng)的日志文件標(biāo)識如果傳輸?shù)郊s定的行數(shù)則該標(biāo)識設(shè)置為 真(true),否則為假(false)。3、備機的數(shù)據(jù)庫操作日志接收組件收到一條數(shù)據(jù)庫操作日志之后,從日志中解析 出日志文件序號、日志在文件中的行號、請求刪除文件序號對應(yīng)的日志文件標(biāo)識三個信息, 并且將日志文件序號、日志在文件中的行號更新到持久化的介質(zhì)中作為成功接收的最后一 條數(shù)據(jù)庫操作日志記錄標(biāo)識,便于主備建鏈時讀取。同時,如果檢測到請求刪除文件序號對 應(yīng)的日志文件標(biāo)識為true,那備機就將文件序號返回給主機,主機收到以后刪除該文件序 號對應(yīng)的數(shù)據(jù)庫操作日志文件。4、備機收到主機的數(shù)據(jù)庫操作日志傳輸鏈路建鏈請求之后,讀取已經(jīng)接收到的最 后一條數(shù)據(jù)庫操作日志的標(biāo)識(日志文件序號+日志在文件中的行號),并將該標(biāo)識返回給 主機,主機通過日志文件序號、日志在文件中的行號這兩條信息,定位到下一條需要傳輸?shù)?數(shù)據(jù)庫操作日志并開始傳輸,建鏈過程如圖2所示。通過上面的傳輸鏈路建立策略和數(shù)據(jù)庫操作日志傳輸和確認(rèn)策略,能夠取得如下 的效果及時刪除已經(jīng)確認(rèn)傳輸完成的數(shù)據(jù)庫日志文件,從而防止占用太多磁盤空間;主 備機之間的請求、響應(yīng)機制防止了數(shù)據(jù)庫操作日志文件的誤刪除;建鏈時需要傳輸?shù)臄?shù)據(jù) 庫操作日志的重新定位能夠避免由于斷鏈造成的數(shù)據(jù)丟失現(xiàn)象;備機發(fā)往主機的確認(rèn)消息 比較少,降低了對傳輸效率的影響。備機數(shù)據(jù)庫操作日志接收組件將接收到的數(shù)據(jù)庫操作日志按事務(wù)記錄到不同的 臨時日志文件中并同時傳遞給備機數(shù)據(jù)庫操作日志分析入庫組件。
四、備機對主機數(shù)據(jù)庫操作日志的分析和入庫備機對數(shù)據(jù)庫操作日志的分析和入庫由數(shù)據(jù)庫操作日志分析入庫組件完成,該環(huán) 節(jié)主要完成兩個工作(一)數(shù)據(jù)庫操作日志的分析對于每一條數(shù)據(jù)庫操作日志,從中讀取數(shù)據(jù)庫操作 日志的Connection ID,Group ID和Global ID,然后根據(jù)這三個信息構(gòu)造出數(shù)據(jù)庫事務(wù)標(biāo) 識,構(gòu)造方法如下如果Global ID存在,則使用Global ID作為數(shù)據(jù)庫事務(wù)標(biāo)識,否則使用 Connection ID+Group ID作為數(shù)據(jù)庫事務(wù)的標(biāo)識。將所有數(shù)據(jù)庫事務(wù)標(biāo)識一致的數(shù)據(jù)庫操 作日志劃分在同一個事務(wù)中執(zhí)行,數(shù)據(jù)庫事務(wù)的結(jié)束標(biāo)識是這個數(shù)據(jù)庫事務(wù)對應(yīng)的提交或 回滾操作。(二)分析后的數(shù)據(jù)庫操作日志的入庫此過程是數(shù)據(jù)庫同步的最后一個過程,在 該過程中,為每個正在執(zhí)行的數(shù)據(jù)庫事務(wù)創(chuàng)建一個連接池,連接池的結(jié)構(gòu)為數(shù)據(jù)源名稱到 該數(shù)據(jù)源對應(yīng)的數(shù)據(jù)庫連接的映射。對于每一條數(shù)據(jù)庫操作日志,當(dāng)取出該條日志的事務(wù) 標(biāo)識以后,根據(jù)事物標(biāo)識取出對應(yīng)的數(shù)據(jù)庫連接池,然后再根據(jù)該條日志中的數(shù)據(jù)源名稱 取出對應(yīng)于該數(shù)據(jù)源的數(shù)據(jù)庫連接,最后通過該數(shù)據(jù)庫連接執(zhí)行數(shù)據(jù)庫操作日志的入庫。在實際應(yīng)用本發(fā)明時,為了提高數(shù)據(jù)庫同步的效率,可以采用多同步任務(wù)的方式 實施本發(fā)明,這種方式只需要對上述技術(shù)方案稍加改進即可劃分同步任務(wù)將有關(guān)聯(lián)關(guān)系的數(shù)據(jù)庫表劃分在同一個同步任務(wù)中,并給每個同 步任務(wù)取一個唯一的任務(wù)名稱,各同步任務(wù)原則上獨立、并行執(zhí)行。每個同步任務(wù)均有自己的組件主機數(shù)據(jù)庫操作攔截、數(shù)據(jù)庫操作日志記錄組件該組件可以被各個同步任務(wù)共 享,前提是能夠根據(jù)不同的同步任務(wù)將數(shù)據(jù)庫操作日志記錄到不同的日志文件中,各個同 步任務(wù)的日志記錄文件可以根據(jù)下面的規(guī)則確定同步任務(wù)名稱+文件序號.log;主機數(shù)據(jù)庫日志傳輸組件每個同步任務(wù)部署自己的數(shù)據(jù)庫日志傳輸組件,該組 件的工作方式同單同步任務(wù)時的工作方式一樣,它們之間的區(qū)別在于需要讀取的數(shù)據(jù)庫 操作日志記錄文件的命名規(guī)則的不同以及和備機不同的數(shù)據(jù)庫日志接收組件建立傳輸鏈 路;備機數(shù)據(jù)庫日志接收組件每個同步任務(wù)部署自己的數(shù)據(jù)庫日志接收組件,該組 件的工作方式同單同步任務(wù)時的工作方式一樣,它們之間的區(qū)別在于和主機不同的數(shù)據(jù)庫 日志傳輸組件建立傳輸鏈路;備機數(shù)據(jù)庫日志分析入庫組件每個同步任務(wù)部署自己的數(shù)據(jù)庫日志分析入庫組 件,該組件的工作方式同單同步任務(wù)時的工作方式一樣。通過以上兩方面的改進,能夠?qū)崿F(xiàn)多任務(wù)并發(fā)的數(shù)據(jù)庫同步,大大提高了數(shù)據(jù)庫 同步的效率。圖3是本發(fā)明主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置結(jié)構(gòu)示意圖,如圖所示,本發(fā) 明主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置具體包括數(shù)據(jù)庫操作攔截模塊、操作日志生成模 塊、操作日志傳輸模塊和操作日志入庫模塊。其中數(shù)據(jù)庫操作攔截模塊用于利用主機數(shù)據(jù)庫應(yīng)用代碼層提供的標(biāo)準(zhǔn)接口攔截 主機數(shù)據(jù)庫的操作信息,攔截的主機數(shù)據(jù)庫操作信息包括執(zhí)行存儲過程的操作信息和更新 數(shù)據(jù)庫數(shù)據(jù)的操作信息。其具體方案包括通過包裝模式將數(shù)據(jù)庫應(yīng)用代碼需要獲取的數(shù)據(jù)庫連接進行基于接口的包裝,然后再交由數(shù)據(jù)庫應(yīng)用代碼執(zhí)行相應(yīng)的數(shù)據(jù)庫操作,即能 實現(xiàn)對主機數(shù)據(jù)庫操作的攔截。操作日志生成模塊用于基于攔截的數(shù)據(jù)庫操作信息,生成主機的數(shù)據(jù)庫操作日 志。生成的主機數(shù)據(jù)庫操作日志是基于事務(wù)劃分的數(shù)據(jù)庫操作日志,基于事務(wù)劃分?jǐn)?shù)據(jù)庫 操作日志的策略包括如果是基于在事務(wù)中獲取的數(shù)據(jù)庫連接來生成主機數(shù)據(jù)庫操作日志,則采用從事 務(wù)管理容器中獲取的全局事務(wù)號來唯一標(biāo)識該數(shù)據(jù)庫事務(wù);如果是基于不在事務(wù)中獲取的數(shù)據(jù)庫連接來生成主機數(shù)據(jù)庫操作日志,則采用數(shù) 據(jù)庫連接編號與對應(yīng)于同一個數(shù)據(jù)庫連接的提交或回滾次數(shù)序號的組合來唯一標(biāo)識該數(shù) 據(jù)庫事務(wù)。操作日志傳輸模塊用于將主機的數(shù)據(jù)庫操作日志傳輸給備機。操作日志傳輸模塊 在將主機的數(shù)據(jù)庫操作日志傳輸給備機時,采用了主備機之間的消息傳輸成功確認(rèn)機制, 以保證將主機的數(shù)據(jù)庫操作日志正確傳輸給備機。操作日志入庫模塊用于將備機收到的數(shù)據(jù)庫操作日志存入備機的數(shù)據(jù)庫。操作日志入庫模塊包括數(shù)據(jù)庫事務(wù)標(biāo)識確定子模塊、連接池創(chuàng)建子模塊和入庫執(zhí) 行子模塊。其中數(shù)據(jù)庫事務(wù)標(biāo)識確定子模塊用于對于各條數(shù)據(jù)庫操作日志,如果其存在全 局事務(wù)號Global ID,則以該全局事務(wù)號作為其數(shù)據(jù)庫事務(wù)標(biāo)識,如果其不存在全局事務(wù) 號,則以數(shù)據(jù)庫連接編號與對應(yīng)于同一個數(shù)據(jù)庫連接的提交或回滾次數(shù)序號的組合作為其 數(shù)據(jù)庫事務(wù)標(biāo)識;連接池創(chuàng)建子模塊用于為各個正在執(zhí)行的數(shù)據(jù)庫事務(wù)均創(chuàng)建一個連接池,該連 接池的結(jié)構(gòu)為數(shù)據(jù)源名稱到該數(shù)據(jù)源對應(yīng)的數(shù)據(jù)庫連接的映射;入庫執(zhí)行子模塊用于對于各條數(shù)據(jù)庫操作日志,根據(jù)其數(shù)據(jù)庫事務(wù)標(biāo)識取出對 應(yīng)的數(shù)據(jù)庫連接池,然后根據(jù)該條數(shù)據(jù)庫操作日志中的數(shù)據(jù)源名稱取出對應(yīng)于該數(shù)據(jù)源的 數(shù)據(jù)庫連接,最后通過該數(shù)據(jù)庫連接執(zhí)行數(shù)據(jù)庫操作日志的入庫。以上所述的具體實施例,對本發(fā)明的目的、技術(shù)方案和有益效果進行了進一步詳 細(xì)說明,所應(yīng)注意的是,以上所述僅為本發(fā)明的具體實施例而已,本領(lǐng)域的技術(shù)人員可以對 本發(fā)明進行各種改動和變型而不脫離本發(fā)明的精神和范圍。這樣,倘若本發(fā)明的這些修改 和變型屬于本發(fā)明權(quán)利要求記載的技術(shù)方案及其等同技術(shù)的范圍之內(nèi),則本發(fā)明也意圖包 含這些改動和變型在內(nèi)。
權(quán)利要求
1.一種主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法,其特征在于包括如下步驟數(shù)據(jù)庫操作攔截步驟,該步驟用于利用主機數(shù)據(jù)庫應(yīng)用代碼層提供的標(biāo)準(zhǔn)接口攔截主 機數(shù)據(jù)庫的操作信息;操作日志生成步驟,該步驟用于基于所述攔截的數(shù)據(jù)庫操作信息,生成主機的數(shù)據(jù)庫 操作日志;操作日志傳輸步驟,該步驟用于將所述主機的數(shù)據(jù)庫操作日志傳輸給備機;操作日志入庫步驟,該步驟用于根據(jù)備機收到的所述數(shù)據(jù)庫操作日志執(zhí)行備機數(shù)據(jù)庫 同步寫入。
2.根據(jù)權(quán)利要求1所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法,其特征在于在操作日志生成步驟中,所述生成的主機數(shù)據(jù)庫操作日志是基于事務(wù)劃分的數(shù)據(jù)庫操 作曰志。
3.根據(jù)權(quán)利要求2所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法,其特征在于,所述基 于事務(wù)劃分?jǐn)?shù)據(jù)庫操作日志的策略包括如果是基于在事務(wù)中獲取的數(shù)據(jù)庫連接來生成所述主機數(shù)據(jù)庫操作日志,則采用從事 務(wù)管理容器中獲取的全局事務(wù)號來唯一標(biāo)識該數(shù)據(jù)庫事務(wù);如果是基于不在事務(wù)中獲取的數(shù)據(jù)庫連接來生成所述主機數(shù)據(jù)庫操作日志,則采用數(shù) 據(jù)庫連接編號與對應(yīng)于同一個數(shù)據(jù)庫連接的提交或回滾次數(shù)序號的組合來唯一標(biāo)識該數(shù) 據(jù)庫事務(wù)。
4.根據(jù)權(quán)利要求3所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法,其特征在于,在操作 日志入庫步驟中,所述根據(jù)備機收到的所述數(shù)據(jù)庫操作日志執(zhí)行備機數(shù)據(jù)庫同步寫入的方 案包括對于各條所述數(shù)據(jù)庫操作日志,如果其存在全局事務(wù)號,則以該全局事務(wù)號作為其數(shù) 據(jù)庫事務(wù)標(biāo)識,如果其不存在全局事務(wù)號,則以數(shù)據(jù)庫連接編號與對應(yīng)于同一個數(shù)據(jù)庫連 接的提交或回滾次數(shù)序號的組合作為其數(shù)據(jù)庫事務(wù)標(biāo)識;為各個正在執(zhí)行的數(shù)據(jù)庫事務(wù)均創(chuàng)建一個連接池,該連接池的結(jié)構(gòu)為數(shù)據(jù)源名稱到該 數(shù)據(jù)源對應(yīng)的數(shù)據(jù)庫連接的映射;對于各條所述數(shù)據(jù)庫操作日志,根據(jù)其所述數(shù)據(jù)庫事務(wù)標(biāo)識取出對應(yīng)的所述數(shù)據(jù)庫連 接池,然后根據(jù)該條數(shù)據(jù)庫操作日志中的數(shù)據(jù)源名稱取出對應(yīng)于該數(shù)據(jù)源的數(shù)據(jù)庫連接, 最后通過該數(shù)據(jù)庫連接執(zhí)行數(shù)據(jù)庫操作日志的入庫。
5.根據(jù)權(quán)利要求1至4中任一項所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法,其特征 在于該方法采用多同步任務(wù)并發(fā)執(zhí)行的方式來執(zhí)行所述主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫的同步操作。
6.一種主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置,其特征在于包括數(shù)據(jù)庫操作攔截模塊,該模塊用于利用主機數(shù)據(jù)庫應(yīng)用代碼層提供的標(biāo)準(zhǔn)接口攔截主 機數(shù)據(jù)庫的操作信息;操作日志生成模塊,該模塊用于基于所述攔截的數(shù)據(jù)庫操作信息,生成主機的數(shù)據(jù)庫 操作日志;操作日志傳輸模塊,該模塊用于將所述主機的數(shù)據(jù)庫操作日志傳輸給備機;操作日志入庫模塊,該模塊用于根據(jù)備機收到的所述數(shù)據(jù)庫操作日志執(zhí)行備機數(shù)據(jù)庫 同步寫入。
7.根據(jù)權(quán)利要求6所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置,其特征在于 所述攔截的主機數(shù)據(jù)庫操作信息包括執(zhí)行存儲過程的操作信息和更新數(shù)據(jù)庫數(shù)據(jù)的操作信息。
8.根據(jù)權(quán)利要求6所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置,其特征在于,所述利 用主機數(shù)據(jù)庫應(yīng)用代碼層提供的標(biāo)準(zhǔn)接口攔截主機數(shù)據(jù)庫的操作信息的具體方案包括通過包裝模式將數(shù)據(jù)庫應(yīng)用代碼需要獲取的數(shù)據(jù)庫連接進行基于接口的包裝,然后再 交由數(shù)據(jù)庫應(yīng)用代碼執(zhí)行相應(yīng)的數(shù)據(jù)庫操作。
9.根據(jù)權(quán)利要求6或7或8所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置,其特征在于所述基于攔截的數(shù)據(jù)庫操作信息,生成的所述主機數(shù)據(jù)庫操作日志是基于事務(wù)劃分的 數(shù)據(jù)庫操作日志。
10.根據(jù)權(quán)利要求9所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置,其特征在于,所述 基于事務(wù)劃分?jǐn)?shù)據(jù)庫操作日志的策略包括如果是基于在事務(wù)中獲取的數(shù)據(jù)庫連接來生成所述主機數(shù)據(jù)庫操作日志,則采用從事 務(wù)管理容器中獲取的全局事務(wù)號來唯一標(biāo)識該數(shù)據(jù)庫事務(wù);如果是基于不在事務(wù)中獲取的數(shù)據(jù)庫連接來生成所述主機數(shù)據(jù)庫操作日志,則采用數(shù) 據(jù)庫連接編號與對應(yīng)于同一個數(shù)據(jù)庫連接的提交或回滾次數(shù)序號的組合來唯一標(biāo)識該數(shù) 據(jù)庫事務(wù)。
11.根據(jù)權(quán)利要求10所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置,其特征在于 所述操作日志入庫模塊包括數(shù)據(jù)庫事務(wù)標(biāo)識確定子模塊、連接池創(chuàng)建子模塊和入庫執(zhí)行子模塊;其中,所述數(shù)據(jù)庫事務(wù)標(biāo)識確定子模塊用于對于各條所述數(shù)據(jù)庫操作日志,如果其存 在全局事務(wù)號,則以該全局事務(wù)號作為其數(shù)據(jù)庫事務(wù)標(biāo)識,如果其不存在全局事務(wù)號,則以 數(shù)據(jù)庫連接編號與對應(yīng)于同一個數(shù)據(jù)庫連接的提交或回滾次數(shù)序號的組合作為其數(shù)據(jù)庫 事務(wù)標(biāo)識;所述連接池創(chuàng)建子模塊用于為各個正在執(zhí)行的數(shù)據(jù)庫事務(wù)均創(chuàng)建一個連接池,該連 接池的結(jié)構(gòu)為數(shù)據(jù)源名稱到該數(shù)據(jù)源對應(yīng)的數(shù)據(jù)庫連接的映射;所述入庫執(zhí)行子模塊用于對于各條所述數(shù)據(jù)庫操作日志,根據(jù)其所述數(shù)據(jù)庫事務(wù)標(biāo) 識取出對應(yīng)的所述數(shù)據(jù)庫連接池,然后根據(jù)該條數(shù)據(jù)庫操作日志中的數(shù)據(jù)源名稱取出對應(yīng) 于該數(shù)據(jù)源的數(shù)據(jù)庫連接,最后通過該數(shù)據(jù)庫連接執(zhí)行數(shù)據(jù)庫操作日志的入庫。
12.根據(jù)權(quán)利要求6或7或8所述的主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)裝置,其特征在于所述操作日志傳輸模塊在將所述主機的數(shù)據(jù)庫操作日志傳輸給備機時,采用了主備機 之間的消息傳輸成功確認(rèn)機制。
全文摘要
本發(fā)明公開了一種主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫同步的實現(xiàn)方法及裝置,不需要專用的數(shù)據(jù)庫同步工具即能實現(xiàn)主、備網(wǎng)管系統(tǒng)數(shù)據(jù)庫的準(zhǔn)實時同步。本發(fā)明裝置包括如下模塊數(shù)據(jù)庫操作攔截模塊,該模塊用于利用主機數(shù)據(jù)庫應(yīng)用代碼層提供的標(biāo)準(zhǔn)接口攔截主機數(shù)據(jù)庫的操作信息,包括執(zhí)行存儲過程的操作信息和更新數(shù)據(jù)庫數(shù)據(jù)的操作信息;操作日志生成模塊,該模塊用于基于所述攔截的數(shù)據(jù)庫操作信息,生成基于事務(wù)劃分的主機數(shù)據(jù)庫操作日志,并提出了事務(wù)劃分策略;操作日志傳輸模塊,該模塊用于采用消息確認(rèn)機制將所述主機的數(shù)據(jù)庫操作日志傳輸給備機;操作日志入庫模塊,該模塊用于根據(jù)備機收到的所述數(shù)據(jù)庫操作日志執(zhí)行備機數(shù)據(jù)庫同步寫入。
文檔編號H04L12/24GK102081611SQ20091022426
公開日2011年6月1日 申請日期2009年11月26日 優(yōu)先權(quán)日2009年11月26日
發(fā)明者馮文波, 巫鍇, 胡銳 申請人:中興通訊股份有限公司