Oracle 傳統的Export與Import依舊被保留到11g,而且9i與10g有很多依舊使用Export與Import方式進行備份與恢複的企業。從Oracle 7.3開始,傳統的exp導出程式提供兩種的導出路徑方式,一個是傳統路徑導出(Conventional Path Export),一個是直接路徑導出(Direct Path Export)。本文即是因最近客戶的傳統導入導出性能問題對此進行描述。
1、兩者的差異
a、 Conventional path Export
傳統路徑模式使用SQL SELECT語句抽取表資料。資料從磁盤讀入到buffer cache緩沖區中,行被轉移到評估緩沖區。
在此之後根據SQL表達式,将記錄傳回給導出用戶端,然後寫入到dump檔案。
b、Direct path Export
直接導出模式,資料直接從磁盤中讀取到導出session的PGA中,行被直接轉移到導出session的私有緩沖區,進而跳過SQL指令處理層。
避免了不必要的資料轉換。最後記錄傳回給導出用戶端,寫到dump檔案。
2、性能問題
a、直接路徑導出方式比傳統路徑方式具有更優的性能,速度更快,因為繞過了SQL指令處理部分。
b、直接路徑導出方式支援RECORDLENGTH參數(最大為64k),該參數值通常建議設定為系統I/O或者DB_BLOCK_SIZE的整數倍
c、影響直接路徑導出的具體因素(DB_BLOCK_SIZE,列的類型,I/O性能,即資料檔案所在的磁盤驅動器是否單獨于dump檔案所在的磁盤驅動器)
d、無論是直接路徑導出還是傳統路徑導出産生的dump,在使用imp方式導入時,會耗用相同的時間
3、簡單示例
> exp system/manager FILE=exp_full.dmp LOG=exp_full.log \
FULL=y DIRECT=y RECORDLENGTH=65535
> imp system/manager FILE=exp_full.dmp LOG=imp_full.log \
FULL=y RECORDLENGTH=65535
4、直接路徑導出的限制
a、直接路徑導出不支援互動模式
b、不支援表空間傳輸模式(即TRANSPORT_TABLESPACES=Y不被支援),支援的是FULL,OWNER,TABLES導出方式
c、不支援QUERY查詢方式,如exp scott/tiger TABLES=emp QUERY=\"WHERE job=\'SALESMAN\' \" 不被支援
d、直接路徑導出使用RECORDLENGTH設定一次可以導出資料的量,取代傳統路徑使用buffer的設定
e、直接路徑導出要求NLS_LANG環境參數等于資料庫字元集,負責收到EXP-41警告及EXP-0終止錯誤
5、示範兩種方式性能差異
[python] view plain copy
- a、傳統路徑導出與直接路徑導出性能對比
- #下面直接進行日志對比
- robin@SZDB:/u02/database/SYBO2SZ/BNR/dump> more dump1.log
- Start to dump at Fri Jun 21 15:32:57 CST 2013 ....
- Connected to: Oracle Database 10g Release 10.2.0.3.0 - 64bit Production
- Export done in US7ASCII character set and UTF8 NCHAR character set
- server uses UTF8 character set (possible charset conversion)
- About to export specified tables via Conventional Path ...#這個地方是關鍵描述資訊,指明了導出方式
- . . exporting table TRADE_CLIENT_TBL_ARC 1395093 rows exported #資料139萬行
- Export terminated successfully with warnings.
- End dump at Fri Jun 21 15:34:31 CST 2013 . #耗用時間15:34:31-15:32:57=不到2min
- # Author : Robinson
- # Blog : http://blog.csdn.net/robinson_0612
- robin@SZDB:/u02/database/SYBO2SZ/BNR/dump> more dump2.log
- Start to dump at Fri Jun 21 15:37:13 CST 2013 ....
- About to export specified tables via Direct Path ...#這個地方是關鍵描述資訊,指明了導出方式
- . . exporting table TRADE_CLIENT_TBL_ARC 1395093 rows exported
- End dump at Fri Jun 21 15:37:30 CST 2013 . #耗用時間15:37:30-15:37:13 =17s
- b、示範對lob資料類型的支援
- scott@SYBO2SZ> create table scott.testtab2 (nr number, txt clob);
- Table created.
- scott@SYBO2SZ> declare
- 2 x varchar2(50);
- 3 begin
- 4 for i in 1..5000 loop
- 5 x := 'This is a line with the number: ' || i;
- 6 insert into scott.testtab2 values(i,x);
- 7 commit;
- 8 end loop;
- 9 end;
- 10 /
- PL/SQL procedure successfully completed.
- scott@SYBO2SZ> select count(*) from testtab2;
- COUNT(*)
- ----------
- 5000
- robin@SZDB:/u02/database/SYBO2SZ/BNR/dump> exp scott/tiger file=exp_testtab2.dmp tables=scott.testtab2 direct=y
- Export: Release 10.2.0.3.0 - Production on Fri Jun 21 11:56:37 2013
- Copyright (c) 1982, 2005, Oracle. All rights reserved.
- About to export specified tables via Direct Path ...
- Table TESTTAB2 will be exported in conventional path.
- . . exporting table TESTTAB2 5000 rows exported
- Export terminated successfully without warnings.