天天看點

10g新特性——Data Pump(轉)

利用 Oracle Database 10g 實用工具資料移動得到了很大的提高。

迄今為止,導出/導入工具集仍是跨多個平台轉移資料所需勞動強度最小的首選實用工具,盡管人們常常抱怨它速度太慢。導入隻是将每條記錄從導出轉儲檔案中讀出來,然後使用常見的 INSERT INTO 指令将其插入到目标表中,是以導入可能是個很慢的過程,這一點并不讓人感到吃驚。

[@more@]

進入 Oracle Data Pump,Oracle Database 10g 中的導出/導入工具包的更新更快的同類工具,它被設計來成倍地加速這個過程。

Data Pump 反映了整個導出/導入過程的徹底革新。它不是使用常見的 SQL 指令,而是應用專用 API 來以更快得多的速度加載和解除安裝資料。在我的測試中,我看到導出性能比在直接模式下提高了 10-15 倍,導入過程性能提高了 5 倍。此外,與使用導出實用工具不同,它還能夠隻取出特定類型的對象(如過程)。

Data Pump 導出

這個新的實用工具稱為 expdp,以和原來的導出 exp 區分開。在本例中,我們将用 Data Pump 來導出一個大表 CASES,大小約為 3GB。Data Pump 在伺服器端使用檔案處理來建立和讀取檔案;是以,目錄作為位置使用。在這種情況下,我們将使用檔案系統 /u02/dpdata1 來儲存轉儲檔案。

create directory dpdata1 as '/u02/dpdata1';
grant read, write on directory dpdata1 to ananda;
      

接下來,我們将導出資料:

expdp ananda/abc123 tables=CASES directory=DPDATA1 
dumpfile=expCASES.dmp job_name=CASES_EXPORT
      

讓我們來分析該指令的各個部分。使用者 ID/密碼組合、表和轉儲檔案參數的意義是顯而易見的。與原來的導出不同,檔案是在伺服器(不是用戶端)上建立的。位置由目錄參數值 DPDATA1 指定,它指向之前建立的 /u02/dpdata1。這個程序還在目錄參數指定的位置上建立一個日志檔案(同樣在伺服器上)。預設地,這個程序使用一個名稱為 DPUMP_DIR 的目錄;是以可以建立它來代替 DPDATA1。

注意上面的參數 job_name,這是個特殊的參數,在原來的導出中沒有。所有的 Data Pump 工作都通過作業來完成。Data Pump 作業 — 與 DBMS 作業不同 — 隻是伺服器程序,它代表主程序處理資料。主程序(稱為主要制程序)通過進階隊列 (AQ) 來協調這項工作;它通過在運作期内建立的一個特殊的表(稱為主表)來實作這個目的。在我們的例子中,如果您在 expdp 運作時檢查使用者 ANANDA 的模式 ,您将注意到一個表 CASES_EXPORT 的存在(對應參數 job_name)。當 expdp 結束時,這個表被丢棄。

導出監控

當 Data Pump Export (DPE) 運作時,按 Control-C;它将阻止消息在螢幕上顯示,但不停止導出程序本身。相反,它将顯示 DPE 提示符(如下所示)。程序現在被認為處于“互動式”模式:

Export>
      

這種方法允許在這個 DPE 作業上輸入幾條指令。要檢視概要,在提示符下使用 STATUS 指令:

Export> status
Job:CASES_EXPORT
Operation:EXPORT                         
Mode:TABLE                          
State:EXECUTING                      
Degree: 1
Job Error Count: 0
Dump file:/u02/dpdata1/expCASES.dmp 
bytes written =  2048

Worker 1 Status:
State:EXECUTING                      
Object Schema:DWOWNER
Object Name:CASES
Object Type:TABLE_EXPORT/TBL_TABLE_DATA/TABLE/TABLE_DATA
Completed Objects: 1
Total Objects: 1
Completed Rows: 4687818
      

記住,這隻是狀态顯示。導出在背景工作。要繼續在螢幕上檢視消息,從 Export> 提示符下使用指令 CONTINUE_CLIENT。

并行操作

您可以通過 PARALLEL 參數為導出使用一個以上的線程來顯著地加速作業。每個線程建立一個單獨的轉儲檔案,是以參數 dumpfile 應當擁有和并行度一樣多的項目。您可以指定通配符作為檔案名,而不是顯式地輸入各個檔案名,例如:

expdp ananda/abc123 tables=CASES directory=DPDATA1 
dumpfile=expCASES_%U.dmp parallel=4 job_name=Cases_Export
      

注意 dumpfile 參數擁有一個通配符 %U,它訓示檔案将按需要建立,格式将為 expCASES_nn.dmp,其中 nn 從 01 開始,然後按需要向上增加。

在并行模式下,狀态螢幕将顯示四個工作程序。(在預設模式下,隻有一個程序是可見的。)所有的工作程序同步取出資料,并在狀态螢幕上顯示它們的進度。

分離通路資料檔案和轉儲目錄檔案系統的輸入/輸出通道是很重要的。否則,與維護 Data Pump 作業相關的開銷可能超過并行線程的效益,并是以而降低性能。并行方式隻有在表的數量多于并行值并且表很大時才是有效的。

資料庫監控

