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