轉:Exp/Imp工具效能調優

chenfengwww發表於2010-05-18

http://hi.baidu.com/mengyan__2008/blog/item/dac7be3d3ae903ce7d1e71bf.html

匯入資料命令

imp qyd/qyd@LuoHe file=D:"shuju"qyd"simis.dmp ignore=y indexes=n feedback=10000 buffer=10240000 fromuser=simis touser=qyd commit=y

buffer:上載資料緩衝區,以位元組為單位,預設依賴作業系統

commit:上載資料緩衝區中的記錄上載後是否執行提交

feeback:顯示處理記錄條數,預設為0,即不顯示

--------------------------------------------------------------------------------------------------

一、Exp調優

1.使用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

直接路徑匯出根據Oracle版本不同,有一些使用限制。比較重要的限制有,8i及以下版本不支援匯出客戶端和資料庫的字符集轉換,因此匯出前必須保證NLS_LANG設定正確;8.1.5及以下版本不支援匯出含LOBs物件的表;不能使用QUERY引數等。

2.使用管道技術

管道是從一個程式程式向另一個程式程式單向傳送資訊的技術。通常,管道把一個程式的輸出傳給另一程式作為輸入。如果匯出的資料量很大,可以利用管道直接生成最終的壓縮檔案,所耗費的時間和不壓縮直接匯出的時間相當。這樣一來,不僅能夠解決磁碟空間不足的問題,而且省去了單獨壓縮檔案的時間;如果需要傳輸匯出檔案,還可以減少網路傳輸的時間。比如,一個10G的檔案單獨壓縮可能需要半小時以上的時間。雖然管道技術不能夠直接縮短Exp/Imp本身的時間,但節省出來的壓縮時間非常可觀。管道和Exp結合的具體使用方法如下:

匯出資料示例:

% mknod /tmp/exp_pipe p # Make the pipe

% compress < /tmp/exp_pipe > export.dmp.Z & # Background compress

% exp file=/tmp/exp_pipe # Export to the pipe

二、Imp調優

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

1.使用管道技術

前面已經說明了Exp時如何使用管道,在匯入時管道的作用是相同,不僅能夠解決磁碟空間不足的問題,而且省去了單獨解壓縮檔案的時間。在大資料量匯入匯出的時候,推薦一定要使用管道。

匯入資料示例:

% mknod /tmp/imp_pipe p # Make the pipe

% uncompress < export.dmp.Z > /tmp/imp_pipe & # Background uncompress

% imp file=/tmp/imp_pipe # Import from the pipe

2.避免I/O競爭

Import是一個I/O密集的操作,避免I/O競爭可以加快匯入速度。如果可能,不要在系統高峰的時間匯入資料,不要在匯入資料時執行job等可能競爭系統資源的操作。

3.增加排序區

Oracle Import程式先匯入資料再建立索引,不論INDEXES值設為YES或者NO,主鍵的索引是一定會建立的。建立索引的時候需要用到排序區,在記憶體大小不足的時候,使用臨時表空間進行磁碟排序,由於磁碟排序效率和記憶體排序效率相差好幾個數量級。增加排序區可以大大提高建立索引的效率,從而加快匯入速度。

8i及其以下版本:匯入資料前增加資料庫的sort_area_size大小,可設為正常值的5-10倍。但這個值設定會影響到所有會話,設的過高有可能導致記憶體不足出現paging, swapping現象。更為穩妥的方法是,對於大表和索引特別多的表,只導資料不導索引。導完資料後,建立一個會話,設定當前會話的sort_area_size一個足夠大的值,再手工建立索引。

9i:在workarea_size_policy=AUTO的情況下,所有會話的UGA共用pga_aggregate_target定義的記憶體,不必單獨設定sort_area_size。匯入資料前增加pga_aggregate_target大小,如果機器記憶體夠大,可從通常設定的500M提高到1-2Gpga_aggregate_target大小可以動態調整,匯入完成後可線上調回原值。

4.調整BUFFER選項

Imp引數BUFFER定義了每一次讀取匯出檔案的資料量,設的越大,就越減少Import程式讀取資料的次數,從而提高匯入效率。BUFFER的大小取決於系統應用、資料庫規模,通常來說,設為百兆就足夠了。其用法如下:

imp user2/pwd fromuser=user1 touser=user2 file=/tmp/imp_db_pipe1 commit=y feedback=10000 buffer=10240000

5.使用COMMIT=Y選項

COMMIT=Y表示每個資料緩衝滿了之後提交一次,而不是導完一張表提交一次。這樣會大大減少對系統回滾段等資源的消耗,對順利完成匯入是有益的。

6.使用INDEXES=N選項

