傳統的 exp/imp 工具雖然是跨平台遷移數據的首選,但速度慢一直是痛點。導入過程本質上是逐行讀取轉儲文件,再用 INSERT INTO 寫入目標表,大數據量下效率極低。Oracle 10g 推出的 Data Pump(expdp/impdp) 徹底改寫了底層架構:不再走 SQL 層,而是直接調用專用 API 在服務端並行讀寫,導出快 10-15 倍、導入快 5 倍,還支援按對象類型過濾(如只導出程序)。
Data Pump 在資料庫伺服器端 直接操作檔案,因此必須先建立目錄物件指向 OS 路徑:
CREATE DIRECTORY dpdata1 AS '/u02/dpdata1';
GRANT READ, WRITE ON DIRECTORY dpdata1 TO ananda;
目錄物件是邏輯別名,資料庫不會自動驗證路徑是否真實存在,路徑拼錯會導致任務建立成功但無法讀寫,請務必核對大小寫(Linux 區分大小寫,Windows 不區分)。
expdp ananda/abc123 tables=CASES directory=DPDATA1
dumpfile=expCASES.dmp job_name=CASES_EXPORT
CASES_EXPORT),記錄進度與中繼資料,作業結束自動清除。執行期間按 Ctrl+C 進入互動模式(提示符 Export>),不中斷後台任務:
Export> status
Job: CASES_EXPORT
Operation: EXPORT
Mode: TABLE
State: EXECUTING
Degree: 1
Dump file: /u02/dpdata1/expCASES.dmp
bytes written = 2048
Worker 1 Status: EXECUTING
Object Schema: DWOWNER
Object Name: CASES
Completed Rows: 4,687,818
輸入 CONTINUE_CLIENT 可恢復畫面輸出。
expdp ananda/abc123 tables=CASES directory=DPDATA1
dumpfile=expCASES_%U.dmp parallel=4 job_name=CASES_EXPORT
expCASES_01.dmp、expCASES_02.dmp…關鍵建議:將轉儲目錄置於獨立磁碟/檔案系統,避免與資料檔 I/O 爭用,否則平行增益會被管理開銷抵銷。平行度宜小於等於大表數量。
DBA_DATAPUMP_JOBS:作業整體狀態、平行度(DEGREE)。DBA_DATAPUMP_SESSIONS + V$SESSION:定位 MCP 前台會話 SID。V$PROCESS、V$PX_SESSION 追蹤平行查詢子會話。V$SESSION_LONGOPS:依 sofar/totalwork 估算剩餘時間。impdp ananda/abc123 directory=dpdata1 dumpfile=expCASES.dmp job_name=cases_import
TABLE_EXISTS_ACTION=APPEND。Import> 互動模式監控。傳統 exp 無法做到,Data Pump 輕鬆實現:
-- 僅導出所有程序
expdp ananda/iclaim directory=DPDATA1 dumpfile=expprocs.dmp include=PROCEDURE
-- 僅導出特定程序與函數
expdp ananda/iclaim directory=DPDATA1 dumpfile=expprocs.dmp
include=PROCEDURE:"='PROC1'",FUNCTION:"='FUNC1'"
-- 由轉儲檔產生 DDL 腳本(不導入資料)
impdp ananda/iclaim directory=DPDATA1 dumpfile=expprocs.dmp sqlfile=procs.sql
INCLUDE 支援 LIKE/NOT LIKE 模糊比對;EXCLUDE 可排除特定物件。結合可傳輸表空間(TTS)、即時調整平行度、動態加入表等進階特性,Data Pump 已成大型遷移首選。