oracle 數(shù)據(jù)庫(kù)數(shù)據(jù)遷移解決方案
去年年底做了不少系統(tǒng)的數(shù)據(jù)遷移,大部分系統(tǒng)由于平臺(tái)和版本的原因,做的是邏輯遷移,少部分做的是物理遷移,有一些心得體會(huì),與大家分享。
首先說(shuō)說(shuō)遷移流程,在遷移之前,寫(xiě)好方案,特別是實(shí)施的方案步驟一定要寫(xiě)清楚,然后進(jìn)行完整的測(cè)試。我們?cè)谶w移時(shí),有的系統(tǒng)測(cè)試了四五次,通過(guò)測(cè)試來(lái)完善方案和流程。
針對(duì)物理遷移,也即通過(guò)RMAN備份來(lái)進(jìn)行還原并應(yīng)用歸檔的方式(這里不討論通過(guò)dd方式進(jìn)行的冷遷移),雖然注意的是要將數(shù)據(jù)庫(kù)設(shè)為force logging的方式,在用RMAN做全備之前,一定要執(zhí)行:
否則可能會(huì)產(chǎn)生壞塊。
對(duì)于邏輯遷移,在job_processes設(shè)置為>0的數(shù)值之前,注意job的下次執(zhí)行時(shí)間和job所屬用戶。比如job的定義在之前已經(jīng)導(dǎo)入,但是在遷移之時(shí),job已經(jīng)運(yùn)行過(guò),那么遷移完成之后,job的下次時(shí)間還是原來(lái)的時(shí)間,這樣可能會(huì)重復(fù)運(yùn)行。另外,job通過(guò)IMP導(dǎo)入后,job所屬用戶會(huì)變成導(dǎo)入用戶的名稱,顯然job原來(lái)的用戶就不能對(duì)JOB進(jìn)行管理了,可以通過(guò)下面的sql進(jìn)行修改:
在遷移之前,應(yīng)該禁止對(duì)系統(tǒng)進(jìn)行結(jié)構(gòu)上的修改和發(fā)布,比如表結(jié)構(gòu),索引,存儲(chǔ)過(guò)程包等。
如果是用exp/imp導(dǎo)入的對(duì)象,包括存儲(chǔ)過(guò)程等,應(yīng)該檢查對(duì)象是否與原生產(chǎn)庫(kù)一致,比如由于dblink的原因,imp之后,存儲(chǔ)過(guò)程不能創(chuàng)建,導(dǎo)致有部分存儲(chǔ)過(guò)程丟失,盡管這些存儲(chǔ)過(guò)程可能沒(méi)有被使用。
下面是一些加快遷移速度的技巧:
通過(guò)dblink,使用append insert的方式,同時(shí)利用并行,這種方式比exp/imp更快
對(duì)于有LONG類型的列,insert..select的方式顯然是不行的,可以通過(guò)exp/imp的方式,但是這種方式速度非常慢,其原因在于imp時(shí)一行一行地插入表。有另外一種方式,即sqlplus的copy命令,下面是一個(gè)示例:
不過(guò),sqlpus的copy命令不支持有timestamp和lob列類型的表。如果有timestamp類型的表,可以通過(guò)在exp時(shí),加上rowid的條件,將一個(gè)表分成多個(gè)部分同時(shí)操作,對(duì)于有l(wèi)ob類型的表,也可以同樣處理(因?yàn)閕nsert …select方式下,有l(wèi)ob類型列時(shí),也同樣是一行一行地插入)。注意在這種方式下,就不能使用direct的方式exp/imp。下面是exp導(dǎo)出時(shí)parfile示例:
將表分成幾部分同時(shí)操作,不僅僅可以利用rowid,也可以利用表上的列,比如說(shuō),表上有一個(gè)created_date的列,并且保證是遞增插入數(shù)據(jù),那么這種情況下,也可以使用這個(gè)字段將表分成不同的范圍同時(shí)進(jìn)行導(dǎo)出和導(dǎo)入。不過(guò)使用ROWID通常具有更高的效率。
當(dāng)然對(duì)于有l(wèi)ob列的表,可以按上述方式,拆成多個(gè)insert方式同時(shí)插入,不需要exp/imp。
·對(duì)于特別大的分區(qū)表,雖然使用并行可以提高速度,但是受限于單個(gè)進(jìn)程(不能跨DB LINK進(jìn)行并行事務(wù),只能并行查詢,也即insert..select只能是SELECT部分才能進(jìn)行并行)的處理能力,這種方式下速度仍然有限??梢圆⑿袑?shù)據(jù)插入多個(gè)中間表,然后通過(guò)exchange partition without validation 的方式,交換分區(qū),這種方式將會(huì)大大提高了速度。
·有朋友可能會(huì)問(wèn),為什么不并行直接插入分區(qū)表,當(dāng)然如果是非direct path(append)方式,則是沒(méi)問(wèn)題的,但是這種方式插入的性能較低。而direct path的方式,會(huì)在表上持有mode=6(互斥)的TM鎖,不能多個(gè)會(huì)話同時(shí)插入。(update: 在insert 時(shí)使用這樣的語(yǔ)句:insert into tablename partition (partname) select * from tablename where ….,更簡(jiǎn)單更有效率。)
·遷移時(shí),將數(shù)據(jù)分成兩部分,一部分是歷史表,第二部分是動(dòng)態(tài)變化的表,在遷移之前,先導(dǎo)入歷史表,并在歷史表上建好索引,這無(wú)疑會(huì)大大減少遷移時(shí)業(yè)務(wù)系統(tǒng)中斷時(shí)間。
·遷移之前,考慮清理掉垃圾數(shù)據(jù)。
·遷移時(shí),應(yīng)保證表上沒(méi)有任何索引,約束(NOT NULL除外)和觸發(fā)器,數(shù)據(jù)導(dǎo)入完成后,再建索引。建索引時(shí)同樣,同時(shí)使用多個(gè)進(jìn)程跑腳本。索引創(chuàng)建無(wú)成后,應(yīng)去掉索引的PARALLEL屬性
·在創(chuàng)建約束時(shí),應(yīng)按先創(chuàng)建CHECK約束,主鍵,唯一鍵,再創(chuàng)建外鍵約束的順序。約束狀態(tài)為 ENABLE NOVALIDATE,這將大大減少約束創(chuàng)建時(shí)間。而在遷移完成后,再考慮設(shè)回為ENABLE VALIDATE。
·通過(guò)使用dbms_stats.export_schame_stats和dbms_stats.import_schame_stats導(dǎo)入原庫(kù)上的統(tǒng)計(jì)信息,而不用重新收集統(tǒng)計(jì)使用。
朋友們可以看到,以上均是針對(duì)9i的,實(shí)際上在10g甚至11g環(huán)境下,也仍然很多借鑒意義。當(dāng)然這些技巧不僅僅用于完整的數(shù)據(jù)庫(kù)遷移,也可以應(yīng)用到將個(gè)別表復(fù)制到其他數(shù)據(jù)庫(kù)上。
這里沒(méi)有提到的是利用物化視圖或高級(jí)復(fù)制、觸發(fā)器之類的技術(shù),因?yàn)檫@些技術(shù),畢竟要修改生產(chǎn)庫(kù),對(duì)生產(chǎn)庫(kù)的運(yùn)行有比較大的影響,因此,只有在停機(jī)時(shí)間要求特別嚴(yán)格,而在這個(gè)時(shí)間內(nèi)又不能完成遷移時(shí)才應(yīng)該考慮。
從遷移的經(jīng)驗(yàn)來(lái)說(shuō),只有完善的流程,完整的測(cè)試才可以保證成功。這里只是列舉了一些小技巧,如果對(duì)整個(gè)遷移過(guò)程有興趣,可以針對(duì)這個(gè)話題再進(jìn)行討論。
相關(guān)文章
Oracle客戶端版本及位數(shù)(Windows系統(tǒng))查看方法
這篇文章主要介紹了Windows系統(tǒng)下Oracle客戶端版本及位數(shù)查看方法,感興趣的小伙伴們可以參考一下2016-08-08Oracle In和exists not in和not exists的比較分析
一個(gè)是問(wèn)in exist的區(qū)別,一個(gè)是not in和not exists的區(qū)別2009-08-08oracle 存儲(chǔ)過(guò)程、函數(shù)和觸發(fā)器用法實(shí)例詳解
這篇文章主要介紹了oracle 存儲(chǔ)過(guò)程、函數(shù)和觸發(fā)器用法,結(jié)合實(shí)例形式詳細(xì)分析了oralce 存儲(chǔ)過(guò)程、函數(shù)和觸發(fā)器具體功能、原理、定義、使用方法及相關(guān)操作注意事項(xiàng),需要的朋友可以參考下2020-02-02Oracle Linux 6.8安裝 mysql 5.7.17的詳細(xì)教程
這篇文章主要介紹了Oracle Linux 6.8安裝 mysql 5.7.17的詳細(xì)教程,需要的朋友可以參考下2017-06-06oracle ora-00054:resource busy and acquire with nowait speci
這篇文章主要介紹了oracle ora-00054:resource busy and acquire with nowait specified解決方法,需要的朋友可以參考下2015-12-12