熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> Oracle >> 正文

教你怎樣在Oracle數據庫中高速導出/導入

2013-11-13 15:56:20  來源: Oracle 

  迄今為止導出/導入工具集仍是跨多個平台轉移數據所需勞動強度最小的首選實用工具盡管人們常常抱怨它速度太慢導入只是將每條記錄從導出轉儲文件中讀出來然後使用常見的 INSERT INTO 命令將其插入到目標表中因此導入可能是個很慢的過程這一點並不讓人感到吃驚

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

  Data Pump 反映了整個導出/導入過程的徹底革新它不是使用常見的 SQL 命令而是應用專用 API 來以更快得多的速度加載和卸載數據在我的測試中我看到導出性能比在直接模式下提高了 導入過程性能提高了 此外與使用導出實用工具不同它還能夠只取出特定類型的對象(如過程)

  Data Pump 導出

  這個新的實用工具稱為 expdp以和原來的導出 exp 區分開在本例中我們將用 Data Pump 來導出一個大表 CASES大小約為 GBData Pump 在服務器端使用文件處理來創建和讀取文件因此目錄作為位置使用在這種情況下我們將使用文件系統 /u/dpdata 來保存轉儲文件

  

  create directory dpdata as /u/dpdata;   grant read write on directory dpdata to ananda;  

 

  接下來我們將導出數據

  

  expdp ananda/abc tables=CASES directory=DPDATA   dumpfile=expCASESdmp job_name=CASES_EXPORT  

  讓我們來分析該命令的各個部分用戶 ID/口令組合表和轉儲文件參數的意義是顯而易見的與原來的導出不同文件是在服務器(不是客戶端)上創建的位置由目錄參數值 DPDATA 指定它指向之前創建的 /u/dpdata這個進程還在目錄參數指定的位置上創建一個日志文件(同樣在服務器上)默認地這個進程使用一個名稱為 DPUMP_DIR 的目錄因此可以創建它來代替 DPDATA

  注意上面的參數 job_name這是個特殊的參數在原來的導出中沒有所有的 Data Pump 工作都通過作業來完成Data Pump 作業 — 與 DBMS 作業不同 — 只是服務器進程它代表主進程處理數據主進程(稱為主控制進程)通過高級隊列 (AQ) 來協調這項工作它通過在運行期內創建的一個特殊的表(稱為主表)來實現這個目的在我們的例子中如果您在 expdp 運行時檢查用戶 ANANDA 的模式 您將注意到一個表 CASES_EXPORT 的存在(對應參數 job_name)當 expdp 結束時這個表被丟棄

  導出監控

  當 Data Pump Export (DPE) 運行時按 ControlC它將阻止消息在屏幕上顯示但不停止導出進程本身相反它將顯示 DPE 提示符(如下所示)進程現在被認為處於交互式模式

  Export>

  這種方法允許在這個 DPE 作業上輸入幾條命令要查看概要在提示符下使用 STATUS 命令

  

  Export> status   Job:CASES_EXPORT   Operation:EXPORT               Mode:TABLE                State:EXECUTING              Degree:   Job Error Count:   Dump file:/u/dpdata/expCASESdmp   bytes written =       Worker Status:   StateEXECUTING              Object Schema:DWOWNER   Object Name:CASES   Object Type:TABLE_EXPORT/TBL_TABLE_DATA/TABLE/TABLE_DATA   Completed Objects:   Total Objects:   Completed Rows:  

  

  記住這只是狀態顯示導出在後台工作要繼續在屏幕上查看消息從 Export> 提示符下使用命令 CONTINUE_CLIENT

  並行操作

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

  

  expdp ananda/abc tables=CASES directory=DPDATA   dumpfile=expCASES_%Udmp parallel= job_name=Cases_Export  

  

  注意 dumpfile 參數擁有一個通配符 %U它指示文件將按需要創建格式將為 expCASES_nndmp其中 nn 從 開始然後按需要向上增加

  在並行模式下狀態屏幕將顯示四個工作進程(在默認模式下只有一個進程是可見的)所有的工作進程同步取出數據並在狀態屏幕上顯示它們的進度

  分離訪問數據文件和轉儲目錄文件系統的輸入/輸出通道是很重要的否則與維護 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 ssaddr = dsaddr;  

  

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

  

  kupprdp:master process DM started with pid= OS id= to execute   SYSKUPM$MCPMAIN(CASES_EXPORT ANANDA);      kupprdp:worker process DW started with worker id= pid= OS id= to execute   SYSKUPW$WORKERMAIN(CASES_EXPORT ANANDA);      kupprdp:worker process DW started with worker id= pid= OS id= to execute   SYSKUPW$WORKERMAIN(CASES_EXPORT ANANDA);  

  

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

  

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

  

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

  

  select sid from v$px_session where qcsid = ;  

  

  從視圖 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/abc directory=dpdata dumpfile=expCASESdmp job_name=cases_import  

  

  導入進程的默認行為是創建表和所有相關的對象然後在表已存在時產生一個錯誤如果您想把數據添加到一個現有的表中您可以在上述命令行中使用 TABLE_EXISTS_ACTION=APPEND

  和使用 Data Pump 導入一樣在進程中按 ControlC 將進入 Date Pump Import (DPI) 的交互模式同樣提示符是 Import>

  處理特定對象

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

  

  expdp ananda/iclaim directory=DPDATA dumpfile=expprocsdmp include=PROCEDURE  

  

  要只導出一些特定的對象 — 比如說函數 FUNC 和過程 PROC — 您可以使用

  

  expdp ananda/iclaim directory=DPDATA dumpfile=expprocsdmp   include=PROCEDURE:\=\PROC\\FUNCTION:\=\FUNC\\

  

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

  

  impdp ananda/iclaim directory=DPDATA dumpfile=expprocsdmp sqlfile=procssql

  

  該指令在 DPDATA 指定的目錄中創建一個名稱為 procssql 的文件並將對象的腳本包含在導出轉儲文件中這種方法幫助您快速地在另一個模式中創建源對象

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

  通過外部表Data Pump 還可以用來傳輸表空間它非常強大能夠即時地重定義並行方式將更多的表添加到一個現有的進程中等等


From:http://tw.wingwit.com/Article/program/Oracle/201311/17547.html
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.