金弟,邵萌珠,何嘉誠(chéng),葉月明,王宗仁
(中國(guó)石油杭州地質(zhì)研究院計(jì)算機(jī)應(yīng)用研究所,浙江杭州 310023)
地震資料處理平臺(tái)是油氣勘探開發(fā)領(lǐng)域重要的科研裝備[1-2],對(duì)油氣井位部署和規(guī)模油氣藏發(fā)現(xiàn)起到重要作用。杭州地質(zhì)研究院是以海相海洋為特色的中國(guó)石油下屬油氣勘探研究院,開展國(guó)內(nèi)外油氣勘探地震資料目標(biāo)處理研究。隨著油氣勘探深入開展,需對(duì)現(xiàn)有地震資料處理平臺(tái)的數(shù)據(jù)庫(kù)系統(tǒng)進(jìn)行升級(jí)改造,為了有高性價(jià)比以及快速有效方便完整進(jìn)行數(shù)據(jù)庫(kù)遷移,提出將Oracle 數(shù)據(jù)庫(kù)[3-4]遷移到PostgreSQL 數(shù)據(jù)庫(kù)[5-7]的數(shù)據(jù)遷移解決方案。為油氣勘探開發(fā)領(lǐng)域的數(shù)據(jù)庫(kù)數(shù)據(jù)遷移提供借鑒參考。
現(xiàn)有地震資料處理的Oracle 數(shù)據(jù)庫(kù)系統(tǒng)共有OPM、OCM、RDM 等7 個(gè)數(shù)據(jù)庫(kù)實(shí)例,涉及的處理工區(qū)有常規(guī)處理、交互式處理、時(shí)間偏移、深度偏移四種地震工區(qū)類型[8]。如圖1 所示,整個(gè)數(shù)據(jù)庫(kù)系統(tǒng)數(shù)據(jù)組織架構(gòu)以地震項(xiàng)目工區(qū)為核心,每個(gè)地震項(xiàng)目工區(qū)在物理上對(duì)應(yīng)一個(gè)表空間,邏輯上對(duì)應(yīng)一個(gè)Schema,每個(gè)Schema 對(duì)應(yīng)所屬的數(shù)據(jù)庫(kù)對(duì)象集。
圖1 地震資料處理數(shù)據(jù)組織邏輯結(jié)構(gòu)
可以看出,數(shù)據(jù)庫(kù)數(shù)據(jù)組織結(jié)構(gòu)具有多數(shù)據(jù)庫(kù)實(shí)例、多地震項(xiàng)目工區(qū)類型、多Schema、多數(shù)據(jù)庫(kù)對(duì)象、多數(shù)據(jù)變化等特點(diǎn)。這些特點(diǎn)增加了數(shù)據(jù)庫(kù)數(shù)據(jù)遷移過(guò)程的復(fù)雜性,提升了對(duì)數(shù)據(jù)遷移完整性的要求,是數(shù)據(jù)庫(kù)數(shù)據(jù)遷移的難點(diǎn)所在。也是在設(shè)計(jì)數(shù)據(jù)遷移方案時(shí),重點(diǎn)需要解決的關(guān)鍵性問(wèn)題。
通過(guò)上述對(duì)地震資料處理平臺(tái)Oracle 數(shù)據(jù)庫(kù)數(shù)據(jù)組織邏輯結(jié)構(gòu)的闡述與分析,數(shù)據(jù)庫(kù)系統(tǒng)有多個(gè)數(shù)據(jù)庫(kù)實(shí)例和一定規(guī)模數(shù)量不同類型的地震資料處理項(xiàng)目工區(qū)Schema。
數(shù)據(jù)庫(kù)數(shù)據(jù)遷移以地震資料處理項(xiàng)目工區(qū)為一個(gè)邏輯遷移單位,數(shù)據(jù)庫(kù)數(shù)據(jù)遷移方法的核心思想是采用模板機(jī)制方法設(shè)計(jì)來(lái)解決。
1)分析源數(shù)據(jù)庫(kù)系統(tǒng)中數(shù)據(jù)庫(kù)實(shí)例層的數(shù)據(jù)組織結(jié)構(gòu),構(gòu)建數(shù)據(jù)庫(kù)實(shí)例級(jí)模板及相關(guān)參數(shù),分析源數(shù)據(jù)庫(kù)系統(tǒng)的不同地震項(xiàng)目工區(qū)層的數(shù)據(jù)組織結(jié)構(gòu),構(gòu)建地震工區(qū)級(jí)模板及相關(guān)參數(shù),完成二類模板構(gòu)建及參數(shù)選擇。
2)設(shè)計(jì)模板轉(zhuǎn)換程序,針對(duì)具體的數(shù)據(jù)庫(kù)實(shí)例名稱、項(xiàng)目工區(qū)類型、項(xiàng)目工區(qū)名稱等參數(shù)輸入完成模板到項(xiàng)目工區(qū)級(jí)數(shù)據(jù)遷移的SQL 執(zhí)行腳本集。
3)根據(jù)SQL 執(zhí)行腳本集完成數(shù)據(jù)庫(kù)數(shù)據(jù)遷移和數(shù)據(jù)完整性、一致性檢查。數(shù)據(jù)遷移技術(shù)流程如圖2所示。
圖2 數(shù)據(jù)遷移技術(shù)流程
隨著地震資料處理平臺(tái)長(zhǎng)期使用和地震資料處理項(xiàng)目工區(qū)增多,7 個(gè)數(shù)據(jù)庫(kù)實(shí)例與不同地震項(xiàng)目工區(qū)的組合在源數(shù)據(jù)庫(kù)系統(tǒng)中產(chǎn)生大量的Schema,每個(gè)Schema 又產(chǎn)生眾多所屬的數(shù)據(jù)庫(kù)對(duì)象集,因此源數(shù)據(jù)庫(kù)系統(tǒng)的各個(gè)數(shù)據(jù)庫(kù)實(shí)例中具有Schema 數(shù)量的動(dòng)態(tài)變化和數(shù)據(jù)庫(kù)對(duì)象集合的數(shù)量規(guī)模不確定性等特性,通過(guò)模板機(jī)制能很好地解決這些問(wèn)題。
針對(duì)7 個(gè)數(shù)據(jù)庫(kù)實(shí)例設(shè)計(jì)7 個(gè)數(shù)據(jù)庫(kù)實(shí)例級(jí)的模板。如圖3,針對(duì)四種地震資料處理項(xiàng)目工區(qū)類型設(shè)計(jì)四類地震項(xiàng)目工區(qū)級(jí)模板,針對(duì)每個(gè)數(shù)據(jù)庫(kù)實(shí)例模板和每類地震項(xiàng)目工區(qū)類型的特點(diǎn),結(jié)合對(duì)應(yīng)地震項(xiàng)目工區(qū)Schema 中的數(shù)據(jù)庫(kù)對(duì)象類型,每類地震項(xiàng)目工區(qū)級(jí)模板由若干數(shù)據(jù)庫(kù)對(duì)象子模板構(gòu)成,結(jié)合模板的參數(shù)選擇實(shí)現(xiàn)模板到可執(zhí)行遷移腳本程序集的生成。
遷移工具主要由SQL 模板集、Perl[9]轉(zhuǎn)換程序、SQL 腳本集等構(gòu)成。
1)SQL 模板實(shí)現(xiàn)在1.3 節(jié)闡述的各類模板。
2)Perl 轉(zhuǎn)換程序是遷移工具的主程序執(zhí)行代碼,主要包括把SQL 模板轉(zhuǎn)換成SQL 腳本集和執(zhí)行SQL 腳本集兩項(xiàng)功能。
圖3 二類模板創(chuàng)建與執(zhí)行腳本生成關(guān)系
3)SQL 腳本集分為創(chuàng)建、拷貝、修改三種類型,創(chuàng)建類SQL 腳本主要完成表、序列、視圖、觸發(fā)器等數(shù)據(jù)庫(kù)對(duì)象的創(chuàng)建功能,拷貝類SQL 腳本完成對(duì)應(yīng)數(shù)據(jù)庫(kù)對(duì)象的實(shí)體數(shù)據(jù)從源數(shù)據(jù)庫(kù)系統(tǒng)服務(wù)器遷移到目標(biāo)數(shù)據(jù)庫(kù)系統(tǒng)服務(wù)器,修改類SQL 腳本通過(guò)追加約束、索引等數(shù)據(jù)庫(kù)操作修改數(shù)據(jù)庫(kù)的地震資料處理項(xiàng)目工區(qū)相關(guān)聯(lián)的Schema 所屬數(shù)據(jù)庫(kù)對(duì)象集。
該節(jié)以O(shè)PM 為數(shù)據(jù)庫(kù)實(shí)例,某海域的一個(gè)時(shí)間偏移地震項(xiàng)目工區(qū)作為數(shù)據(jù)遷移案例。源數(shù)據(jù)庫(kù)系統(tǒng)為2010 年建設(shè)的Oracle 數(shù)據(jù)庫(kù),目標(biāo)數(shù)據(jù)庫(kù)系統(tǒng)為2022 年建設(shè)的PostgrepSQL,源數(shù)據(jù)庫(kù)與目標(biāo)數(shù)據(jù)庫(kù)的遷移環(huán)境如表1所示,案例數(shù)據(jù)信息如表2所示。
表1 數(shù)據(jù)遷移環(huán)境
表2 案例數(shù)據(jù)信息
2.1.1 遷移數(shù)據(jù)備份
在進(jìn)行數(shù)據(jù)遷移之前,為了解決在數(shù)據(jù)遷移過(guò)程中出現(xiàn)數(shù)據(jù)缺失、數(shù)據(jù)錯(cuò)誤導(dǎo)致數(shù)據(jù)無(wú)法恢復(fù)的問(wèn)題,需對(duì)源數(shù)據(jù)庫(kù)系統(tǒng)Oracle 進(jìn)行備份。由于遷移數(shù)據(jù)以地震資料處理項(xiàng)目工區(qū)為遷移單位,因此需要對(duì)遷移的項(xiàng)目工區(qū)進(jìn)行備份。在源數(shù)據(jù)庫(kù)服務(wù)器上,利用Oracle Export 工具[10]對(duì)該項(xiàng)目工區(qū)對(duì)應(yīng)的Schema 的數(shù)據(jù)庫(kù)對(duì)象集合進(jìn)行邏輯備份。
2.1.2 Oracle_FDW安裝配置與互連
數(shù)據(jù)遷移工作需要在目標(biāo)數(shù)據(jù)庫(kù)服務(wù)器上對(duì)源數(shù)據(jù)庫(kù)服務(wù)器執(zhí)行遠(yuǎn)程數(shù)據(jù)遷移任務(wù),通過(guò)PostgreSQL 的 Oralce_FDW(ForeignDataWrapper for Oracle Database)[11]方式創(chuàng)建源數(shù)據(jù)庫(kù)系統(tǒng)與目標(biāo)數(shù)據(jù)庫(kù)系統(tǒng)互連數(shù)據(jù)遷移通道。目標(biāo)數(shù)據(jù)庫(kù)服務(wù)器需要進(jìn)行如下安裝配置:
2.2.1 創(chuàng)建OPM數(shù)據(jù)庫(kù)實(shí)例模板
在目標(biāo)數(shù)據(jù)庫(kù)服務(wù)器上,OPM 數(shù)據(jù)庫(kù)實(shí)例創(chuàng)建主要包括兩項(xiàng)功能,一是創(chuàng)建OPM 數(shù)據(jù)庫(kù)用戶名、實(shí)例名以及相關(guān)授權(quán)操作,二是創(chuàng)建OPM 數(shù)據(jù)庫(kù)用戶對(duì)應(yīng)的Schema 數(shù)據(jù)庫(kù)對(duì)象集合。下面為OPM 數(shù)據(jù)庫(kù)實(shí)例模板中創(chuàng)建數(shù)據(jù)庫(kù)的部分SQL 代碼,其中$dbuser、$dbpassword 等以$開頭的為參數(shù)輸入(下同):
2.2.2 生成創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例執(zhí)行SQL腳本
通過(guò)轉(zhuǎn)換程序模塊把OPM 數(shù)據(jù)庫(kù)實(shí)例模板轉(zhuǎn)換成可執(zhí)行的SQL 腳本,以下為轉(zhuǎn)換程序函數(shù)調(diào)用入口:
PGUtils 是轉(zhuǎn)換程序工具包,ConvertToDBSQL 函數(shù)共有5 個(gè)參數(shù)。第一個(gè)參數(shù)為OPM 數(shù)據(jù)庫(kù)實(shí)例模板;第二個(gè)參數(shù)為除模板之外新追加的執(zhí)行程序代碼變化部分;第三個(gè)參數(shù)為轉(zhuǎn)換成可執(zhí)行的SQL 腳本的存儲(chǔ)位置;第四個(gè)參數(shù)為模板中需要被替換的部分參數(shù)列表,一般是$開頭的參數(shù),如$dbuser 等;第五個(gè)參數(shù)為實(shí)際替換的具體參數(shù)值列表,如hzopm001。
2.3.1 動(dòng)態(tài)構(gòu)建時(shí)間偏移地震項(xiàng)目工區(qū)模板
針對(duì)源數(shù)據(jù)庫(kù)服務(wù)器,根據(jù)地震項(xiàng)目工區(qū)模板類型、源數(shù)據(jù)庫(kù)的OPM 數(shù)據(jù)庫(kù)名稱、源OPM 數(shù)據(jù)庫(kù)中被遷移的Schema 名稱,生成該Schema 對(duì)應(yīng)的數(shù)據(jù)庫(kù)對(duì)象集數(shù)據(jù),為轉(zhuǎn)換程序生成最后的數(shù)據(jù)庫(kù)對(duì)象創(chuàng)建提供源數(shù)據(jù)庫(kù)對(duì)象信息。在hzopm001 數(shù)據(jù)庫(kù)實(shí)例中,ZZ99 項(xiàng)目工區(qū)對(duì)應(yīng)的Schema 主要包括表、視圖、序列、角色、觸發(fā)器等數(shù)據(jù)庫(kù)對(duì)象類型。模板生成信息函數(shù)如下:
2.3.2 地震項(xiàng)目工區(qū)數(shù)據(jù)庫(kù)對(duì)象創(chuàng)建
在已經(jīng)創(chuàng)建目標(biāo)數(shù)據(jù)庫(kù)服務(wù)器的OPM 數(shù)據(jù)庫(kù)實(shí)例中,完成批量自動(dòng)創(chuàng)建地震項(xiàng)目工區(qū)對(duì)應(yīng)的表空間、用戶、權(quán)限等。對(duì)于一些特殊的數(shù)據(jù)庫(kù)對(duì)象集,如數(shù)據(jù)庫(kù)對(duì)象索引index、約束constraint、序列sequence 等與源數(shù)據(jù)庫(kù)對(duì)應(yīng)不一致,需要在目標(biāo)數(shù)據(jù)庫(kù)系統(tǒng)中額外重建。
如在模板數(shù)據(jù)庫(kù)對(duì)象集中,對(duì)地震項(xiàng)目工區(qū)輸入表PROJECT_INPUT_DATA、作業(yè)運(yùn)行狀態(tài)視圖JOB_RUN_VIEW 等自動(dòng)創(chuàng)建,而相關(guān)索引、約束、序列需另外重建。
完成創(chuàng)建數(shù)據(jù)庫(kù)實(shí)例OPM 和時(shí)間偏移地震項(xiàng)目工區(qū)ZZ99,對(duì)應(yīng)Schema 所屬數(shù)據(jù)庫(kù)對(duì)象集的元信息在目標(biāo)數(shù)據(jù)庫(kù)服務(wù)器中構(gòu)建生成,開始進(jìn)入用戶數(shù)據(jù)的遷移工作。由于源數(shù)據(jù)庫(kù)系統(tǒng)中數(shù)據(jù)對(duì)象集的元數(shù)據(jù)結(jié)構(gòu)動(dòng)態(tài)變化,在遷移數(shù)據(jù)的過(guò)程中,采用動(dòng)態(tài)獲取數(shù)據(jù)庫(kù)對(duì)象的元數(shù)據(jù)結(jié)構(gòu)信息方法。
以數(shù)據(jù)庫(kù)對(duì)象table 為例,遷移過(guò)程方法如下:
1)輸入Schema 名稱、Tables 名稱,從源數(shù)據(jù)庫(kù)系統(tǒng)中動(dòng)態(tài)獲取Table 的元數(shù)據(jù)結(jié)構(gòu)信息:
2)根據(jù)動(dòng)態(tài)獲取的源數(shù)據(jù)庫(kù)系統(tǒng)中table 對(duì)應(yīng)的數(shù)據(jù)結(jié)構(gòu)信息,實(shí)現(xiàn)Table 中的源數(shù)據(jù)庫(kù)系統(tǒng)用戶數(shù)據(jù)遷移到對(duì)應(yīng)的目標(biāo)數(shù)據(jù)庫(kù)系統(tǒng)中:
3)在遷移的過(guò)程中,參照文獻(xiàn)[12-13]的方法解決數(shù)據(jù)轉(zhuǎn)換過(guò)程錯(cuò)誤、數(shù)據(jù)類型不一致、目標(biāo)數(shù)據(jù)庫(kù)字段信息不一致等常見問(wèn)題。
數(shù)據(jù)遷移時(shí)在多臺(tái)機(jī)器上執(zhí)行多個(gè)任務(wù),并通過(guò)網(wǎng)絡(luò)傳送大量數(shù)據(jù),不可避免會(huì)出現(xiàn)錯(cuò)誤[14]。需要對(duì)數(shù)據(jù)遷移結(jié)果的一致性與完整性進(jìn)行檢查,主要從數(shù)據(jù)庫(kù)對(duì)象的數(shù)量、數(shù)據(jù)庫(kù)對(duì)象存儲(chǔ)的數(shù)據(jù)量以及地震資料處理應(yīng)用軟件獲取數(shù)據(jù)庫(kù)數(shù)據(jù)效果三個(gè)方面進(jìn)行。
2.5.1 數(shù)據(jù)庫(kù)對(duì)象數(shù)量
在源數(shù)據(jù)庫(kù)系統(tǒng)中,向系統(tǒng)表user_objects 中獲取所有的數(shù)據(jù)庫(kù)對(duì)象類型及其對(duì)應(yīng)的數(shù)據(jù)庫(kù)對(duì)象數(shù)量,然后與目標(biāo)數(shù)據(jù)庫(kù)進(jìn)行對(duì)比,確保數(shù)據(jù)遷移到目標(biāo)數(shù)據(jù)庫(kù)的數(shù)據(jù)庫(kù)對(duì)象類型、數(shù)據(jù)庫(kù)對(duì)象數(shù)量不丟失遺漏。圖4為使用Oracle sqlplus和PostgreSQL psql 分別統(tǒng)計(jì)的數(shù)據(jù)庫(kù)對(duì)象數(shù)量排名前五的源數(shù)據(jù)庫(kù)與目標(biāo)數(shù)據(jù)庫(kù)的對(duì)象數(shù)量對(duì)比。
圖4 數(shù)據(jù)遷移前后數(shù)據(jù)庫(kù)對(duì)象數(shù)量對(duì)比
2.5.2 數(shù)據(jù)庫(kù)數(shù)據(jù)量
地震資料處理涉及海量的地震資料采集文件數(shù)據(jù)、中間生成文件數(shù)據(jù)以及成果文件數(shù)據(jù),這些文件數(shù)據(jù)信息主要存放在帶有dataset 標(biāo)識(shí)的相關(guān)表中,是核心數(shù)據(jù)信息之一。圖5 列舉了這些核心數(shù)據(jù)量排名前五的數(shù)據(jù)遷移前后的對(duì)比。
圖5 數(shù)據(jù)遷移前后數(shù)據(jù)庫(kù)數(shù)據(jù)數(shù)量對(duì)比
2.5.3 應(yīng)用軟件實(shí)效
圖6 是遷移前基于Oracle 的Omega2011 應(yīng)用中,舊地震項(xiàng)目工區(qū)ZZ98的25個(gè)有效地震資料處理作業(yè)流程。圖7是遷移后基于PostgreSQL的Omega2021 應(yīng)用中[15-19],新地震項(xiàng)目工區(qū)ZZ99 的25 個(gè)有效地震資料處理作業(yè)流程。數(shù)據(jù)庫(kù)遷移前后確保相同的作業(yè)流程名和個(gè)數(shù),而且Oracle數(shù)據(jù)庫(kù)中的非活動(dòng)的無(wú)效作業(yè)流程(標(biāo)識(shí)打×)沒有遷移到PostgreSQL數(shù)據(jù)庫(kù)系統(tǒng)中。
圖6 遷移前基于Oracle的Omega2011應(yīng)用
圖7 遷移后基于PostgreSQL的Omega2021應(yīng)用
基于地震資料處理平臺(tái)的數(shù)據(jù)庫(kù)遷移是油氣勘探行業(yè)科研裝備更新?lián)Q代的重要一環(huán),在地震資料并行處理應(yīng)用軟件Omeg 的應(yīng)用場(chǎng)景下,文中給出的從Oracle 數(shù)據(jù)庫(kù)系統(tǒng)向PostgreSQL 數(shù)據(jù)庫(kù)系統(tǒng)遷移的方法和工具取得了很好的效果。但是在整個(gè)遷移過(guò)程中,還存在著手動(dòng)人工干預(yù)操作,如何從源數(shù)據(jù)庫(kù)系統(tǒng)中自動(dòng)智能化獲取全面的元數(shù)據(jù)信息,并能自我糾錯(cuò)地生成對(duì)應(yīng)的目標(biāo)數(shù)據(jù)庫(kù)系統(tǒng)元信息,遷移解決方案適用到更多的地震資料并行處理應(yīng)用軟件的應(yīng)用場(chǎng)景中,這些都是今后下一步研究的方向和內(nèi)容。