優化exp/imp導入導出速度大全

1exp 

  我們知道採用direct path可以提高導出速度。所以,在使用exp時,就可以採用直接路徑模式。這種模式2個相關的參數:DIRECTRECORDLENGTH參數。

       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參數建議設成64k65535)。這個值對性能提高比較大。

 

 

2IMP

       Oracle Import進程需要花比Export進程數倍的時間將數據導入數據庫。某些關鍵時刻,導入是爲了應對數據庫的緊急故障恢復。爲了減少宕機時間,加快導入速度顯得至關重要。沒有特效辦法加速一個大數據量的導入,但我們可以做一些適當的設定以減少整個導入時間。

·    IMP作了大量的跟普通方式一樣的insert

·    IMP時候創建索引通常是logging的,產生了大量的undoredo

 

提高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_SERVICEMTS_DISPATCHERS等參數tnsnames.ora中又沒有(SERVER=DEDICATED)的配置那麼數據庫就使用了共享服務器模式。在MTS模式下,Exp/Imp操作會用到LARGE_POOL,建議調整LARGE_POOL_SIZE150M

檢查數據庫是否在MTS模式下:

  SQL>select distinct server from v$session;    ----如果返回值出現noneshared,說明啓用了MTS

 

6、增大重作日誌的大小

       以減少log switch的次數,也就是減少checkpoint次數,減少寫磁盤的次數

 

7、如果要往已經存在的表中追加數據

       那麼有些情況下,比如表中存在位圖索引,那麼最好先刪除索引,再導入。否則更新索引時會產生大量等待

 

注意:相關的幾個參數

1db_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等等)

7Imp的時候buffer給的大一些

8imp沒有parallel想要用parallel那麼就把原表輸出成多個csv然後用sqlldr

9. 可以試試物化視圖Material View),如果是單獨表空間的話也可以考慮transport tablespace

10可以考慮使用EXPDPIMPDP

11 table/index設置Nologging

12. 同平臺的話按表空間傳輸更快 .

13. 用的query子查詢導出導入 (exp imp) .

14ignore=y buffer=40960000,一秒至少應該是10w記錄。

15.先創建表,刪除索引信息。表設置並行度。如果可以分區的話。建議並行導入。即寫多個腳本。每個腳本導入不同的分區內容。加上commit=y,導入完畢後並行創建索引,創建完畢後取消並行度。

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章