Exp和Expdp匯出資料的效能對比

2021-10-14 16:07:01 字數 4031 閱讀 2934

1.前言

資料備份對資訊系統的安全執行至關重要,我們的使用者中,使用rman或第三方專業備份軟體的越來越多,但是很多使用者仍然保留了傳統的exp作為備份策略的一部分,主要是由於這種備份方式簡單易用,而且恢復到其他機器上也很方便,所以,雖然有其他的備份方式,但是exp方式仍然會同時使用,甚至還有不少的使用者只有這種備份方式(可能因為他們覺得掌握其他技術太複雜)。

隨著使用者的資料量增長,exp匯出方式存在的問題也日漸突出,主要就是耗時長,有的甚至超過3個小時,加上常見的後台自動作業:彙總表的計算,自動費用的計算,統計資訊的收集等工作,使乙個晚上的時間安排越來越緊張。       

有沒有辦法提高exp執行的效能呢?以前我做過一些試驗,查閱了很多資料,總結過一些經驗,最近拿到了乙個使用者的近300g資料,再次進行了一系列大資料量的匯出對比試驗,發現幾個引數的設定對exp匯出耗時的影響較大,經過優化後,exp匯出的效能得到了較大提公升,但是與expdp相比,仍然是後者要快得多,下面將試驗情況和相關知識做乙個介紹,以便我們在幫助使用者制定備份策略時參考。

2.試驗情況

2.1試驗環境

硬體:cpu :至強5405,4*2g

記憶體:ddr2,4g

硬碟:ide 1t

軟體:windows+oracle 10.2.0.3

資料:xx醫院全庫匯入的zlhis10.30資料,原始共300g,經過收縮回滾表空間、臨時表空間,以及一些表空間檔案未使用的空間後,總共占用267g,其中包含了大量電子病歷相關的lob資料。

其他說明:由於該院使用時間較長,db control repository包含了大量歷史監控資料,表sysman.mgmt_metrics_raw中的1300萬條lob格式資料,僅該錶的匯入耗時超過24小時,為了便於測試,清空了該錶的資料。

2.2試驗方法

在相同環境下,試驗4種不同的匯出資料的方式的耗時

1)      使用exp常規路徑匯出,不加引數優化

2)      使用exp直接路徑匯出,不加引數優化

3)      使用exp直接路徑匯出,引數優化

4)      使用expdp匯出,引數優化

2.3試驗結果

方式耗時

說明exp常規路徑,未優化

5小時15分

不加引數

exp直接路徑,未優化

2小時38分

direct=y

exp直接路徑,優化

1小時40分

direct=y recordlength=65535 buffer=104857600

expdp,優化

59分parallel=3 dumpfile=

expdp_0225_1.dmp,expdp_0225_2.dmp,

expdp_0225_3.dmp

結果表明:

速度最快的是expdp方式,而exp方式經過引數優化後,相對於不加任何引數的情況,快了近3倍。

下面對相關的原理及引數進行詳細說明。

3.原理說明

exp預設是傳統路徑,這種模式下,是用select來查詢資料,然後寫入buffer cache,在將這些資料寫入evaluate buffer,最後傳到export客戶端,再寫入dump檔案。      

直接路徑模式下,直接從硬碟讀取資料,然後寫入pga,格式就是export的格式,不需要轉換,資料再直接傳到export客戶端,寫入dump檔案。這種模式沒有經過evaluation buffer,少了乙個過程,匯出速度提高也是很明顯。

exp沒有並行引數,要進行並行匯出,可以寫多條命令同時匯出,這種方式可用於特定的資料遷移情況,按表或表空間進行快速資料遷移。   

expdp是oracle 10g上推出的一種先進的資料匯出方式,比exp有較大的效能提公升,expdp可以看成是exp的公升級版,相當於exp + direct mode + parallel。

expdp預設是直接路徑方式,它有4種方式,另外3種分別是:

外部表模式(相當於exp的常規路徑匯出);

資料檔案拷貝模式(表空間傳輸);

網路鏈路匯入(通過資料鏈路匯出匯入)