您還可以從資料庫視圖獲得關于運作的 Data Pump 作業的更多資訊。監控作業的主視圖是 DBA_DATAPUMP_JOBS,它将告訴您在作業上有多少個工作程序(列 DEGREE)在工作。另一個重要的視圖是 DBA_DATAPUMP_SESSIONS,當它與上述視圖和 V$SESSION 結合時将給出主前台程序的會話 SID。

select sid, serial#
from v$session s, dba_datapump_sessions d
where s.saddr = d.saddr;
      

這條指令顯示前台程序的會話。更多有用的資訊可以從警報日志中獲得。當程序啟動時,MCP 和工作程序在警報日志中顯示如下:

kupprdp:master process DM00 started with pid=23, OS id=20530 to execute - 
SYS.KUPM$MCP.MAIN('CASES_EXPORT', 'ANANDA');
      

kupprdp:worker process DW01 started with worker id=1, pid=24, OS id=20532 to execute - SYS.KUPW$WORKER.MAIN('CASES_EXPORT', 'ANANDA');

kupprdp:worker process DW03 started with worker id=2, pid=25, OS id=20534 to execute - SYS.KUPW$WORKER.MAIN('CASES_EXPORT', 'ANANDA');

它顯示為資料泵操作啟動的會話的 PID。您可以用以下查詢找到實際的 SID:

select sid, program from v$session where paddr in 
(select addr from v$process where pid in (23,24,25));
      

PROGRAM 列将對應警報日志檔案中的名稱顯示程序 DM (為主程序)或 DW (為工作程序)。如果一個工作程序使用了并行查詢,比如說 SID 23,您可以在視圖 V$PX_SESSION 中看到它,并把它找出來。它将為您顯示從 SID 23 代表的工作程序中運作的所有并行查詢會話:

select sid from v$px_session where qcsid = 23;
      

從視圖 V$SESSION_LONGOPS 中可以獲得其它的有用資訊來預測完成作業将花費的時間。

select sid, serial#, sofar, totalwork
from v$session_longops
where opname = 'CASES_EXPORT'
and sofar != totalwork;
      

列 totalwork 顯示總工作量,該列的 sofar 數量被加和到目前的時刻 — 因而您可以用它來估計還要花多長時間。

Data Pump 導入

不過,資料導入性能是 Data Pump 真正出色的地方。要導入先前導出的資料,我們将使用

impdp ananda/abc123 directory=dpdata1 dumpfile=expCASES.dmp job_name=cases_import
      

導入程序的預設行為是建立表和所有相關的對象,然後在表已存在時産生一個錯誤。如果您想把資料添加到一個現有的表中,您可以在上述指令行中使用 TABLE_EXISTS_ACTION=APPEND。

和使用 Data Pump 導入一樣,在程序中按 Control-C 将進入 Date Pump Import (DPI) 的互動模式;同樣,提示符是 Import>。

處理特定對象

您是否有過隻需要從一個使用者導出特定的過程,以在一個不同的資料庫或使用者中重新建立這些過程的情況?與傳統的導出實用工具不同,Data Pump 允許您隻導出特定類型的對象。例如,以下指令讓您隻導出過程,而不導出其它任何東西 — 不導出表、視圖、甚至函數:

expdp ananda/iclaim directory=DPDATA1 dumpfile=expprocs.dmp include=PROCEDURE
      

要隻導出一些特定的對象 — 比如說,函數 FUNC1 和過程 PROC1 — 您可以使用

expdp ananda/iclaim directory=DPDATA1 dumpfile=expprocs.dmp 
include=PROCEDURE:"='PROC1'",FUNCTION:"='FUNC1'"
      

這個轉儲檔案充當了源對象的一個備份。您甚至可以用它來建立 DDL 腳本,以供之後使用。一個稱為 SQLFILE 的特殊參數允許建立 DDL 腳本檔案。

impdp ananda/iclaim directory=DPDATA1 dumpfile=expprocs.dmp sqlfile=procs.sql
      

該指令在 DPDATA1 指定的目錄中建立一個名稱為 procs.sql 的檔案,并将對象的腳本包含在導出轉儲檔案中。這種方法幫助您快速地在另一個模式中建立源對象。

利用參數 INCLUDE 允許您從轉儲檔案中定義要包含或排除的對象。您可以使用子句 INCLUDE=TABLE:"LIKE 'TAB%'" 來僅導出那些名稱以 TAB 開頭的表。類似地,您可以使用結構 INCLUDE=TABLE:"NOT LIKE 'TAB%'" 來排除所有名稱以 TAB 開頭的表。作為另一種選擇,您可以使用 EXCLUDE 參數來排除特定的對象。

通過外部表,Data Pump 還可以用來傳輸表空間;它非常強大,能夠即時地重定義并行方式,将更多的表添加到一個現有的程序中等等(這超出了本文的範圍;關于更多詳細資訊,請參考 Oracle Database Utilities 10g Release 1 10.1)。以下指令顯示Data Pump 導出實用工具提供的所有參數的清單:

expdp help=y
      

類似地,impdp help=y 将顯示 DPI 中的所有參數。

當 Data Pump 作業在運作時,您可以通過在 DPE 或 DPI 提示符下發出 STOP_JOB 來暫停它們,然後用 START_JOB 來重起它們。這個功能在您空間不足和想在繼續執行之前進行修改時非常友善。

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

轉載于:http://blog.itpub.net/8394333/viewspace-1000694/