韓世杰 張記強(qiáng) 馮帆
(中國航天科工集團(tuán)第二研究院706 所 北京市 100854)
當(dāng)前國產(chǎn)數(shù)據(jù)庫迎來蓬勃發(fā)展的時(shí)期,以武漢達(dá)夢、人大金倉、神州通用、天熠數(shù)據(jù)庫為代表的一大批優(yōu)秀的國產(chǎn)數(shù)據(jù)庫產(chǎn)品得到了迅猛的發(fā)展[1][2]。隨著黨政軍領(lǐng)域中信息系統(tǒng)的國產(chǎn)化,采用國產(chǎn)數(shù)據(jù)庫替換國外數(shù)據(jù)庫后,原先存放在國外數(shù)據(jù)庫中的歷史數(shù)據(jù),無法直接使用。為了在新的數(shù)據(jù)庫管理系統(tǒng)中使用這些歷史數(shù)據(jù),需要將數(shù)據(jù)從國外數(shù)據(jù)庫遷移到國產(chǎn)數(shù)據(jù)庫中,如何快速有效地將歷史數(shù)據(jù)進(jìn)行異構(gòu)數(shù)據(jù)庫遷移已經(jīng)成為當(dāng)前數(shù)據(jù)庫領(lǐng)域的一個(gè)重要研究方向。
本文對異構(gòu)數(shù)據(jù)庫遷移系統(tǒng)的異構(gòu)性進(jìn)行分析,從數(shù)據(jù)庫模式遷移和數(shù)據(jù)遷移兩方面對異構(gòu)數(shù)據(jù)庫遷移過程進(jìn)行描述,實(shí)現(xiàn)了一種通用的異構(gòu)數(shù)據(jù)庫遷移方法,解決異構(gòu)數(shù)據(jù)庫遷移問題,通用性和可擴(kuò)展性好,且便于操作。最后,在QT 框架下,設(shè)計(jì)實(shí)現(xiàn)異構(gòu)數(shù)據(jù)庫數(shù)據(jù)遷移系統(tǒng)。實(shí)驗(yàn)驗(yàn)證表明,本系統(tǒng)達(dá)到了較好的數(shù)據(jù)遷移效果。
異構(gòu)數(shù)據(jù)庫遷移系統(tǒng)是將源數(shù)據(jù)庫中的數(shù)據(jù)遷移到目標(biāo)數(shù)據(jù)庫中,異構(gòu)數(shù)據(jù)庫的異構(gòu)性主要表現(xiàn)在以下三個(gè)方面。
(1)硬件平臺的異構(gòu)性[4]。數(shù)據(jù)庫管理系統(tǒng)運(yùn)行的硬件平臺不同,其運(yùn)行平臺可能是X86、MIPS 或ARM 平臺;
(2)操作系統(tǒng)平臺的異構(gòu)性。異構(gòu)數(shù)據(jù)庫系統(tǒng)中的數(shù)據(jù)庫管理系統(tǒng)運(yùn)行的操作系統(tǒng)種類較多,例如Windows、Linux、VxWorks與中標(biāo)麒麟等;
(3)數(shù)據(jù)庫引擎的異構(gòu)性。常見國外數(shù)據(jù)庫有Oracle、SQLServer、Mysql 與Postgre 等,常見國產(chǎn)數(shù)據(jù)庫管理系統(tǒng)有達(dá)夢、金倉、神通等。
異構(gòu)數(shù)據(jù)庫遷移包括模式遷移與數(shù)據(jù)遷移兩部分。
模式遷移是指為數(shù)據(jù)庫數(shù)據(jù)搭建了數(shù)據(jù)存在的框架形式,在數(shù)據(jù)庫中定義了數(shù)據(jù)存在的形式,包括數(shù)據(jù)庫中的表和表中各字段的屬性、表間依賴關(guān)系、字段依賴關(guān)系等信息。
由于設(shè)計(jì)理念不同,各數(shù)據(jù)庫管理系統(tǒng)中數(shù)據(jù)庫模式的表現(xiàn)形式也大相徑庭,數(shù)據(jù)庫模式遷移的關(guān)鍵點(diǎn)在于數(shù)據(jù)類型映射[5]。數(shù)據(jù)類型差異表現(xiàn)以下四個(gè)方面。
(1)異構(gòu)數(shù)據(jù)庫支持的數(shù)據(jù)類型種類不完全相同。例如A 數(shù)據(jù)庫有時(shí)間類型,B 數(shù)據(jù)庫不一定有時(shí)間類型。
(2)異構(gòu)數(shù)據(jù)庫相同數(shù)據(jù)類型的名稱可能不同。例如存儲整型數(shù)據(jù),A 數(shù)據(jù)庫類型名稱為integer,B 數(shù)據(jù)庫類型名稱為int。
圖1:異構(gòu)數(shù)據(jù)庫遷移系統(tǒng)架構(gòu)圖
圖2:數(shù)據(jù)源表儲結(jié)構(gòu)
(3)在不同場景下,一個(gè)數(shù)據(jù)庫的同一數(shù)據(jù)類型對應(yīng)其它數(shù)據(jù)庫的數(shù)據(jù)類型不同。例如A 數(shù)據(jù)庫的varchar 類型根據(jù)實(shí)際數(shù)據(jù)長度,可能對應(yīng)B 數(shù)據(jù)庫的varchar 或blob 數(shù)據(jù)類型。
(4)類型映射往往為單向映射。例如A 數(shù)據(jù)庫支持money 類型,B 數(shù)據(jù)庫不支持money 但是支持double 類型。此時(shí)A 數(shù)據(jù)庫的money 類型對應(yīng)B 數(shù)據(jù)庫double 類型,但是B 數(shù)據(jù)庫的double類型一般不能直接轉(zhuǎn)換為A 數(shù)據(jù)庫money 類型。
圖3:數(shù)據(jù)字典信息表存儲結(jié)構(gòu)
圖4:數(shù)據(jù)類型存儲結(jié)構(gòu)
圖5:異構(gòu)數(shù)據(jù)庫遷移流程圖
數(shù)據(jù)遷移則是將原數(shù)據(jù)庫中的數(shù)據(jù)填充到已搭建完成的目標(biāo)數(shù)據(jù)庫框架中。數(shù)據(jù)遷移具體實(shí)施是整個(gè)體系中關(guān)鍵的部分,需確定數(shù)據(jù)轉(zhuǎn)換的細(xì)節(jié)、數(shù)據(jù)遷移的詳細(xì)步驟以及完成遷移后的反饋等。
本系統(tǒng)的設(shè)計(jì)原則有三點(diǎn)。
(1)可擴(kuò)展性。系統(tǒng)應(yīng)具備較強(qiáng)的可擴(kuò)展性,支持常見的國內(nèi)外關(guān)系型數(shù)據(jù)庫產(chǎn)品,例如Oracle、SQLServer、Mysql、Postgre、達(dá)夢、金倉、神通、天熠數(shù)據(jù)庫等。
(2)通用性[6]。對異構(gòu)數(shù)據(jù)庫的數(shù)據(jù)庫結(jié)構(gòu)不做要求,做到數(shù)據(jù)庫的“即插即用”,即數(shù)據(jù)庫接入后就可以使用本軟件進(jìn)行遷移。
(3)可配置。用戶可對目標(biāo)數(shù)據(jù)庫表名、源數(shù)據(jù)庫管理系統(tǒng)和目標(biāo)數(shù)據(jù)庫管理系統(tǒng)中的數(shù)據(jù)類型的映射關(guān)系等進(jìn)行配置。
異構(gòu)數(shù)據(jù)庫遷移系統(tǒng)的架構(gòu)如圖 1所示,系統(tǒng)分為應(yīng)用層、業(yè)務(wù)邏輯層與數(shù)據(jù)層。
(1)應(yīng)用層。該層為用戶提供操作界面,接收用戶輸入信息。包含數(shù)據(jù)源注冊、模式映射與數(shù)據(jù)庫遷移功能。數(shù)據(jù)源注冊是將數(shù)據(jù)源注冊到系統(tǒng)中,解決異構(gòu)數(shù)據(jù)庫的硬件平臺異構(gòu)、操作系統(tǒng)平臺的異構(gòu);模式映射用于管理源數(shù)據(jù)庫管理系統(tǒng)和目標(biāo)數(shù)據(jù)庫管理系統(tǒng)中的元數(shù)據(jù)對應(yīng)關(guān)系,主要數(shù)據(jù)字典元數(shù)據(jù)映射,數(shù)據(jù)類型元數(shù)據(jù)映射兩個(gè)方面;數(shù)據(jù)庫遷移用于為用戶提供遷移源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫選擇。
(2)業(yè)務(wù)邏輯層。該層位于應(yīng)用層和數(shù)據(jù)層之間,是數(shù)據(jù)庫遷移的核心層。該層處理應(yīng)用層中提供的功能。包括數(shù)據(jù)源管理、模式映射管理、數(shù)據(jù)庫遷移流程管理模塊。
(3)數(shù)據(jù)層。該層包括接入到系統(tǒng)中的所有異構(gòu)數(shù)據(jù)庫以及數(shù)據(jù)庫遷移的源數(shù)據(jù)庫與目標(biāo)數(shù)據(jù)庫。本系統(tǒng)中使用各異構(gòu)數(shù)據(jù)庫提供的ODBC 標(biāo)準(zhǔn)接口訪問各數(shù)據(jù)庫管理系統(tǒng)。
按照模塊化設(shè)計(jì)思想進(jìn)行異構(gòu)數(shù)據(jù)遷移系統(tǒng)的設(shè)計(jì),分為數(shù)據(jù)源注冊、模式映射與數(shù)據(jù)遷移流程設(shè)計(jì)三個(gè)模塊。
數(shù)據(jù)源注冊分為兩步,首先通過加載數(shù)據(jù)庫廠商提供的驅(qū)動連接數(shù)據(jù)源,然后將數(shù)據(jù)源注冊信息寫入到本地SQLite 數(shù)據(jù)庫中。數(shù)據(jù)源注冊需要的信息包括數(shù)據(jù)源類型、注冊名稱、IP 地址、端口號、DNS 信息、默認(rèn)連接數(shù)據(jù)庫名稱、用戶名與密碼,數(shù)據(jù)源注冊信息的表結(jié)構(gòu)圖如圖 2所示。
3.2.1 建立數(shù)據(jù)字典信息
建立數(shù)據(jù)庫信息、數(shù)據(jù)庫內(nèi)表信息、表內(nèi)字段信息三類數(shù)據(jù)字典信息,并保存到本地SQLite 中,數(shù)據(jù)字典存儲結(jié)構(gòu)如圖3所示。
(1)獲取數(shù)據(jù)源數(shù)據(jù)庫信息,并且寫入到SQLite 的“數(shù)據(jù)庫表”(T_DATABASEINFO)。以O(shè)racle 數(shù)據(jù)庫為例,在Qt 下獲取數(shù)據(jù)源數(shù)據(jù)庫信息的方式為QsqlQuery::exec(“SELECT * FROM USER_USERS”)。
(2)獲取表的信息,并且寫入到SQLite 的“數(shù)據(jù)表表”(T_TABLEINFO)。以O(shè)racle 數(shù)據(jù)庫為例,在Qt 下獲取數(shù)據(jù)源內(nèi)表的信息的方式為:QsqlQuery::exec(“SELECT * FROM USER_TABLES”)。
(3)獲取字段信息,并且寫入到SQLite 的“數(shù)據(jù)字段表”(T_FIELDINFO)。以O(shè)racle 數(shù)據(jù)庫為例,在Qt 下獲取數(shù)據(jù)源內(nèi)字段信息的方式為:QsqlQuery::exec(“SELECT COLUMN_NAME,DATA_TYPE,DATA_LENGTH FROM USER_TAB_COLUMNS WHERE TABLE_NAME = '%1'").arg(strtable)”),其中strtable 為表的名稱。
3.2.2 建立數(shù)據(jù)類型映射關(guān)系
數(shù)據(jù)類型管理對各異構(gòu)數(shù)據(jù)庫中支持的數(shù)據(jù)類型進(jìn)行統(tǒng)一管理,重點(diǎn)根據(jù)各數(shù)據(jù)庫數(shù)據(jù)類型的含義構(gòu)建多元數(shù)據(jù)類型映射關(guān)系,解決從源數(shù)據(jù)庫到目標(biāo)數(shù)據(jù)庫數(shù)據(jù)模式轉(zhuǎn)換時(shí)的類型映射問題。
針對接入到系統(tǒng)中的各異構(gòu)數(shù)據(jù)庫數(shù)據(jù)源,提取其支持的所有數(shù)據(jù)類型,保存到本地SQLite 數(shù)據(jù)庫進(jìn)行統(tǒng)一管理。針對各異構(gòu)數(shù)據(jù)庫中的數(shù)據(jù)類型,按照語義接近的原則在各異構(gòu)數(shù)據(jù)庫間建立數(shù)據(jù)類型映射關(guān)系,解決異構(gòu)數(shù)據(jù)庫模式遷移過程中從源數(shù)據(jù)庫到目標(biāo)數(shù)據(jù)庫的數(shù)據(jù)類型映射問題。根據(jù)異構(gòu)數(shù)據(jù)數(shù)據(jù)類型映射特點(diǎn),將各數(shù)據(jù)源中的通用數(shù)據(jù)類型按照字符型、浮點(diǎn)型、整形、時(shí)間和日期、blob 型分類映射,并將當(dāng)前系統(tǒng)中的映射關(guān)系存儲在本地SQLite 數(shù)據(jù)庫中,各數(shù)據(jù)類型的映射關(guān)系存儲結(jié)構(gòu)如圖 4所示。
異構(gòu)數(shù)據(jù)庫遷移系統(tǒng)包括數(shù)據(jù)抽取、數(shù)據(jù)轉(zhuǎn)換和數(shù)據(jù)裝載三部分,如圖 5所示為異構(gòu)數(shù)據(jù)庫遷移流程。
(1)數(shù)據(jù)抽取。通過數(shù)據(jù)庫訪問接口獲取源數(shù)據(jù)庫A 數(shù)據(jù)字典信息和數(shù)據(jù)信息。
(2)數(shù)據(jù)轉(zhuǎn)換。根據(jù)映射關(guān)系,將數(shù)據(jù)抽取獲取到的源數(shù)據(jù)庫中的數(shù)據(jù)模式和數(shù)據(jù)轉(zhuǎn)換為符合目標(biāo)數(shù)據(jù)庫規(guī)則的數(shù)據(jù)模式和數(shù)據(jù)。
表1:Oracle 到達(dá)夢/天熠數(shù)據(jù)類型映射關(guān)系
表2:遷移系統(tǒng)試驗(yàn)結(jié)果
圖6:異構(gòu)數(shù)據(jù)庫遷移界面
(3)數(shù)據(jù)裝載。將數(shù)據(jù)轉(zhuǎn)換后形成的數(shù)據(jù)模式和數(shù)據(jù)加載到目標(biāo)數(shù)據(jù)庫管理系統(tǒng)中,在目標(biāo)數(shù)據(jù)庫管理系統(tǒng)中形成數(shù)據(jù)庫B,且B 和A 在語義和數(shù)據(jù)上是等價(jià)的。
數(shù)據(jù)遷移模塊將要遷移的數(shù)據(jù)庫數(shù)據(jù)從源數(shù)據(jù)庫中讀出,轉(zhuǎn)換為可被目標(biāo)數(shù)據(jù)庫識別的形式,然后寫入到目標(biāo)數(shù)據(jù)庫中。數(shù)據(jù)遷移位于模式遷移之后,目標(biāo)數(shù)據(jù)庫管理系統(tǒng)中具備了和源數(shù)據(jù)庫管理系統(tǒng)中數(shù)據(jù)模式相同的數(shù)據(jù)庫后,才能進(jìn)行數(shù)據(jù)遷移。對于關(guān)系數(shù)據(jù)庫來說,使用ODBC 標(biāo)準(zhǔn)接口從源數(shù)據(jù)庫中獲取數(shù)據(jù),并按照目標(biāo)數(shù)據(jù)庫所支持的SQL 語句類型生成通用SQL 插入語句,使用ODBC接口執(zhí)行生成的SQL語句,可將數(shù)據(jù)寫入到目標(biāo)數(shù)據(jù)庫中。
實(shí)驗(yàn)采取將Oracle 數(shù)據(jù)遷移到國產(chǎn)數(shù)據(jù)庫達(dá)夢數(shù)據(jù)庫和天熠數(shù)據(jù)庫中,來驗(yàn)證本系統(tǒng)的功能。選取Oracle 中數(shù)據(jù)量超過1000 萬條的18 張表遷移到達(dá)夢數(shù)據(jù)庫中,另外再選取Oracle 中數(shù)據(jù)量不超過1000 萬條的5 張表遷移到天熠數(shù)據(jù)庫中。用戶界面如圖 6所示,在該界面中選擇源數(shù)據(jù)庫、目標(biāo)數(shù)據(jù)庫、數(shù)據(jù)類型映射,系統(tǒng)根據(jù)這些信息完成數(shù)據(jù)庫遷移。
如表1所示為數(shù)據(jù)庫遷移時(shí)設(shè)定的數(shù)據(jù)類型映射關(guān)系。
遷移驗(yàn)證是將目標(biāo)數(shù)據(jù)庫中的數(shù)據(jù)與源數(shù)據(jù)庫進(jìn)行核對,以確保遷移后的數(shù)據(jù)的完整性和正確性。包括核驗(yàn)數(shù)據(jù)總數(shù)與核驗(yàn)記錄內(nèi)容兩個(gè)方面。
(1)核驗(yàn)數(shù)據(jù)總數(shù)。分別查詢源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫中各表中的數(shù)據(jù)記錄總數(shù)量,確認(rèn)目標(biāo)數(shù)據(jù)庫和源數(shù)據(jù)庫中各表數(shù)據(jù)總數(shù)的比值,即完整率。
(2)核驗(yàn)記錄內(nèi)容。對源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫中的數(shù)據(jù)按照主鍵依次進(jìn)行查詢,確認(rèn)目標(biāo)數(shù)據(jù)庫和源數(shù)據(jù)庫中各表數(shù)據(jù)內(nèi)容一致的比率,即準(zhǔn)確率。
使用上述兩種方法,對數(shù)據(jù)遷移前后的源數(shù)據(jù)庫和目標(biāo)數(shù)據(jù)庫數(shù)據(jù)進(jìn)行驗(yàn)證,具體結(jié)果如表2所示。
從實(shí)驗(yàn)結(jié)果可以看出,數(shù)據(jù)遷移過程中數(shù)據(jù)的完整性保持的較好,準(zhǔn)確率略有欠缺,即所有數(shù)據(jù)記錄都進(jìn)行了遷移,但存在部分記錄的數(shù)據(jù)遷移不完整的情況。對從源數(shù)據(jù)庫到目標(biāo)數(shù)據(jù)庫產(chǎn)生偏差的數(shù)據(jù)記錄進(jìn)行分析,發(fā)現(xiàn)錯誤發(fā)生時(shí)Oracle 和達(dá)夢數(shù)據(jù)庫的數(shù)據(jù)類型不完全匹配,達(dá)夢數(shù)據(jù)庫數(shù)據(jù)類型對應(yīng)的數(shù)據(jù)長度偏小,在數(shù)據(jù)載入時(shí)未能將全部數(shù)據(jù)寫入數(shù)據(jù)庫中,但此偏差在系統(tǒng)的允許范圍內(nèi)。
本文針對異構(gòu)數(shù)據(jù)庫環(huán)境下,數(shù)據(jù)庫數(shù)據(jù)共享共用難的問題,對異構(gòu)數(shù)據(jù)庫遷移系統(tǒng)的異構(gòu)性進(jìn)行分析,從數(shù)據(jù)庫模式遷移和數(shù)據(jù)遷移兩方面對異構(gòu)數(shù)據(jù)庫遷移過程進(jìn)行描述,實(shí)現(xiàn)了一種通用的異構(gòu)數(shù)據(jù)庫數(shù)據(jù)遷移方法,解決異構(gòu)數(shù)據(jù)庫數(shù)據(jù)遷移問題,最后本文對設(shè)計(jì)的異構(gòu)數(shù)據(jù)庫遷移系統(tǒng)進(jìn)行了實(shí)驗(yàn)和分析。實(shí)驗(yàn)結(jié)果表明,本設(shè)計(jì)有效解決異構(gòu)數(shù)據(jù)庫遷移問題。