一般情況可以替代exp,但是還無法完全替代,主要是它需要在資料庫伺服器上執行,而exp可以在任何一台客戶端上執行。另外,據測試,expdp在匯出大型分割槽表(1t以上)的時候,光是分析的時間就超過2個小時,而且存在一些bug。所以,有些使用者仍然會使用exp來進行資料備份。

4.引數優化

exp相關引數

通過上面的分析,我們知道採用「直接路徑」可以提高匯出速度,這種模式重點說明2個引數:direct和recordlength引數。

direct引數定義了匯出是使用直接路徑方式(direct=y),還是常規路徑方式(direct=n)。常規路徑匯出使用select語句從表中抽取資料,評估後再寫入,而直接路徑匯出則是將資料直接從磁碟讀到pga再原樣寫入匯出檔案,從而避免了sql命令處理層的資料轉換過程,大大提高了匯出效率。

buffer引數用於設定了讀取記錄的快取的大小,以位元組為單位,即在array中最大數量的記錄,該引數只對常規路徑模式匯出有效。

recordlength引數是跟direct=y配合使用的引數,它定義了export i/o緩衝的大小,作用類似於常規路徑匯出使用的buffer引數。建議設定recordlength引數為最大i/o緩衝,即65535(64kb)。

需要強調是即使用直接路徑匯出模式,其中涉及lob物件的表只會通過傳統模式匯出,所以,direct=y時,除了設定recordlength引數之外,也需要設定buffer引數,一般情況可設定為104857600(100m),這一點是網上很多優化文章所忽略的。

另外,還可以修改oracle初始化引數multiple block read來提交讀取資料的效能,經測試,效果不是很明顯,前面的測試環境下,可減少10分鐘左右的耗時。

按照上面的引數優化設定,下面給出乙個匯出指令碼示例:

exp userid=sys/his@zyyy full=y direct=y recordlength=65535 buffer=104857600 file=f:\zyyy\exp20120218.dmp log=f:\zyyy\exp20120218.log feedback=10000

expdp相關引數

這裡只說明兩個引數:parallel和dumpfile

parallel引數指明了匯出並行度,根據cpu的個數進行設定,預設是1,如果不設定,匯出效能與exp的直接路徑匯出模式差不了多少,就沒有發揮出它的優勢。

dumpfile引數可配合parallel引數指定多個匯出檔案,用於減少併發寫入時的io爭用。

結合這兩個引數,下面給出乙個匯出指令碼示例:

sql>create directory dump_dir as 'f:\data\zyyy';

cmd:

expdp sys/his@zyyy full=y directory=dump_dir parallel=3

dumpfile=expdp_0225_1.dmp,expdp_0225_2.dmp,expdp_0225_3.dmp logfile=expdp_0225.log

5.小結

如果你仍然習慣使用exp方式,如果要減少耗時,最好採用直接路徑方式,並且設定recordlength和buffer兩個引數的值,可以大大提高匯出效能。   如果你掌握了expdp方式,使用合適的parallel引數,實現快速匯出,更重要的是impdp的效能提公升才是資料幫浦模式的真正優勢所在,從一些oracle愛好者的測試結果來看,確實差別非常大。

expdp匯出表結構 expdp匯出資料庫表結構

oracle資料幫浦expdp和impdp使用說明 oracle資料幫浦expdp和impdp使用說明 文章白及88 2016 02 29 3334瀏覽量 oracle11g中資料的倒庫和入庫操作以及高版本資料匯入低版本資料可能引發的問題 1.前言 在10g之前,傳統的匯出和匯入分別使用exp工具和...

Oracle使用expdp和exp匯入匯出資料

一 資料幫浦方式 1 新建par檔案 1.1新建impdp.par檔案 要匯入的資料庫使用者名稱 密碼 userid lee 123 dmp檔案所在路徑的變數,可以在資料庫中配置 directory data pump dir dmp檔名稱,如果想匯入多個,寫成test u.dmp即可 dumpfi...

expdp匯出資料為空

今天在使用oracle的expdp工具匯出資料時,資料沒有匯出,匯出日誌如下 export release 10.2.0.5.0 64bit production on thursday,15 october,2020 14 55 03 connected to oracle database 10...