筆者單位新購(gòu)置了數(shù)據(jù)庫(kù)服務(wù)器,為了便于管理、維護(hù)和節(jié)約成本的考慮,需要對(duì)數(shù)據(jù)庫(kù)按功能以及服務(wù)級(jí)別進(jìn)行整合。但部分?jǐn)?shù)據(jù)庫(kù)實(shí)時(shí)性要求時(shí)間性特別強(qiáng),數(shù)據(jù)遷移工作給筆者帶來(lái)不小的挑戰(zhàn)。
為了盡快完成數(shù)據(jù)庫(kù)遷移并盡量減少服務(wù)終止時(shí)間,我們使用了Oracle數(shù)據(jù)庫(kù)提供的數(shù)據(jù)泵(DATA PUMP)工具對(duì)生產(chǎn)數(shù)據(jù)庫(kù)進(jìn)行遷移。
操作系統(tǒng):AIX7.1
數(shù)據(jù)庫(kù):Oracle 12.0.4
遷移工具:DataPump
遷移數(shù)據(jù)庫(kù)表空間:DZGWZDTB、DZGWDOCZDTB
對(duì)于一個(gè)生產(chǎn)系統(tǒng)來(lái)說(shuō),一旦投入使用,應(yīng)用數(shù)據(jù)持續(xù)產(chǎn)生和變化將是必然。對(duì)于系統(tǒng)的切換以及更新,需要很好的工程化方法,也需要多個(gè)應(yīng)用業(yè)務(wù)部門(mén)的協(xié)調(diào)和溝通。因?yàn)閿?shù)據(jù)彼此的關(guān)聯(lián)性已經(jīng)有驅(qū)動(dòng)力效應(yīng),導(dǎo)致越來(lái)越多的系統(tǒng)集成后,某些局部故障引發(fā)的蝴蝶效應(yīng)。
因此,不論是既有系統(tǒng)更新或是新建系統(tǒng)上線與既有系統(tǒng)的整合都需要很好的部門(mén)間協(xié)調(diào)和共同努力來(lái)應(yīng)對(duì)可能的問(wèn)題和挑戰(zhàn)。
對(duì)業(yè)務(wù)及數(shù)據(jù)流的梳理是前期準(zhǔn)備工作的重要方面。切換前的實(shí)驗(yàn)以及切換時(shí)間的確定需要組織級(jí)決策。實(shí)驗(yàn)的目的是輸出良好的自動(dòng)化腳本,減少切換時(shí)間內(nèi)人為錯(cuò)誤的發(fā)生帶來(lái)的服務(wù)終止時(shí)間延續(xù),避免因?yàn)榍袚Q帶來(lái)的災(zāi)難性后果。同時(shí),可以通過(guò)實(shí)驗(yàn)進(jìn)行良好的切換時(shí)間推算和預(yù)算,為組織級(jí)決策提供有效依據(jù)。
測(cè)試中發(fā)現(xiàn)使用數(shù)據(jù)泵進(jìn)行數(shù)據(jù)導(dǎo)出導(dǎo)入時(shí),對(duì)視圖、同義詞以及過(guò)程等沒(méi)有存放在表空間的用戶元數(shù)據(jù)需要進(jìn)行特定步逐來(lái)進(jìn)行,否則會(huì)導(dǎo)致這部分沒(méi)有存放在表空間的用戶元數(shù)據(jù)消失,導(dǎo)致應(yīng)用系統(tǒng)及程序出錯(cuò)。
第一步,創(chuàng)建DIRECTORY,我們可以把DIRECTORY變量理解為EXPDP或者IMPDP導(dǎo)出、導(dǎo)入數(shù)據(jù)泵的工作目錄,它將dump文件、log文件以及SQL文件保存在其中。數(shù)據(jù)泵要求將目錄路徑作為一個(gè)目錄對(duì)象,創(chuàng)建過(guò)程如下所示:
這樣我們就可以在隨后的數(shù)據(jù)導(dǎo)出中使用該目錄對(duì)象進(jìn)行數(shù)據(jù)導(dǎo)出。
使用ALL_DIRECTORIES視圖查看剛剛創(chuàng)建成功的DIRECTORY對(duì) 象,SELECT語(yǔ)句如下所示:
第二步,對(duì)用戶進(jìn)行授權(quán)操作,對(duì)目錄對(duì)象的READ或WRITE權(quán)限僅僅表示Oracle將會(huì)替你讀寫(xiě)這個(gè)文件。
你并沒(méi)有訪問(wèn)Oracle以外文件的權(quán)限,因此使用AIX系統(tǒng)進(jìn)行數(shù)據(jù)泵導(dǎo)入導(dǎo)出時(shí),也需要檢查文件系統(tǒng)指定目錄權(quán)限。操作命令如下:
然后需要在操作系統(tǒng)中使用命令創(chuàng)建指定目錄,并進(jìn)行用戶、屬組以及權(quán)限修改。
第三步,進(jìn)行待導(dǎo)出表空間嚴(yán)格自包含檢查,導(dǎo)出沒(méi)有存放在表空間的用戶元數(shù)據(jù)(視圖、同義詞、過(guò)程等),并將該表空間修改為只讀,執(zhí)行語(yǔ)句如下所示:
出現(xiàn)no rows selected后繼續(xù)執(zhí)行以下的語(yǔ)句,先行導(dǎo)出沒(méi)有存放在表空間的用戶元數(shù)據(jù)(視圖、同義詞、過(guò)程等),執(zhí)行語(yǔ)句如下所示:
然后執(zhí)行表空間修改為只讀屬性語(yǔ)句,執(zhí)行語(yǔ)句如下:
第四步,執(zhí)行表空間的用戶元數(shù)據(jù)導(dǎo)出命令,執(zhí)行語(yǔ)句如下:
完成后系統(tǒng)將在目錄“/data/tmp/dzgw”中生成dzgwzd2017.dmp。
在進(jìn)行完數(shù)據(jù)導(dǎo)出操作后,用戶需要將產(chǎn)生的DMP文件以及表空間對(duì)應(yīng)的數(shù)據(jù)文件按照實(shí)際情況定義的目標(biāo)文件目錄一同傳輸?shù)侥繕?biāo)數(shù)據(jù)庫(kù)所在主機(jī)。
這里基本就是按照規(guī)劃好的目錄結(jié)構(gòu)進(jìn)行數(shù)據(jù)復(fù)制,用戶可以根據(jù)自己喜歡的方式選擇具體工具進(jìn)行文件傳輸。
生產(chǎn)系統(tǒng)中我們還是使用了工程化方法,保證兩臺(tái)數(shù)據(jù)庫(kù)節(jié)點(diǎn)DMP文件及表空間文件目錄名稱(chēng)統(tǒng)一,這樣將減少因此帶來(lái)的不必要的細(xì)節(jié)干擾。
兩個(gè)節(jié)點(diǎn)上數(shù)據(jù)庫(kù)中數(shù)據(jù)文件目錄統(tǒng)一設(shè)置為/data/oradata/ORAXA/datafile/,數(shù)據(jù)泵使用的DIRECTORY目錄統(tǒng)一設(shè)置為/data/tmp/dzgw。
第一步,按照在源數(shù)據(jù)庫(kù)中創(chuàng)建DIRECTORY及授權(quán)操作的方法在目標(biāo)數(shù)據(jù)庫(kù)中創(chuàng)建數(shù)據(jù)泵工具需要的基礎(chǔ)配置。
第二步,目標(biāo)數(shù)據(jù)庫(kù)創(chuàng)建對(duì)應(yīng)Oracle用戶并進(jìn)行授權(quán)操作
根據(jù)源數(shù)據(jù)庫(kù)Oracle用戶信息,在目標(biāo)數(shù)據(jù)庫(kù)中創(chuàng)建該用戶,執(zhí)行命令內(nèi)容如下:
用戶創(chuàng)建完成后繼續(xù)執(zhí)行用戶授權(quán)操作,執(zhí)行命令如下:
第三步,執(zhí)行數(shù)據(jù)泵導(dǎo)入命令導(dǎo)入用戶元數(shù)據(jù),內(nèi)容如下:
導(dǎo)入沒(méi)有存放在表空間的用戶元數(shù)據(jù)(視圖、同義詞、過(guò)程等),執(zhí)行語(yǔ)句如下所示:
第四步,將用戶默認(rèn)表空間指向?qū)氡砜臻g,執(zhí)行命令內(nèi)容如下:
繼續(xù)執(zhí)行命令進(jìn)行表空間狀態(tài)查詢(xún),執(zhí)行命令內(nèi)容如下:
此時(shí)新導(dǎo)入表空間狀態(tài)應(yīng)該為”READ ONLY”狀態(tài)。
第五步,將表空間置為可讀寫(xiě)狀態(tài),完成整個(gè)表空間的遷移任務(wù)。
使用命令修改表空間為可讀寫(xiě)狀態(tài),執(zhí)行命令如下:
至此數(shù)據(jù)庫(kù)遷移工作完成,可以進(jìn)入應(yīng)用測(cè)試和業(yè)務(wù)倒切恢復(fù)。
此次實(shí)際生產(chǎn)系統(tǒng)數(shù)據(jù)庫(kù)使用中對(duì)一個(gè)近80GB的數(shù)據(jù)庫(kù)進(jìn)行遷移用時(shí)2.5小時(shí),和傳統(tǒng)的EXPORT和IMPORT相比縮短近8小時(shí),大大提高了數(shù)據(jù)庫(kù)遷移的時(shí)效性,有效的減少了服務(wù)終止時(shí)間。
基本對(duì)業(yè)務(wù)應(yīng)用用戶沒(méi)有帶來(lái)影響,同時(shí)在測(cè)試中發(fā)現(xiàn)和解決了數(shù)據(jù)泵在導(dǎo)入過(guò)程中出現(xiàn)的表視圖、同義詞以及過(guò)程消失帶來(lái)的應(yīng)用系統(tǒng)錯(cuò)誤問(wèn)題并進(jìn)行了問(wèn)題解決,避免了生產(chǎn)系統(tǒng)中數(shù)據(jù)庫(kù)遷移過(guò)程中可能出現(xiàn)的隱性問(wèn)題。