劉娟
摘要:在實(shí)踐中,一般將容量超過(guò)1T的數(shù)據(jù)庫(kù),稱之為超大型數(shù)據(jù)庫(kù)。在運(yùn)營(yíng)過(guò)程中,經(jīng)常會(huì)遇到不同的需求,需要對(duì)這類數(shù)據(jù)庫(kù)的數(shù)據(jù)進(jìn)行遷移,該文根據(jù)日常運(yùn)營(yíng)實(shí)踐,總結(jié)了對(duì)Oracle超大型數(shù)據(jù)庫(kù)數(shù)據(jù)采用邏輯遷移的解決方案。
關(guān)鍵詞:數(shù)據(jù)庫(kù);邏輯;遷移;數(shù)據(jù)泵
中圖分類號(hào):TP391 文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1009-3044(2016)30-0007-02
通信企業(yè)為了支撐業(yè)務(wù)發(fā)展和企業(yè)日常管理的需要,建設(shè)了規(guī)模龐大的IT系統(tǒng)。為了保障IT系統(tǒng)的長(zhǎng)期穩(wěn)定高效的運(yùn)轉(zhuǎn),在日常運(yùn)營(yíng)過(guò)程中,常常會(huì)遇到服務(wù)器硬件升級(jí)擴(kuò)容、系統(tǒng)軟件升級(jí)等需求。為了完成這些需求,通常會(huì)對(duì)數(shù)據(jù)進(jìn)行遷移,需要遷移的數(shù)據(jù)規(guī)模從幾百G到超過(guò)10T。在長(zhǎng)期的運(yùn)營(yíng)實(shí)踐中,作者總結(jié)了一套完善、成熟的數(shù)據(jù)遷移方法論,通過(guò)該方法論,成功完成了大量系統(tǒng)的數(shù)據(jù)遷移,累計(jì)實(shí)現(xiàn)數(shù)據(jù)遷移規(guī)模超過(guò)100T,有效的支撐了系統(tǒng)穩(wěn)定高效的運(yùn)轉(zhuǎn)。
1 不同遷移方法的對(duì)比
數(shù)據(jù)遷移通??梢圆捎梦锢砗瓦壿媰煞N不同的方法,兩種方法的對(duì)比見表1。
隨著x86硬件平臺(tái)的性能提高和成熟、Linux系統(tǒng)的穩(wěn)定、以及基于x86平臺(tái)虛擬化技術(shù)的發(fā)展,將會(huì)越來(lái)越多地出現(xiàn)將數(shù)據(jù)從小型機(jī)平臺(tái)遷移到x86平臺(tái)的需求,在這種情況下,邏輯遷移是最常用的一種遷移方法。本文重點(diǎn)討論邏輯遷移的方法。
2 數(shù)據(jù)遷移準(zhǔn)備工作
遷移前期需要完成的準(zhǔn)備工作主要包括以下內(nèi)容:目標(biāo)主機(jī)數(shù)據(jù)庫(kù)軟件的安裝、創(chuàng)建數(shù)據(jù)庫(kù)、創(chuàng)建表空間以及下面的檢查工作(注意目標(biāo)數(shù)據(jù)庫(kù)在遷移完成之前需要置為非歸檔模式)。
3 詳細(xì)遷移步驟
為了減少邏輯遷移過(guò)程中的系統(tǒng)停機(jī)時(shí)間,需要對(duì)數(shù)據(jù)先進(jìn)行分類,部分歷史或者靜態(tài)數(shù)據(jù)在正式遷移前先行導(dǎo)入到目標(biāo)數(shù)據(jù)庫(kù)中,盡量縮小正式遷移過(guò)程中的數(shù)據(jù)量。
10g以前的版本由于無(wú)數(shù)據(jù)泵技術(shù),所以分兩種情況討論。
3.1 Oracle 9i(包括9i)之前版本數(shù)據(jù)遷移
Oracle 9i(包括9i)之前版本數(shù)據(jù)遷移采用Export/Import+DB Link方式,主要步驟為先利用Export/Import導(dǎo)出、導(dǎo)入用戶元數(shù)據(jù),再采用DB Link方式插入數(shù)據(jù)。不直接采用Import導(dǎo)入數(shù)據(jù),主要原因是Import是串行執(zhí)行,且如果中途報(bào)錯(cuò),導(dǎo)入過(guò)程要整體回退,不容易掌控導(dǎo)入的進(jìn)度;而采用數(shù)據(jù)庫(kù)鏈接插入數(shù)據(jù)的方式則可以避免這些問(wèn)題。
1) 在目標(biāo)庫(kù)上設(shè)置參數(shù)job_queue_processes為0,暫停目標(biāo)數(shù)據(jù)庫(kù)job的執(zhí)行。
2) 比照源數(shù)據(jù)庫(kù),在目標(biāo)數(shù)據(jù)庫(kù)上創(chuàng)建用戶、角色和profile,并將相關(guān)權(quán)限授予角色和用戶。
3) 在源庫(kù)上批量生成需要遷移的用戶元數(shù)據(jù)導(dǎo)出腳本。
4) 在源庫(kù)上批量生成目標(biāo)庫(kù)導(dǎo)入用戶元數(shù)據(jù)的腳本。導(dǎo)入后,注意需要更新JOB$表來(lái)更正JOB導(dǎo)入的問(wèn)題。
5) 檢查對(duì)象總數(shù)、無(wú)效對(duì)象。首先在目標(biāo)庫(kù)上執(zhí)行無(wú)效對(duì)象編譯的腳本:@?/rdbms/admin/utlrp.sql然后對(duì)比目標(biāo)庫(kù)和源庫(kù)的遷移用戶的對(duì)象總數(shù)、無(wú)效對(duì)象數(shù),是否有遺漏和不一致,在進(jìn)行針對(duì)性的補(bǔ)充。
6) 通過(guò)數(shù)據(jù)庫(kù)鏈接插入數(shù)據(jù)。關(guān)閉應(yīng)用,在源庫(kù)上設(shè)置job_processes=0停止所有JOB運(yùn)行,在源庫(kù)上創(chuàng)建一個(gè)端口號(hào)為1526的監(jiān)聽,停掉原來(lái)的端口號(hào)為1521的監(jiān)聽,避免有應(yīng)用連接;插入數(shù)據(jù)前,再次確認(rèn)表上是否有觸發(fā)器,如果有,做好記錄后將其刪除。
7) 利用第三方工具,產(chǎn)生序列創(chuàng)建腳本,并傳輸?shù)侥繕?biāo)庫(kù)上直接執(zhí)行。
8) 利用第三方工具,產(chǎn)生索引創(chuàng)建腳本,并對(duì)腳本進(jìn)行修改,增加nologging、parallel選項(xiàng),加快索引創(chuàng)建速度,并傳輸?shù)侥繕?biāo)庫(kù)上直接執(zhí)行,執(zhí)行完畢后,再取消并行,恢復(fù)logging模式。
9) 利用第三方工具,產(chǎn)生約束創(chuàng)建腳本,并傳輸?shù)侥繕?biāo)庫(kù)上直接執(zhí)行,注意主鍵和外鍵分開執(zhí)行,先創(chuàng)建主鍵約束,再創(chuàng)建外鍵約束,兩者不能同時(shí)執(zhí)行。
10) 利用第三方工具,產(chǎn)生觸發(fā)器創(chuàng)建腳本,并傳輸?shù)侥繕?biāo)庫(kù)上直接執(zhí)行。
11) 收集相關(guān)統(tǒng)計(jì)信息。
3.2 Oracle 10g之后版本數(shù)據(jù)遷移
在Oracle 10g以后的版本,由于數(shù)據(jù)泵技術(shù)的出現(xiàn),可以直接在數(shù)據(jù)泵中使用并行,可以簡(jiǎn)化遷移的步驟。
1) 設(shè)置參數(shù)job_queue_processes為0,暫停新舊數(shù)據(jù)庫(kù)job的執(zhí)行。
2) 使用IMPDP直接按照用戶遷移數(shù)據(jù)。
使用數(shù)據(jù)泵,采用DB Link的方式,開啟并行遷移數(shù)據(jù),如果一個(gè)用戶數(shù)據(jù)量特別大,尤其是有特別大的表,可以將該表排除,或者將一個(gè)用戶的表分割成多個(gè)IMPDP腳本執(zhí)行:
impdp system/**** network_link=dl_old_db schemas=testuser directory=dir1 parallel=4 logfile=testuser.log
3) 按用戶遷移數(shù)據(jù)完畢后檢查用戶的對(duì)象權(quán)限、角色權(quán)限是否有缺失,并進(jìn)行補(bǔ)充。
4) 檢查表和索引是否開啟了并行,如果有進(jìn)行關(guān)閉。
5) 編譯失效對(duì)象。
6) 檢查是否有失效的組件。
7) 恢復(fù)job參數(shù)。
8) 收集統(tǒng)計(jì)信息。
3.3 數(shù)據(jù)遷移的后續(xù)操作
應(yīng)用啟動(dòng)后,標(biāo)志著整個(gè)遷移工作已經(jīng)完成絕大部分。但是仍然有以下幾個(gè)重要步驟需要完成。
1) 調(diào)整JOB定時(shí)任務(wù)。
根據(jù)業(yè)務(wù)需要,某些定時(shí)任務(wù)只能在特定時(shí)間啟動(dòng),可能需要調(diào)整定時(shí)任務(wù)的啟動(dòng)時(shí)間。
2) 復(fù)制腳本以及創(chuàng)建cron任務(wù)。
將源庫(kù)上的以cron方式調(diào)用的定時(shí)任務(wù)以及相應(yīng)的腳本復(fù)制到目標(biāo)庫(kù)主機(jī)上。
3) 對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份。
將目標(biāo)庫(kù)設(shè)置為歸檔模式,在目標(biāo)庫(kù)安裝備份軟件,對(duì)數(shù)據(jù)庫(kù)進(jìn)行備份。
4) 如果數(shù)據(jù)庫(kù)使用了GoldenGate等第三方復(fù)制軟件,需要在目標(biāo)庫(kù)上重新配置。
4 遷移測(cè)試及回退
由于遷移操作步驟較多,操作較復(fù)雜,必須進(jìn)行測(cè)試和演練,確保方案可行,保證能夠在既定的停機(jī)時(shí)間內(nèi)完成遷移。
由于遷移過(guò)程不影響源生產(chǎn)庫(kù)。因此,可以按本方案,將所有的操作進(jìn)行一次演練。 除了應(yīng)用切換之外,其他步驟均可進(jìn)行測(cè)試和演練。
如果在正式遷移時(shí),發(fā)生不能修復(fù)的并且嚴(yán)重影響遷移的問(wèn)題,需要切換回原生產(chǎn)庫(kù),根據(jù)不同的情況進(jìn)行相應(yīng)的操作:
l 如果應(yīng)用沒(méi)有啟動(dòng),因?yàn)闆](méi)有對(duì)原生產(chǎn)庫(kù)做任何改動(dòng),那么不需要做任何其他的步驟,直接啟動(dòng)應(yīng)用,保持現(xiàn)狀即可。
l 如果應(yīng)用已經(jīng)啟動(dòng),則需要將應(yīng)用切換回原生產(chǎn)庫(kù)。并將在目標(biāo)庫(kù)上發(fā)生的新的業(yè)務(wù)數(shù)據(jù)改動(dòng)應(yīng)用到原生產(chǎn)庫(kù)中。為了避免數(shù)據(jù)改動(dòng)過(guò)大,建議應(yīng)用啟動(dòng)和測(cè)試時(shí)分步進(jìn)行,首先進(jìn)行查詢型的業(yè)務(wù)操作測(cè)試,避免事務(wù)型的業(yè)務(wù)操作。
5 遷移方法總結(jié)
對(duì)超大型數(shù)據(jù)庫(kù)的數(shù)據(jù)遷移采用邏輯方式,不論是采用Export/Import、數(shù)據(jù)庫(kù)鏈接還是采用數(shù)據(jù)泵,都需要重點(diǎn)考慮以下幾個(gè)問(wèn)題:
l 要遷移的數(shù)據(jù)量有多少?
l 是否能夠按照歷史/靜態(tài)數(shù)據(jù)、動(dòng)態(tài)數(shù)據(jù)對(duì)數(shù)據(jù)進(jìn)行分類?是否能對(duì)部分垃圾或者歷史數(shù)據(jù)進(jìn)行清理?
l 遷移過(guò)程中使用的網(wǎng)絡(luò)帶寬是100M還是1000M?這個(gè)因素直接影響遷移的速度。
l 遷移的數(shù)據(jù)表上索引、約束、觸發(fā)器的數(shù)量?
l 業(yè)務(wù)最長(zhǎng)停機(jī)時(shí)間是多少?
對(duì)遷移方案和過(guò)程的選擇,要充分考慮以上因素,盡量縮短數(shù)據(jù)遷移的時(shí)間,對(duì)創(chuàng)建索引和約束要留夠充足的時(shí)間,并對(duì)準(zhǔn)備好的遷移方案在測(cè)試環(huán)境進(jìn)行充分的測(cè)試和驗(yàn)證,如果涉及版本的升級(jí),還需要對(duì)應(yīng)用進(jìn)行兼容性的測(cè)試,在確保穩(wěn)妥可靠以后,再進(jìn)行正式的數(shù)據(jù)遷移。