高梓銘,韋同勝,王 鯤,趙文濤
(1.西安郵電大學(xué)通信與信息工程學(xué)院,陜西西安710121;2.電子信息現(xiàn)場(chǎng)勘驗(yàn)應(yīng)用技術(shù)公安部重點(diǎn)實(shí)驗(yàn)室,陜西西安710121;3.陜西省公安廳 科技信息化處,陜西西安710018)
解決多點(diǎn)部署的SQL SERVER數(shù)據(jù)庫(kù)數(shù)據(jù)同步問題,最直接的方法就是利用SQL SERVER的同步復(fù)制技術(shù),通過數(shù)據(jù)庫(kù)之間對(duì)數(shù)據(jù)和數(shù)據(jù)庫(kù)對(duì)象進(jìn)行復(fù)制和分發(fā),實(shí)現(xiàn)同步并確保其一致性,同時(shí)也可通過第三方工具實(shí)現(xiàn)同步系統(tǒng)的開發(fā)。而PowerBuilder的數(shù)據(jù)庫(kù)開發(fā)運(yùn)行效率較高。因此,本文根據(jù)業(yè)務(wù)數(shù)據(jù)庫(kù)庫(kù)結(jié)構(gòu)、部署方式、同步要求等,對(duì)照修復(fù)方案庫(kù)同步技術(shù)要求,分別比較SQL SERVER數(shù)據(jù)庫(kù)發(fā)布/訂閱機(jī)制、PowerBuilder開發(fā)工具數(shù)據(jù)管道,結(jié)合其優(yōu)點(diǎn),設(shè)計(jì)基于PowerBuilder開發(fā)的同步系統(tǒng)。
通過固件模塊重寫對(duì)故障硬盤進(jìn)行修復(fù)是解決疑難、故障條件下硬盤數(shù)據(jù)讀取的重要方法[1-2],疑難電子數(shù)據(jù)修復(fù)方案庫(kù)主要解決故障硬盤修復(fù)時(shí)必要的固件和ROM數(shù)據(jù)的收集與管理。硬盤固件是指存放硬盤控制邏輯、及相關(guān)狀態(tài)信息的模塊,固件模塊大部分分布在硬盤負(fù)磁道(俗稱“用戶保留區(qū)”),也有部分硬盤固件模塊分布在硬盤電路板上的 ROM 當(dāng)中[3]。
業(yè)務(wù)數(shù)據(jù)在存儲(chǔ)與交換時(shí)主要有如下特征。
(1)不同硬盤根據(jù)其品牌、型號(hào)(Model)、部件號(hào)碼(PN)、固件號(hào)(Firmware)等不同,對(duì)應(yīng)不同的固件文件及ROM文件[4]。
(2)固件文件或ROM文件不是一個(gè)文件,而是一組文件。以西部數(shù)據(jù)硬盤固件為例,根據(jù)功能分不同的固件模塊,如ID01=DIR(模塊目錄)、ID02=參數(shù)/密碼模塊、ID03=段位表等,在故障修復(fù)固件替換時(shí),通常不需要整體替換,而是根據(jù)故障原因針對(duì)性的替換某部分固件數(shù)據(jù),因此固件文件也是分模塊獨(dú)立存在的。
(3)單個(gè)固件文件大小通常在幾百K到十幾兆。
(4)固件文件格式以*.rpm為代表。
(5)文件存儲(chǔ)方式有兩種,一種是以文件形式為主,直接存儲(chǔ)在文件系統(tǒng)中,好處是使用時(shí)直接、方便,如圖1所示;另一種是將相關(guān)文件以二進(jìn)制流形式存儲(chǔ)在數(shù)據(jù)庫(kù)中,好處是便于管理、方便檢索,多用戶、大規(guī)模交換方便。
圖1 基于文件系統(tǒng)的固件文件存儲(chǔ)
(6)目前建立與使用這類數(shù)據(jù)的單位多數(shù)是硬盤維修機(jī)構(gòu),大部分?jǐn)?shù)據(jù)獲取與管理主要依靠維修工具配套的功能,不同工具間數(shù)據(jù)沒有統(tǒng)一的標(biāo)準(zhǔn),數(shù)據(jù)共享依靠機(jī)構(gòu)間點(diǎn)對(duì)點(diǎn)人工導(dǎo)出成文件后傳輸。
疑難電子數(shù)據(jù)修復(fù)方案數(shù)據(jù)庫(kù)相關(guān)的同步系統(tǒng)主要基于數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型、存儲(chǔ)形式和交換方式的確立,需要達(dá)到如下技術(shù)要求。
(1)以結(jié)構(gòu)化關(guān)系數(shù)據(jù)庫(kù)同步為主,綜合考慮現(xiàn)有業(yè)務(wù)系統(tǒng)數(shù)據(jù)庫(kù)的情況,以支持SQL SERVER2000數(shù)據(jù)庫(kù)優(yōu)先。
(2)支持 varchar、decimal、int等常用數(shù)據(jù)類型外,還要考慮對(duì)binary、image等二進(jìn)制數(shù)據(jù)類型[5]的支持。
(3)獨(dú)立于修復(fù)方案庫(kù),不受方案庫(kù)具體表、視圖等設(shè)計(jì)與變更的影響。
(4)適應(yīng)從多用戶數(shù)據(jù)庫(kù)中抽取數(shù)據(jù)的需要。
(5)實(shí)現(xiàn)增量傳輸要求。
(6)修正網(wǎng)絡(luò)不可靠導(dǎo)致的數(shù)據(jù)傳輸中斷等問題。
(7)支持傳輸數(shù)據(jù)條件設(shè)置,可實(shí)現(xiàn)行過濾、列過濾。
(8)考慮源或目標(biāo)數(shù)據(jù)服務(wù)器不一定實(shí)時(shí)在線,要有適合的數(shù)據(jù)同步方案。
(9)支持雙向同步,有可行的沖突處理機(jī)制。
(10)同步操作要避免對(duì)業(yè)務(wù)的影響。
(11)降低入侵性。
(12)易于部署、便于維護(hù)。
SQL SERVER的發(fā)布/訂閱[6]是一種多對(duì)單的依賴關(guān)系備份的復(fù)制機(jī)制,通過訂閱數(shù)據(jù)庫(kù)監(jiān)聽多個(gè)數(shù)據(jù)源數(shù)據(jù)庫(kù)的變更,當(dāng)源數(shù)據(jù)庫(kù)數(shù)據(jù)發(fā)生變更時(shí),通知訂閱它的數(shù)據(jù)庫(kù)進(jìn)行數(shù)據(jù)同步變更,中心訂閱模型如圖2所示。
對(duì)照修復(fù)方案庫(kù)同步技術(shù)要求,將 SQL SERVER的發(fā)布/訂閱特性梳理如下。
(1)作為SQL SERVER自帶的復(fù)制機(jī)制,數(shù)據(jù)庫(kù)發(fā)布/訂閱主要就是針對(duì)SQL SERVER數(shù)據(jù)庫(kù)之間對(duì)數(shù)據(jù)和數(shù)據(jù)庫(kù)對(duì)象[7]進(jìn)行復(fù)制和分發(fā)并進(jìn)行同步以確保其一致性的一組技術(shù),符合要求。
圖2 SQL SERVER的發(fā)布/訂閱中心訂閱模型
(2)SQL SERVER復(fù)制可以發(fā)布各類數(shù)據(jù)庫(kù)對(duì)象與數(shù)據(jù),包括 varbinary等,但無法支持標(biāo)識(shí)列復(fù)制。
(3)建立數(shù)據(jù)庫(kù)發(fā)布時(shí),與用戶業(yè)務(wù)庫(kù)具體設(shè)計(jì)無關(guān),可以在修復(fù)方案庫(kù)部署之后完成發(fā)布任務(wù)建立,但用于復(fù)制的項(xiàng)目,如表結(jié)構(gòu)要進(jìn)行修改則會(huì)受到限制,甚至可能需要先刪除發(fā)布,完成修訂后再重新建立發(fā)布,更適合成熟度、穩(wěn)定度高的數(shù)據(jù)庫(kù)。
(4)SQL SERVER復(fù)制支持多對(duì)一發(fā)布/訂閱,可以比較好的支持從多用戶數(shù)據(jù)中抽取數(shù)據(jù)。
(5)事務(wù)復(fù)制、合并復(fù)制都適合發(fā)生增量更改時(shí)將其傳播到訂閱服務(wù)器。
(6)事務(wù)復(fù)制要求良好的網(wǎng)絡(luò)支持,實(shí)時(shí)、準(zhǔn)實(shí)時(shí)將發(fā)布服務(wù)器上數(shù)據(jù)變化同步到訂閱服務(wù)器[8],合并復(fù)制方式對(duì)網(wǎng)絡(luò)可靠性要求沒有那么高,適合于修復(fù)方案數(shù)據(jù)庫(kù)同步的工程實(shí)際。
(7)SQL SERVER發(fā)布訂閱針對(duì)每一個(gè)表對(duì)象提供了篩選行、篩選列功能。
(8)事務(wù)復(fù)制維護(hù)事務(wù)的一致性,需要發(fā)布服務(wù)器和訂閱服務(wù)器保持不間斷的連接,以使更新內(nèi)容能傳播到訂閱服務(wù)器。合并復(fù)制可以連續(xù)地、按需或按調(diào)度的間隔使更改同步。
(9)SQL SERVER合并復(fù)制能很好的支持雙向數(shù)據(jù)同步。
(10)數(shù)據(jù)庫(kù)復(fù)制過程中會(huì)造成短暫的鎖表操作。
(11)發(fā)布訂閱對(duì)在源數(shù)據(jù)庫(kù)中創(chuàng)建多組觸發(fā)器、標(biāo)識(shí)列等。
(12)創(chuàng)建發(fā)布訂閱需要在源數(shù)據(jù)庫(kù)、目標(biāo)數(shù)據(jù)庫(kù)上登錄數(shù)據(jù)庫(kù)后臺(tái)進(jìn)行設(shè)置,安全性比較差,雖然是向?qū)讲僮?,提供有監(jiān)測(cè)工具,具備日志功能,但相對(duì)復(fù)雜。
數(shù)據(jù)管道技術(shù)是PowerBuilder提供的一種組件,通過數(shù)據(jù)管道,可以實(shí)現(xiàn)將一個(gè)或多個(gè)源表中的數(shù)據(jù)復(fù)制到一個(gè)新的或已經(jīng)存在的目標(biāo)表中,對(duì)照修復(fù)方案庫(kù)同步技術(shù)要求,將數(shù)據(jù)管道技術(shù)特性梳理如下。
(1)通過數(shù)據(jù)管道進(jìn)行數(shù)據(jù)轉(zhuǎn)移不僅可以在同一個(gè)數(shù)據(jù)庫(kù)中進(jìn)行,而且可以跨數(shù)據(jù)庫(kù),甚至在不同的DBMS之間進(jìn)行,完全支持SQL SERVER 2000及以上版本。
(2)支持 varchar、decimal、int等常用數(shù)據(jù)類型外,但不支持varbinary、image等二進(jìn)制數(shù)據(jù)類型。
(3)數(shù)據(jù)管道作為功能組件,基于PowerBuilder開發(fā)封裝的應(yīng)用運(yùn)行,需要在開發(fā)時(shí)明確同步業(yè)務(wù)的源與目標(biāo),與業(yè)務(wù)系統(tǒng)的關(guān)聯(lián)性較強(qiáng)。
(4)支持多組各自獨(dú)立的連接,實(shí)現(xiàn)多數(shù)據(jù)源的采集。
(5)通過Options選項(xiàng),追加及更新模式,實(shí)現(xiàn)增量數(shù)據(jù)同步,但增量判斷基于PowerBuilder自身機(jī)制完成,可控性差。
(6)基于自身的增量傳輸及錯(cuò)誤控制,可以適應(yīng)包括網(wǎng)絡(luò)中斷在內(nèi)的傳輸異常,保持事務(wù)的一致性。
(7)通過Where條件實(shí)現(xiàn)行過濾,雖然可以設(shè)定同步的列,但是需要在開發(fā)時(shí)就確定好,上線后動(dòng)態(tài)調(diào)整比較困難。
(8)將源或目標(biāo)設(shè)定為一個(gè)數(shù)據(jù)文件,通過數(shù)據(jù)文件實(shí)現(xiàn)異步方式同步。
(9)每組數(shù)據(jù)管道都要明確源與目標(biāo),傳輸都是單向的,通過配置多個(gè)數(shù)據(jù)管道進(jìn)程,可以實(shí)現(xiàn)雙向。
(10)在同步發(fā)生時(shí),更新操作共享鎖可能會(huì)導(dǎo)致對(duì)前臺(tái)業(yè)務(wù)操作的影響。
(11)數(shù)據(jù)級(jí)時(shí)只需要替換應(yīng)用即可,簡(jiǎn)單方便,管道幾乎不對(duì)用戶數(shù)據(jù)庫(kù)進(jìn)行對(duì)象添加。
(12)數(shù)據(jù)管道運(yùn)行只依賴應(yīng)用所在計(jì)算機(jī),通過配置訪問源與目標(biāo)數(shù)據(jù)庫(kù),運(yùn)行或中止,操作簡(jiǎn)單,升級(jí)時(shí)只需要替換應(yīng)用即可,簡(jiǎn)單方便。
PowerBuilder提供的數(shù)據(jù)管道技術(shù)雖然比較強(qiáng)大,但在處理疑難電子數(shù)據(jù)修復(fù)方案數(shù)據(jù)庫(kù)同步需求上,靈活性差。根據(jù)數(shù)據(jù)交互復(fù)制模型[9],基于PowerBuilder,借鑒SQL SERVER發(fā)布/訂閱思路,結(jié)合數(shù)據(jù)管道優(yōu)勢(shì),設(shè)計(jì)一款獨(dú)立的數(shù)據(jù)同步系統(tǒng),該系統(tǒng)不是基于數(shù)據(jù)庫(kù)日志,而是數(shù)據(jù)本身,流程如圖3所示。
將基于PowerBuilder開發(fā)的同步系統(tǒng)可以實(shí)現(xiàn)的功能對(duì)照同步技術(shù)要求梳理如下。
(1)支持以SQL SERVER為代表的主流數(shù)據(jù)庫(kù)。
(2)基于SQL SERVER鏈接服務(wù)器模式,直接實(shí)現(xiàn)源數(shù)據(jù)庫(kù)到目標(biāo)數(shù)據(jù)庫(kù)的讀寫操作,支持各數(shù)據(jù)類型。
(3)在發(fā)起傳輸操作時(shí),動(dòng)態(tài)讀取數(shù)據(jù)表結(jié)構(gòu),不受如圖4所示的表結(jié)構(gòu)所限制[10]。
(4)將源表對(duì)目標(biāo)表作為一條傳輸任務(wù),多點(diǎn)傳輸通過加任務(wù)即可實(shí)現(xiàn),如圖5所示。
(5)借鑒SQL SERVER同步機(jī)制,在每條記錄增加最后同步時(shí)間last_trans_date與最后修改時(shí)間last_mod_date兩個(gè)標(biāo)識(shí)列,實(shí)現(xiàn)增量同步。
圖4 動(dòng)態(tài)識(shí)別表結(jié)構(gòu)的函數(shù)
圖5 創(chuàng)建同步任務(wù)表的方法
(6)為確保數(shù)據(jù)完整性,在跨服務(wù)器同步時(shí),先將數(shù)據(jù)插入到目標(biāo)數(shù)據(jù)庫(kù)臨時(shí)表中,再將數(shù)據(jù)由本地同步到目標(biāo)表中,成功后提交事務(wù),更新源表中l(wèi)ast_mod_date,如果因?yàn)榫W(wǎng)絡(luò)原因中斷,操作無效,下次執(zhí)行重復(fù)的數(shù)據(jù)同步,因此系統(tǒng)同步受網(wǎng)絡(luò)影響問題不大。
(7)系統(tǒng)同步采用動(dòng)態(tài) SQL生成技術(shù),將WHERE條件加載,實(shí)現(xiàn)行過濾,同時(shí)由于系統(tǒng)是在傳輸時(shí)才動(dòng)態(tài)加載表結(jié)構(gòu),因此通過布爾運(yùn)算,可簡(jiǎn)單方便的將無需傳輸?shù)牧羞^濾掉。
(8)系統(tǒng)發(fā)起同步時(shí),如果其中一臺(tái)服務(wù)器不在線,單項(xiàng)任務(wù)連接超時(shí)后,會(huì)自動(dòng)執(zhí)行下一項(xiàng)任務(wù),第二輪時(shí)會(huì)再依次執(zhí)行各任務(wù),應(yīng)對(duì)不在線的特殊情況。另外,同步源或目標(biāo)數(shù)據(jù)可靈活定義,對(duì)于經(jīng)常性無法同時(shí)在線的同步任務(wù),可通過配套傳輸中間件靈活匹配源與目標(biāo)。
(9)系統(tǒng)將同步對(duì)象分解成任務(wù),對(duì)于雙向同步,只是增加一條任務(wù)即可。
(10)在跨服務(wù)器同步時(shí),將數(shù)據(jù)插入到目標(biāo)數(shù)據(jù)庫(kù)臨時(shí)表中,完成后在本地同步更新目標(biāo)表,新增操作不鎖表,對(duì)于個(gè)別更新操作,會(huì)極短暫觸發(fā)共享鎖,對(duì)前臺(tái)業(yè)務(wù)操作影響甚微。
(11)為實(shí)現(xiàn)增量辨識(shí),初始化時(shí),在源及目標(biāo)表中添加標(biāo)識(shí)列及DELETE/UPDATE觸發(fā)器[11-13],有一定的入侵性,但是標(biāo)準(zhǔn)化創(chuàng)建及刪除,辨識(shí)度較高。
(12)可任意自由部署在與源及目標(biāo)數(shù)據(jù)庫(kù)建立連接的計(jì)算機(jī)上,發(fā)起連接撮合指令,實(shí)現(xiàn)同步。
將SQL SERVER數(shù)據(jù)庫(kù)發(fā)布/訂閱機(jī)制、Power-Builder開發(fā)工具數(shù)據(jù)管道組件功能、和基于Power-Builder開發(fā)的同步系統(tǒng),對(duì)照修復(fù)方案庫(kù)同步技術(shù)要求逐項(xiàng)分析發(fā)現(xiàn),標(biāo)準(zhǔn)化機(jī)制或組件看似現(xiàn)成,直接配置或簡(jiǎn)單封裝就可以開展同步,但工程適用性比較差,靈活度不足,相比之下,基于PowerBuilder開發(fā)的同步系統(tǒng)是在本地直接完成部署,可對(duì)所有源及目標(biāo)數(shù)據(jù)庫(kù)相關(guān)標(biāo)識(shí)列、觸發(fā)器,甚至數(shù)據(jù)庫(kù)其他對(duì)象實(shí)現(xiàn)同步。