李育嶺,萬曉冬
(南京航空航天大學(xué)自動化學(xué)院,江蘇 南京 210016)
隨著企業(yè)信息化建設(shè)的深入,數(shù)據(jù)庫平臺產(chǎn)生海量歷史數(shù)據(jù),并且這些數(shù)據(jù)還在持續(xù)增長。很多使用頻率極低的歷史數(shù)據(jù)占據(jù)著數(shù)據(jù)庫運行系統(tǒng)大量的存儲空間,影響著系統(tǒng)的運行效率。因此必須將系統(tǒng)中的歷史數(shù)據(jù)遷移出數(shù)據(jù)庫運行系統(tǒng),將有限的資源釋放出來,確保系統(tǒng)穩(wěn)定運行。
數(shù)據(jù)庫歸檔技術(shù)能夠有效解決海量歷史數(shù)據(jù)影響系統(tǒng)運行的問題,相對于數(shù)據(jù)備份而言,數(shù)據(jù)庫歸檔技術(shù)能夠?qū)崿F(xiàn)數(shù)據(jù)的快速歸檔和重構(gòu)。它也能夠?qū)崿F(xiàn)數(shù)據(jù)管理功能,為以后的數(shù)據(jù)查詢和分析提供便利。
目前大部分的數(shù)據(jù)庫系統(tǒng)都有自己專用的備份和歸檔機制來處理歷史數(shù)據(jù),這些歸檔工具有各自的應(yīng)用特點和局限,往往需要人為的干預(yù),并且自動化程度不是令人滿意。對于一個復(fù)雜的異構(gòu)數(shù)據(jù)庫平臺,它們無法提供很好的解決方案。隨著信息化的發(fā)展,企業(yè)的海量數(shù)據(jù)越來越多的存在于異構(gòu)數(shù)據(jù)庫環(huán)境中,使得某一數(shù)據(jù)庫平臺中的歸檔數(shù)據(jù)在其它平臺中很難被共享和利用。企業(yè)對異構(gòu)數(shù)據(jù)庫環(huán)境中的數(shù)據(jù)庫歸檔系統(tǒng)的需求日益迫切,研究和開發(fā)此類歸檔系統(tǒng)具有重要的現(xiàn)實意義。
XML在現(xiàn)有的數(shù)據(jù)庫和編程語言中具有很強的通用性,其特有的異構(gòu)性、可擴展性及靈活性,使其在數(shù)據(jù)交換和傳輸中成為一種標準。它提供了適合表示半結(jié)構(gòu)化數(shù)據(jù)的松散樹型結(jié)構(gòu),可以用來描述各種復(fù)雜數(shù)據(jù),這些復(fù)雜數(shù)據(jù)可以被不同的程序讀取。目前主流數(shù)據(jù)庫系統(tǒng)都加強了對XML的支持,這為開發(fā)基于XML的異構(gòu)數(shù)據(jù)庫歸檔系統(tǒng)奠定了基礎(chǔ),提高了系統(tǒng)開發(fā)的可行性。
本文重點研究XML與關(guān)系數(shù)據(jù)庫之間雙向映射機制,設(shè)計歸檔系統(tǒng)的模型,屏蔽異構(gòu)數(shù)據(jù)庫環(huán)境中差異性,完成數(shù)據(jù)的管理、轉(zhuǎn)換和共享,實現(xiàn)數(shù)據(jù)在異構(gòu)環(huán)境中歸檔的功能。
本系統(tǒng)采用C/S架構(gòu),以實現(xiàn)多用戶實時歸檔,統(tǒng)一管理的目標。每一個歸檔的發(fā)起者都是一個客戶端,將數(shù)據(jù)庫的結(jié)構(gòu)及約束信息和記錄信息按照統(tǒng)一的格式映射到XML文件中,歸檔的數(shù)據(jù)最終以XML文檔的形式生成。重構(gòu)時則將XML文檔中含有的數(shù)據(jù)庫信息映射到數(shù)據(jù)庫中,實現(xiàn)數(shù)據(jù)庫的重構(gòu)。而服務(wù)器主要是管理、存儲和傳送XML文檔,對客戶端的請求命令進行解析,做出正確響應(yīng),滿足客戶端數(shù)據(jù)歸檔、重構(gòu)和信息查詢的要求。
系統(tǒng)從邏輯上自下而上可以劃分為4個層次,分別是:底層異構(gòu)數(shù)據(jù)庫環(huán)境、異構(gòu)數(shù)據(jù)庫的統(tǒng)一訪問接口、數(shù)據(jù)的轉(zhuǎn)換和雙向映射以及用戶響應(yīng)和分布式歸檔管理。為了便于開發(fā)實現(xiàn),將系統(tǒng)的上述4個層次整合成幾個主要模塊,將緊密關(guān)系的功能集中在一起,使程序結(jié)構(gòu)更加合理。
系統(tǒng)主要由客戶端和服務(wù)器端兩部分組成,系統(tǒng)體系結(jié)構(gòu)如圖1所示。
圖1 數(shù)據(jù)庫歸檔系統(tǒng)框架圖
網(wǎng)絡(luò)通訊與命令解析模塊在服務(wù)器端和客戶端都存在??蛻舳税l(fā)向服務(wù)端的信息主要有歸檔請求、數(shù)據(jù)庫表的查詢以及其它狀態(tài)檢測信息。服務(wù)器端也實時地向客戶端返回狀態(tài)信息、XML文件以及查詢結(jié)果等。這樣系統(tǒng)就可以實現(xiàn)分布式遠程在線歸檔的功能。服務(wù)器端對歸檔的XML文件進行統(tǒng)一管理和存儲,建立用戶查詢索引,方便數(shù)據(jù)的重構(gòu)。
客戶端通過數(shù)據(jù)庫統(tǒng)一訪問接口連接訪問異構(gòu)數(shù)據(jù)庫平臺,用戶需要提供基本信息,如數(shù)據(jù)庫服務(wù)器IP、連接端口、用戶名、密碼、數(shù)據(jù)庫名等,并選擇相應(yīng)的數(shù)據(jù)庫類型,就可以訪問異構(gòu)環(huán)境。這是對多種數(shù)據(jù)庫訪問方法的一種集成,讓歸檔系統(tǒng)能夠適應(yīng)異構(gòu)數(shù)據(jù)庫環(huán)境。
客戶端包含了歸檔系統(tǒng)中的兩個關(guān)鍵模塊,數(shù)據(jù)庫歸檔模塊和數(shù)據(jù)庫重構(gòu)模塊。歸檔模塊中主要是從數(shù)據(jù)庫中獲取表的結(jié)構(gòu)信息和記錄信息,生成統(tǒng)一格式的XML文檔,數(shù)據(jù)庫重構(gòu)模塊則從XML文件中讀取表的結(jié)構(gòu)信息,在數(shù)據(jù)庫中建立表的基本結(jié)構(gòu),再將XML中的記錄值填充到數(shù)據(jù)庫中,實現(xiàn)整個重構(gòu)過程。
為了使生成的XML歸檔文件能夠在異構(gòu)數(shù)據(jù)庫環(huán)境中傳遞數(shù)據(jù)信息,將XML文件劃分為結(jié)構(gòu)區(qū)和記錄區(qū),將數(shù)據(jù)庫的表結(jié)構(gòu)和記錄值分別映射到XML文檔的結(jié)構(gòu)區(qū)和記錄區(qū)。建立結(jié)構(gòu)區(qū)的目的是為了保持關(guān)系數(shù)據(jù)庫中的各表及各列的約束條件和內(nèi)外關(guān)系,保證數(shù)據(jù)在結(jié)構(gòu)上的完整性和一致性。任何數(shù)據(jù)庫平臺都能從XML歸檔文件中獲取到數(shù)據(jù)庫的原貎,這樣在重構(gòu)時能夠最大限度地與原數(shù)據(jù)保持一致。該系統(tǒng)利用SQL語句,從3種數(shù)據(jù)庫系統(tǒng)中獲取數(shù)據(jù)庫表名、表數(shù)量、主鍵、外鍵、列名、列數(shù)量、列類型、長度、精度、是否允許為空、默認值、外鍵所在的表的表名及在此表的列名等重要信息。當(dāng)然,不同的數(shù)據(jù)庫平臺還帶有各自特有的信息,如MySQL數(shù)據(jù)庫中表創(chuàng)建時指定的引擎類型等。這些與庫表信息緊密相聯(lián)的信息映射到XML的結(jié)構(gòu)區(qū),作為重構(gòu)庫表的依據(jù)。
表結(jié)構(gòu)和約束關(guān)系導(dǎo)出到XML結(jié)構(gòu)區(qū)的格式如下:
<dbstructure>
<dbname>mydb</dbname>//表所屬的數(shù)據(jù)庫名
<dbtype>Oracle</dbtype>//數(shù)據(jù)庫類型
<tablestructure>//表的結(jié)構(gòu)信息
<tablename>stu_score</tablename>//表名
<primarykey> //主鍵信息
<primarykeyname>stu_id</primarykeyname>
//主鍵鍵名
<primarykeytype>number</primarykeytype>
//主鍵數(shù)據(jù)類型
</primarykey>
<foreignkey> //外鍵信息
<foreignkeyname>course_name</foreignkeyname>//外鍵鍵名
<foreignkeyftablename>course</foreignkeyftablename>//外鍵所在表名
<foreignkeyfcolumnname>course_name<foreignkeyfcolumnName>//外鍵關(guān)聯(lián)表中的列名
</foreignkey>
<columnsinfo> //列信息
<columncount>5</columncount>//表中列數(shù)量
<column>//第一列的信息
<columnname>stu_id</columnname>//列名稱
<columntype>number</columntype>//列的數(shù)據(jù)類型
<columnprecision>2</columnprecision>//列的數(shù)據(jù)位數(shù)
<columnscale>0</columnscale>//列的精度
<columnlength>22</columnlength>//列的長度
<columnisnullable>NO</columnisnullable>//列是否為空
<columndefault>0</dolumndefault> //列默認值
</column>
…//其它列
</tablestructure>
在該歸檔系統(tǒng)中,XML歸檔文件中包含的數(shù)據(jù)庫信息可能會在各個數(shù)據(jù)庫平臺中重新構(gòu)建出來,而各數(shù)據(jù)庫平臺的數(shù)據(jù)類型各異,因此,需要建立異構(gòu)環(huán)境數(shù)據(jù)庫數(shù)據(jù)類型映射表,來實現(xiàn)庫表的跨平臺重構(gòu)。
不同數(shù)據(jù)庫系統(tǒng),都有自己的一套數(shù)據(jù)類型。這些數(shù)據(jù)類型在名稱、長度和精度上有很大的差異。隨著數(shù)據(jù)庫系統(tǒng)的不斷發(fā)展和升級,數(shù)據(jù)類型的種類也越來越多。雖然如此,數(shù)據(jù)庫在滿足用戶使用的基本要求上,卻有著極大的共性。數(shù)據(jù)類型都分為數(shù)值型、字符型、長字符型等,這個共性給數(shù)據(jù)庫數(shù)據(jù)類型轉(zhuǎn)換帶來了可能和方便。通過分析異構(gòu)數(shù)據(jù)庫中各數(shù)據(jù)類型的特征,找出和建立它們之間的對應(yīng)關(guān)系,達到數(shù)據(jù)源跨平臺的目的。
本文所研究的3種數(shù)據(jù)庫平臺在數(shù)據(jù)庫重構(gòu)時存在9種映射關(guān)系(包含自身映射),為了盡可能多地考慮數(shù)據(jù)的完整性和最大兼容性,將表示范圍小的數(shù)據(jù)類型映射到同等范圍或者表示范圍大的數(shù)據(jù)類型中去,盡量避免將表示范圍大的數(shù)據(jù)類型映射到表示范圍小的數(shù)據(jù)類型中去。例如,MySQL的VARCHAR類型映射到Oracle中,依然是VARCHAR,但反過來Oracle的VARCHAR類型映射到MySQL中,對應(yīng)的則是TEXT類型,因為MySQL中的VARCHAR類型表示的字符存儲容量已不能滿足 Oracle中VARCHAR的需求了。
在C++程序設(shè)計中,利用STL中的MAP關(guān)聯(lián)容器來實現(xiàn)這種對應(yīng)關(guān)系,將源數(shù)據(jù)庫數(shù)據(jù)類型作為XML文檔的數(shù)據(jù)類型查詢方,而將查詢到的對應(yīng)項作為重構(gòu)的目標數(shù)據(jù)庫的數(shù)據(jù)類型項。
目前主流數(shù)據(jù)庫平臺對XML給予很大支持,能夠讓用戶方便地將庫表記錄從庫中導(dǎo)出到XML文件中去,但各個平臺產(chǎn)生的XML文件格式差異很大,限制了它的通用性。在該系統(tǒng)中,先將數(shù)據(jù)庫中表的記錄通過自身機制導(dǎo)出到XML文件中去,然后再通過系統(tǒng)中的轉(zhuǎn)換模塊,將記錄的存儲格式轉(zhuǎn)換成統(tǒng)一的格式保存到XML文檔的記錄區(qū)中,和結(jié)構(gòu)區(qū)共同來表達一個完整的可重構(gòu)的數(shù)據(jù)表。
VC++環(huán)境中,通過數(shù)據(jù)庫訪問組件執(zhí)行SQL語句,來完成相應(yīng)的數(shù)據(jù)操作,將數(shù)據(jù)庫中的記錄導(dǎo)出到XML文件中去。
從Oracle 10g數(shù)據(jù)庫中導(dǎo)出記錄到XML文件中的命令:
spool F:oracle_arc.xml;
他是最會講“段子”的科普達人,最受青少年歡迎的明星專家。他參與了上??萍拣^、自然博物館的籌建,并承擔(dān)了上海自然博物館近500塊中英文展板的編寫工作;
selectDBMS_XMLQuery.getXml('select*from tablename')from dual;
spool off
當(dāng)然還必須根據(jù)記錄的大小和要生成的格式設(shè)定其它的參數(shù),比如 pagesize、long、linesize、heading、trimspool等,參數(shù)設(shè)定不當(dāng)會出現(xiàn)XML文件不完整,記錄值不全的問題。
從MySQL5數(shù)據(jù)庫中導(dǎo)出記錄到XML文件中的命令:
mysql-h ip-X-u*-p*-e"use dbname;select*from tablename;" >F:mysql_arc.xml
上面命令中IP指MySQL服務(wù)器IP地址,*分別表示用戶名和登錄密碼。
從SQL Server中導(dǎo)出記錄到XML文件中的命令:
select*from tablename for XML Auto
再將結(jié)果集利用VC++中的ADO技術(shù)存入到XML文件中即可。
上面生成的XML文件在格式有一定的差異,通過轉(zhuǎn)換,將導(dǎo)出的數(shù)據(jù)轉(zhuǎn)換成以下格式:
<tablerecord>//表記錄區(qū)
<record stu_id="0302001"course_name="英語"stu_score="86"/>//第一條記錄值
<record stu_id="0302002"course_name="英語"stu_score="65"/>//第二條記錄值
…
</tablerecord>
將記錄導(dǎo)出到XML文件中后,通過對比原表中記錄的數(shù)量和XML導(dǎo)出的記錄數(shù),檢驗數(shù)據(jù)的完整性;通過隨機比較某些記錄項的值,檢驗數(shù)據(jù)的一致性。
在導(dǎo)出表信息的同時,生成詳細的日志。記錄下操作者、表名、日期、任務(wù)名稱、是否成功、XML文件名稱和存儲位置等信息,以便用戶查詢分析。
本文設(shè)計并實現(xiàn)了基于XML的數(shù)據(jù)庫歸檔系統(tǒng),利用數(shù)據(jù)庫平臺對XML的支持, 通過數(shù)據(jù)格式和數(shù)據(jù)類型的轉(zhuǎn)化,屏蔽平臺差異性,達到異構(gòu)環(huán)境的數(shù)據(jù)歸檔和重構(gòu)的目的。系統(tǒng)的分布式設(shè)計,使其更貼近企業(yè)的真實應(yīng)用環(huán)境。在 MSSQL Server 2005,MySQL5,Oracle 10g這3種異構(gòu)數(shù)據(jù)庫環(huán)境的實際應(yīng)用中,總體效果良好。
[1]江勇,于建武,劉鎮(zhèn).基于Schema的XML文檔和關(guān)系模式的映射研究[J].科學(xué)技術(shù)與工程,2008,8(2):407-410.
[2]劉洪星,陳明,張學(xué)敏.幾種基于EER的XML概念模式的研究[J].武漢理工大學(xué)學(xué)報,2006,28(5):25-28.
[3]劉雍.將關(guān)系數(shù)據(jù)庫的查詢結(jié)果轉(zhuǎn)換為XML文檔[J].瓊州學(xué)院學(xué)報,2009(2):18-21.
[4]石海霞.基于XML的數(shù)據(jù)庫中間件技術(shù)與應(yīng)用研究[D].杭州:浙江工業(yè)大學(xué),2008:29-30.
[5]劉偉.基于Schema的XML模式與關(guān)系模式映射算法的研究[J].計算機應(yīng)用與軟件,2006,23(3):113-115.
[6]吳潔明,萬勵,莫智懿,等.基于關(guān)系數(shù)據(jù)庫的XML存儲技術(shù)[J].制造業(yè)自動化,2011,33(1):7-9.
[7]任劍嵐.SQL Server 2005對XML的支持分析報告[J].電腦知識與技術(shù),2011,7(2):274-275.
[8]李為,蔡英蔚,徐輝.基于多線程的異構(gòu)數(shù)據(jù)庫集成平臺的設(shè)計實現(xiàn)[J].現(xiàn)代電力,2008,25(5):69-72.
[9]陳巍,劉藝雯.數(shù)據(jù)庫數(shù)據(jù)遷移測試軟件的研究與實現(xiàn)[J].安徽工程科技學(xué)院學(xué)報,2010,25(4):35-39.
[10]馮春輝.基于關(guān)系數(shù)據(jù)庫的XML映射機制研究[J].煤炭技術(shù),2010,29(12):136-137.
[11]郝少化,韓燮.基于XML技術(shù)的異構(gòu)關(guān)系數(shù)據(jù)庫集成模型[J].計算機工程與設(shè)計,2010,31(24):5285-5288.
[12]王軍,張興忠.XML與全文檢索在CMS數(shù)據(jù)歸檔中的應(yīng)用[J].電腦開發(fā)與應(yīng)用,2011,25(1):70-72.
[13]劉慧琳.基于XML和數(shù)據(jù)庫的數(shù)據(jù)映射研究[J].西南民族大學(xué)學(xué)報,2008,34(3):610-612.
[14]吳明娟,李晟.基于XML的歷史數(shù)據(jù)歸檔與重構(gòu)策略的研究與應(yīng)用[J].電腦開發(fā)與應(yīng)用,2008,25(2):5-7.