Oracle 資料移動兩大工具族:傳統 exp/imp(Client-side,10g 前主流)與 expdp/impdp Data Pump(Server-side,10g+ 推薦)。本文對比參數、提供實戰範例、解決跨版本、權限不足等常見問題。
一、傳統 exp/imp(Client 端執行)
exp 關鍵參數
| 參數 | 說明 | 預設 |
| USERID | 連線帳密(必須為第一參數) | - |
| FULL | 全庫匯出 | N |
| OWNER | 指定綱要清單 | - |
| TABLES | 指定表清單(支援分區 T1:P1) | - |
| FILE | 輸出 .dmp 檔名 | EXPDAT.DMP |
| COMPRESS | 壓縮區段(Y=單一 extent) | Y |
| GRANTS / INDEXES / CONSTRAINTS / TRIGGERS | 權限/索引/約束/觸發器 | Y |
| ROWS | 匯出資料列 | Y |
| LOG | 日誌檔 | 螢幕 |
| CONSISTENT | 交叉表一致性(需 UNDO 空間) | N |
| QUERY | 匯出子集 WHERE 條件 | - |
| PARFILE | 參數檔路徑 | - |
imp 關鍵參數
| 參數 | 說明 | 預設 |
| USERID | 連線帳密 | - |
| FULL | 全庫匯入 | N |
| FROMUSER / TOUSER | 來源/目標綱要對應 | - |
| TABLES | 指定表清單 | - |
| IGNORE | 忽略建立錯誤(Y=續跑) | N |
| GRANTS / INDEXES / CONSTRAINTS | 匯入權限/索引/約束 | Y |
| ROWS | 匯入資料列 | Y |
| LOG | 日誌檔 | 螢幕 |
| INDEXFILE | 將 DDL 寫入檔案不執行 | - |
| COMMIT | 批次提交頻率 (N=每表提交) | N |
| BUFFER | 緩衝區大小 | - |
實戰範例
# 匯出 SCOTT 綱要
exp scott/tiger@orcl file=scott.dmp log=scott_exp.log owner=scott grants=y indexes=y
# 匯入至 NEWUSER(綱要重對應)
imp newuser/tiger@orcl file=scott.dmp log=scott_imp.log fromuser=scott touser=newuser ignore=y
# 僅匯入表結構(不含資料)
imp scott/tiger@orcl file=scott.dmp rows=n indexes=n grants=n
二、Data Pump expdp/impdp(Server 端執行,10g+ 必用)
前置:建立目錄物件
CREATE DIRECTORY dpump_dir AS '/u01/dpump';
GRANT READ, WRITE ON DIRECTORY dpump_dir TO scott;
expdp 常用參數
| 參數 | 說明 |
| DIRECTORY | 目錄物件名(必填) |
| DUMPFILE | 輸出檔名(支援 file%U.dmp 多檔) |
| LOGFILE | 日誌檔 |
| SCHEMAS / TABLES / FULL | 匯出範圍 |
| CONTENT | ALL/DATA_ONLY/METADATA_ONLY |
| PARALLEL | 平行度(需 Enterprise Edition) |
| COMPRESSION | ALL/DATA_ONLY/METADATA_ONLY/NONE |
| ENCRYPTION | ALL/DATA_ONLY/ENCRYPTED_COLUMNS_ONLY/NONE |
| QUERY | 表級 WHERE 條件 |
| REMAP_SCHEMA | 來源:目標綱要 |
| REMAP_TABLESPACE | 來源:目標表空間 |
| EXCLUDE / INCLUDE | 物件類型過濾 |
impdp 常用參數
| 參數 | 說明 |
| DIRECTORY / DUMPFILE / LOGFILE | 同上 |
| SCHEMAS / TABLES / FULL | 匯入範圍 |
| REMAP_SCHEMA / REMAP_TABLESPACE / REMAP_DATAFILE | 重對應 |
| TABLE_EXISTS_ACTION | SKIP/APPEND/TRUNCATE/REPLACE |
| TRANSFORM | DDL 轉換(如 SEGMENT_ATTRIBUTES:N 去除存儲屬性) |
| PARTITION_OPTIONS | 分區處理(NONE/DEPARTITION/MERGE) |
| SKIP_UNUSABLE_INDEXES | 跳過不可用索引 |
實戰範例
# 平行匯出全庫(壓縮、加密)
expdp system/manager@orcl directory=dpump_dir dumpfile=full_%U.dmp logfile=full_exp.log full=y parallel=4 compression=all encryption=all encryption_password=Secret123
# 匯入並重對應綱要與表空間
impdp system/manager@orcl directory=dpump_dir dumpfile=full_01.dmp logfile=full_imp.log remap_schema=scott:newuser remap_tablespace=users:new_users table_exists_action=replace
# 僅匯入中繼資料(結構)
impdp scott/tiger@orcl directory=dpump_dir dumpfile=scott.dmp content=metadata_only
三、常見問題與解決方案
| 問題 | 原因 | 解決 |
| expdp 空表不匯出 | 11g+ 預設 DEFERRED_SEGMENT_CREATION | ALTER SYSTEM SET deferred_segment_creation=FALSE 或 INCLUDE=TABLE |
| 跨版本匯入失敗(如 11g → 19c) | 字元集、參數不相容 | 使用 Data Pump + VERSION=11.2 參數;必要時先升級目標庫 |
| 權限不足 ORA-39002/39006 | 缺少 DATAPUMP_EXP_FULL_DATABASE 角色 | GRANT DATAPUMP_EXP_FULL_DATABASE, DATAPUMP_IMP_FULL_DATABASE TO user; |
| 網路連線中斷導致作業卡住 | Client 端 exp/imp 易受網路影響 | 改用 Server 端 Data Pump,或 expdp ... NETWORK_LINK=remote_db |
| 匯入極慢 | 索引、約束同步建立 | TRANSFORM=INDEXES:N CONSTRAINTS:N 先匯資料,事後重建 |
選型建議
- 10g 以前、小資料量、Client 端執行:傳統 exp/imp 簡單直觀。
- 10g+、大資料量、跨平台、需平行/壓縮/加密:強制使用 Data Pump。
- 異構遷移(Oracle→PostgreSQL/MySQL):使用 SQL Developer / GoldenGate / CDC 工具,勿用 exp/imp。