去年年底做了不少系統的數據遷移大部分系統由於平台和版本的原因做的是邏輯遷移少部分做的是物理遷移有一些心得體會與大家分享
首先說說遷移流程在遷移之前寫好方案特別是實施的方案步驟一定要寫清楚然後進行完整的測試我們在遷移時有的系統測試了四五次通過測試來完善方案和流程
針對物理遷移也即通過RMAN備份來進行還原並應用歸檔的方式(這裡不討論通過dd方式進行的冷遷移)雖然注意的是要將數據庫設為force logging的方式在用RMAN做全備之前一定要執行
否則可能會產生壞塊
對於邏輯遷移在job_processes設置為>的數值之前注意job的下次執行時間和job所屬用戶比如job的定義在之前已經導入但是在遷移之時job已經運行過那麼遷移完成之後job的下次時間還是原來的時間這樣可能會重復運行另外job通過IMP導入後job所屬用戶會變成導入用戶的名稱顯然job原來的用戶就不能對JOB進行管理了可以通過下面的sql進行修改
在遷移之前應該禁止對系統進行結構上的修改和發布比如表結構索引存儲過程包等
如果是用exp/imp導入的對象包括存儲過程等應該檢查對象是否與原生產庫一致比如由於dblink的原因imp之後存儲過程不能創建導致有部分存儲過程丟失盡管這些存儲過程可能沒有被使用
下面是一些加快遷移速度的技巧
通過dblink使用append insert的方式同時利用並行這種方式比exp/imp更快
對於有LONG類型的列insertselect的方式顯然是不行的可以通過exp/imp的方式但是這種方式速度非常慢其原因在於imp時一行一行地插入表有另外一種方式即sqlplus的copy命令下面是一個示例
不過sqlpus的copy命令不支持有timestamp和lob列類型的表如果有timestamp類型的表可以通過在exp時加上rowid的條件將一個表分成多個部分同時操作對於有lob類型的表也可以同樣處理(因為insert …select方式下有lob類型列時也同樣是一行一行地插入)注意在這種方式下就不能使用direct的方式exp/imp下面是exp導出時parfile示例
將表分成幾部分同時操作不僅僅可以利用rowid也可以利用表上的列比如說表上有一個created_date的列並且保證是遞增插入數據那麼這種情況下也可以使用這個字段將表分成不同的范圍同時進行導出和導入不過使用ROWID通常具有更高的效率
當然對於有lob列的表可以按上述方式拆成多個insert方式同時插入不需要exp/imp
·對於特別大的分區表雖然使用並行可以提高速度但是受限於單個進程(不能跨DB LINK進行並行事務只能並行查詢也即insertselect只能是SELECT部分才能進行並行)的處理能力這種方式下速度仍然有限可以並行將數據插入多個中間表然後通過exchange partition without validation 的方式交換分區這種方式將會大大提高了速度
·有朋友可能會問為什麼不並行直接插入分區表當然如果是非direct path(append)方式則是沒問題的但是這種方式插入的性能較低而direct path的方式會在表上持有mode=(互斥)的TM鎖不能多個會話同時插入(update: 在insert 時使用這樣的語句insert into tablename partition (partname) select * from tablename where …更簡單更有效率)
·遷移時將數據分成兩部分一部分是歷史表第二部分是動態變化的表在遷移之前先導入歷史表並在歷史表上建好索引這無疑會大大減少遷移時業務系統中斷時間
·遷移之前考慮清理掉垃圾數據
·遷移時應保證表上沒有任何索引約束(NOT NULL除外)和觸發器數據導入完成後再建索引建索引時同樣同時使用多個進程跑腳本索引創建無成後應去掉索引的PARALLEL屬性
·在創建約束時應按先創建CHECK約束主鍵唯一鍵再創建外鍵約束的順序約束狀態為 ENABLE NOVALIDATE這將大大減少約束創建時間而在遷移完成後再考慮設回為ENABLE VALIDATE
·通過使用dbms_statsexport_schame_stats和dbms_statsimport_schame_stats導入原庫上的統計信息而不用重新收集統計使用
朋友們可以看到以上均是針對i的實際上在g甚至g環境下也仍然很多借鑒意義當然這些技巧不僅僅用於完整的數據庫遷移也可以應用到將個別表復制到其他數據庫上
這裡沒有提到的是利用物化視圖或高級復制觸發器之類的技術因為這些技術畢竟要修改生產庫對生產庫的運行有比較大的影響因此只有在停機時間要求特別嚴格而在這個時間內又不能完成遷移時才應該考慮
從遷移的經驗來說只有完善的流程完整的測試才可以保證成功這裡只是列舉了一些小技巧如果對整個遷移過程有興趣可以針對這個話題再進行討論
From:http://tw.wingwit.com/Article/program/Oracle/201404/30549.html