1、exp
我們知道採用direct path可以提高導出速度。所以,在使用exp時,就可以採用直接路徑模式。這種模式有2個相關的參數:DIRECT和RECORDLENGTH參數。
DIRECT參數定義了導出是使用直接路徑方式(DIRECT=Y),還是常規路徑方式(DIRECT=N)。常規路徑導出使用SQL SELECT語句從表中抽取數據,直接路徑導出則是將數據直接從磁盤讀到PGA再原樣寫入導出文件,從而避免了SQL命令處理層的數據轉換過程,大大提高了導出效率。在數據量大的情況下,直接路徑導出的效率優勢更爲明顯,可比常規方法速度提高三倍之多。
和DIRECT=Y配合使用的是RECORDLENGTH參數,它定義了Export I/O緩衝的大小,作用類似於常規路徑導出使用的BUFFER參數。建議設置RECORDLENGTH參數爲最大I/O緩衝,即65535(64kb)。其用法如下:
如:exp userid=system/manager full=y direct=y recordlength=65535 file=exp_full.dmp log=exp_full.log
一些限制如下:
· 直接路徑不能使用在tablespace-mode
· 直接路徑不支持query參數。query只能在conventional path模式下使用。
· 如果exp版本小於8.1.5,不能使用exp導入有lob字段的表。 不過現在很少有有8版本的數據庫了。這點可以忽略掉了。
· buffer選項只對conventional path exp(傳統路徑)有效。對於直接路徑沒有影響。對於直接路徑,應該設置RECORDLENGTH參數。
· 對於直接路徑下, RECORDLENGTH參數建議設成64k(65535)。這個值對性能提高比較大。
2、IMP
Oracle Import進程需要花比Export進程數倍的時間將數據導入數據庫。某些關鍵時刻,導入是爲了應對數據庫的緊急故障恢復。爲了減少宕機時間,加快導入速度顯得至關重要。沒有特效辦法加速一個大數據量的導入,但我們可以做一些適當的設定以減少整個導入時間。
· IMP作了大量的跟普通方式一樣的insert
· IMP時候創建索引通常是logging的,產生了大量的undo和redo
提高IMP速度:
(1、不建議使用commit參數,因爲當imp失敗的時候,會導致很多後續的麻煩事兒
(2、增大buffer參數值,以便於一次讀進更大的array
Imp 參數BUFFER定義了每一次讀取導出文件的數據量,設的越大,就越減少Import進程讀取數據的次數,從而提高導入效率。BUFFER的大小取決於系統應用、數據庫規模,通常來說,設爲百兆就足夠了。其用法如下:
imp user/pwd fromuser=user1 touser=user2 file=/tmp/imp_db_pipe1 commit=y feedback=10000 buffer=10240000
(3、設置較大的初始化參數sort_area_size,以加快創建索引時候的排序速度,大內存啓用ASMM/AMM之後感覺沒有什麼作用。
(4、使用INDEXES=N選項,導入數據之後再手工創建索引。
前面談到增加排序區時,說明Imp進程會先導入數據再創建索引。導入過程中建立用戶定義的索引,特別是表上有多個索引或者數據表特別龐大時,需要耗費大量時間。某些情況下,需要以最快的時間導入數據,而索引允許後建,我們就可以使用INDEXES=N只導入數據不創建索引,從而加快導入速度。
我們可以用INDEXFILE選項生成創建索引的DLL腳本,再手工創建索引。我們也可以用如下的方法導入兩次,第一次導入數據,第二次導入索引。其用法
如下:
imp user/pwd fromuser=user1 touser=user2 file=/tmp/imp_db_pipe1 commit=y feedback=10000 buffer=10240000 ignore=y rows=y indexes=n
imp user/pwd fromuser=user1 touser=user2 file=/tmp/imp_index_pipe1 commit=y feedback=10000 buffer=10240000 ignore=y rows=n indexes=y
(5、增加 LARGE_POOL_SIZE
如果在init.ora中配置了MTS_SERVICE,MTS_DISPATCHERS等參數,tnsnames.ora中又沒有(SERVER=DEDICATED)的配置,那麼數據庫就使用了共享服務器模式。在MTS模式下,Exp/Imp操作會用到LARGE_POOL,建議調整LARGE_POOL_SIZE到150M。
檢查數據庫是否在MTS模式下:
SQL>select distinct server from v$session; ----如果返回值出現none或shared,說明啓用了MTS。
(6、增大重作日誌的大小
以減少log switch的次數,也就是減少checkpoint次數,減少寫磁盤的次數
(7、如果要往已經存在的表中追加數據
那麼有些情況下,比如表中存在位圖索引,那麼最好先刪除索引,再導入。否則更新索引時會產生大量等待
注意:相關的幾個參數
1、db_writer_processes imp導入時,如果吧上面的幾點都做好了,還有一個影響最大的參數需要確認,那就是db_writer_processes,進程的個數,可以根據服務器的CPU酌情增加。速度可以大大提高。
2、 fast_start_mttr_target平均恢復時間,需要設置一個合理的數字,比如300秒。加快系統做檢查點
其他需要注意的:
1. 目標數據庫設置爲非歸檔模式,當然停掉資料庫同使用Nologging更好。
2. 導入的時候可以將索引和約束全部去掉( index , constraint , trigger等, drop或者disable掉所有的index以及相關的pk)
3. 在回滾段夠大的情況下,不用加commit=y參數,頻繁提交會影響效率;
4. 可以考慮使用DBLINK遷移,同樣使用非歸檔模式,insert /*+ append*/ into select /*+ parallel(t,4)*/ * from t@dblink; ;
5. 遷移的過程中時刻注意各種空間是否夠用(包括redolog,archivelog,undo segment,temp tbs);
6. 其他的因素干擾(Job, Trigger, Profile等等)。
7.Imp的時候buffer給的大一些。
8.imp沒有parallel,想要用parallel那麼就把原表輸出成多個csv然後用sqlldr
9. 可以試試物化視圖(Material View),如果是單獨表空間的話,也可以考慮transport tablespace 。
10.可以考慮使用EXPDP和IMPDP。
11 爲 table/index設置Nologging。
12. 同平臺的話,按表空間傳輸,更快 .
13. 用的query子查詢導出導入 (exp imp) .
14.ignore=y buffer=40960000,一秒至少應該是10w記錄。
15.先創建表,刪除索引信息。表設置並行度。如果可以分區的話。建議並行導入。即寫多個腳本。每個腳本導入不同的分區內容。加上commit=y,導入完畢後並行創建索引,創建完畢後取消並行度。