使用Exp和Expdp匯出資料的效能對比與最佳化

Davis_itpub發表於2018-06-27
序:這方面的文章雖然很多人寫過,但是結合實際進行詳細的對比分析的不多,這裡,結合所在公司的行業,進行了比較詳細的對比分析。 

 

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愛好者的測試結果來看,確實差別非常大。    

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

相關文章