expdp/impdp 數據泵parallel 參數優化測試

  expdp/impdp在進行數據遷移時速度極快,通過一定的優化方法,我們讓expdp和impdp跑得更加快
1,parallel,在很多oracle的程序中都離不開並行操作,通過利用多core cpu的處理能力(根據自己機器實際情況優化一般不要超過core的2倍),速度增加相當明顯
例:frank用戶主要有表T1,T2,T3,每個表

中數據有500萬行
[oracle@cscscslocalhost abc]$ time expdp frank/frank directory=abc dumpfile=abc.dmp
real    0m41.692s
user    0m0.011s
sys     0m0.032s
[oracle@cscscslocalhost abc]$ time expdp frank/frank directory=abc dumpfile=abc.dmp parallel=3
real    0m26.710s
user    0m0.019s
sys     0m0.007s
速度提升相當明顯,如果每個dw進程都使用單獨的dmp文件會更快
[oracle@cscscslocalhost abc]$ time expdp frank/frank directory=abc dumpfile=abc%U.dmp parallel=3
real    0m22.928s
user    0m0.017s
sys     0m0.008s
一般建議parall設置不要超過cpu*2.
2,transport_tablespace方法,直接複製表空間文件的方式。使用expdp和impdp只導出了數據字典信息.表空間
要是自包含的
SQL> exec dbms_tts.transport_set_check('USERS',true);
PL/SQL procedure successfully completed.
SQL> select * from transport_set_violations;
no rows selected
transport tablespace的方法是遷移數據最快的方法。因爲數據本身是不需要oracle的sql層來處理.但是表空間
在expdp期間要設置成只讀狀態

3,network_link模式.當數據文件比較大的時候,這時候在目標庫上直接通過network_link模式在目標
庫上進行導入,而不需要在源庫上進行expdp操作,處理方式和正常的expdp/impdmp過程類似。這樣做的
好處主要是可以避免了在源庫上寫大文件,然後還需要移動到目標庫上.
dongdongtang> grant datapump_exp_full_database to frank;
Grant succeeded.
目標庫
dongdongtang> create database link frank connect to frank identified by frank using 'frank';
Database link created.
[oracle@localhost admin]$ impdp \'/ as sysdba\' network_link=frank schemas=frank
network_link 定義了一個db_link名稱,該過程把源端的frank schemas導入到目標庫上.

4,使用適當的方法.expdp/impdp包括了兩種主要方法direct_path和external_table
使用direct_path會skip掉sql layer,速度會更快,但是不能定義query
[oracle@localhost ~]$ expdp frank/frank dumpfile=abc.dmp query=T1:"where a>5" access_method=direct_path
ORA-39033: Data cannot be filtered under the direct path access method.
其他的方法還有一些限制,具體可以參考mos相關文檔。datapump一般會在啓動的時候自動決定使用哪種方式,而且一
旦決定不可以通過interactive的方式修改.可以使用400300來進行trace使用了哪種方式
KUPW:02:03:30.332: 1: TABLE_DATA:"FRANK"."T1" direct path, parallel: 1
KUPW:02:03:30.332: 1: In function GATHER_PARSE_ITEMS
KUPW:02:03:30.332: 1: In function CHECK_FOR_REMAP_NETWORK
 
5,對於index不會並行,對大表有索引的情況下,考慮索引以後單獨 使用parallel,nologging重建。事實上在
expdp的導出過程中對索引不會像表數據那樣需要導出,索引只導出了ddl語句.

6,statistics的導入可能會非常慢,特別是在10.2之前。在expdp中儘量exclude,在impdp後,使用單獨的收集
任務來完成.

7,利用強大的過濾功能,主要的選項有tables,include,exclude和query。tables定義只導出某些需要的表,
include表示只導出某些對像,exclude表示排除某些對像.query可以對錶中數據進行過濾,只導出我們需要的
那部分數據.
 
8,利用壓縮過功能可以減少dump文件的大小
[oracle@localhost dpdump]$ expdp frank/frank dumpfile=abc.dmp tables=t1
[oracle@localhost dpdump]$ ls -l abc.dmp 
-rw-r----- 1 oracle oinstall 1583874048 Jan 20 03:54 abc.dmp

[oracle@localhost dpdump]$ expdp frank/frank dumpfile=abc.dmp tables=t1 compression=all
[oracle@localhost dpdump]$ ls -l abc.dmp 
-rw-r----- 1 oracle oinstall 197234688 Jan 20 04:29 abc.dmp
可以看到壓縮前1.5G,壓縮過後只有190M左右.
在12c的版本中,可以通過compression_algorithm來定義壓縮算法,常用的壓縮級別有:basic,low,medium,high。
結合paralell,可以非常好的利用多core cpu的處理能力.

在11G以前的版本中也有很多的bug會導致datapump變慢的情況,可以查詢相關的mos文檔.datapump是使用dbms_metadata
和dbms_datapump兩個包來完成的,所以shared pool要保證不會太小.

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