教你怎樣在Oracle資料庫中高速匯出/匯入

來源:互聯網
上載者:User

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

進入 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
 
讓我們來分析該命令的各個部分。使用者識別碼/口令組合、表和轉儲檔案參數的意義是顯而易見的。與原來的匯出不同,檔案是在伺服器(不是用戶端)上建立的。位置由目錄參數值 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 還可以用來傳輸資料表空間;它非常強大,能夠即時地重定義並行方式,將更多的表添加到一個現有的進程中等等。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.