前面談到增加排序區時,說明Imp程式會先匯入資料再建立索引。匯入過程中建立使用者定義的索引,特別是表上有多個索引或者資料表特別龐大時,需要耗費大量時間。某些情況下,需要以最快的時間匯入資料,而索引允許後建,我們就可以使用INDEXES=N 只匯入資料不建立索引,從而加快匯入速度。

我們可以用INDEXFILE選項生成建立索引的DLL指令碼,再手工建立索引。我們也可以用如下的方法匯入兩次,第一次匯入資料,第二次匯入索引。其用法如下:

imp user2/pwd fromuser=user1 touser=user2 file=/tmp/imp_db_pipe1 commit=y feedback=10000 buffer=10240000 ignore=y rows=y indexes=n

imp user2/pwd fromuser=user1 touser=user2 file=/tmp/imp_index_pipe1 commit=y feedback=10000 buffer=10240000 ignore=y rows=n indexes=y

7.增加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

PS:

簡說Oracle 資料庫匯出(exp)/ 匯入(imp)

exp
將資料庫內的各物件以二進位制方式下載成dmp 檔案,方便資料遷移。
buffer :下載資料緩衝區,以位元組為單位,預設依靠作業系統
consistent :下載期間所涉及的資料保持read only,預設為n
direct :使用直通方式,預設為n
feeback :顯示處理記錄條數,預設為0,即不顯示
file:輸出檔案,預設為expdat.dmp
filesize:輸出檔案大小,預設為作業系統最大值
indexes:是否下載索引,預設為n,這是指索引的定義而非資料,exp 不下載索引資料
log:log 檔案,預設為無,在標準輸出顯示
owner:指明下載的使用者名稱
query:選擇記錄的一個子集
rows:是否下載表記錄
tables:輸出的表名列表
匯出整個例項
exp dbuser/oracle file=oradb.dmp log=oradb.log full=y consistent=y direct=y
user 應具有dba 許可權
匯出某個使用者所有物件
exp dbuser/oracle file=dbuser.dmp log=dbuser.log owner=dbuser buffer=4096000 feedback=10000
匯出一張或幾張表
exp dbuser/oracle file=dbuser.dmp log=dbuser.log tables=table1,table2 buffer=4096000
feedback=10000
匯出某張表的部分資料
exp dbuser/oracle file=dbuser.dmp log=dbuser.log tables=table1 buffer=4096000 feedback=10000
query=”where col1=’…’ and col2
不可用於巢狀表
以多個固定大小檔案方式匯出某張表
exp dbuser/oracle file=1.dmp,2.dmp,3.dmp,… filesize=1000m tables=emp buffer=4096000
feedback=10000
這種做法通常用在:表資料量較大,單個dump 檔案可能會超出檔案系統的限制
直通路徑方式
direct=y,取代buffer 選項,query 選項不可用
有利於提高下載速度
consistent 選項
自export 啟動後,consistent=y 凍結來自其它會話的對export 操作的資料物件的更新,這樣可以保證
dump 結果的一致性。但這個過程不能太長,以免回滾段和聯機日誌消耗完
imp
將exp 下載的dmp 檔案上載到資料庫內。
buffer:上載資料緩衝區,以位元組為單位,預設依靠作業系統
commit:上載資料緩衝區中的記錄上載後是否執行提交
feeback :顯示處理記錄條數,預設為0,即不顯示
file:輸入檔案,預設為expdat.dmp
filesize:輸入檔案大小,預設為作業系統最大值
fromuser:指明來源使用者方
ignore:是否忽略物件建立錯誤,預設為n,在上載前物件已被建立往往是一個正常現象,所以此選項建
議設為y
indexes:是否上載索引,預設為n,這是指索引的定義而非資料,假如上載時索引已建立,此選項即使為
n 也無效,imp 自動更新索引資料
log:log 檔案,預設為無,在標準輸出顯示
rows:是否上載表記錄
tables:輸入的表名列表
touser:指明目的使用者方
匯入整個例項
imp dbuser/oracle file=oradb.dmp log=oradb.log full=y buffer=4096000 commit=y ignore=y
feedback=10000
匯入某個使用者所有物件
imp dbuser/oracle file=dbuser.dmp log=dbuser.log fromuser=dbuser touser=dbuser2 buffer=2048000
commit=y ignore=y feedback=10000
匯入一張或幾張表
imp dbuser2/oracle file=user.dmp log=user.log tables=table1,table2 fromuser=dbuser
touser=dbuser2 buffer=2048000 commit=y ignore=y feedback=10000
以多個固定大小檔案方式匯入某張表
imp dbuser/oracle file=(1.dmp,2.dmp,3.dmp,…) filesize=1000m tables=emp fromuser=dbuser
touser=dbuser2 buffer=4096000 commit=y ignore=y feedback=10000

[@more@]

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/22036495/viewspace-1033682/,如需轉載,請註明出處,否則將追究法律責任。

相關文章