Exp/Imp 架構與適用場景
- Exp (Export):邏輯備份,將物件定義+資料寫入二進位 .dmp 檔
- Imp (Import):從 .dmp 還原物件與資料
- 適用:跨版本遷移、Schema 複製、資料子集匯出、開發/測試環境建立
- 不適用:大型資料庫完整備份 (用 RMAN)、高可用性備份、時間點恢復
舊版 (Exp/Imp) vs 新版 Data Pump (Expdp/Impdp)
| 特性 | Exp/Imp (舊) | Expdp/Impdp (Data Pump) |
| 執行位置 | Client 端 | Server 端 (Directory Object) |
| 平行度 | 單執行緒 | PARALLEL 多執行緒 |
| 網路模式 | 不支援 | 支援 (NETWORK_LINK) |
| 壓縮/加密 | 不支援 | 支援 |
| 匯入重映射 | 有限 | 完整 (REMAP_SCHEMA/TABLESPACE/DATAFILE) |
| 互動模式 | 支援 | 不支援 |
建議:10g+ 環境優先使用 Data Pump;僅 9i 以下或特殊相容需求用 Exp/Imp。
Exp 經典參數與範例
| 參數 | 說明 | 範例 |
| FULL=Y | 全庫匯出 (需 EXP_FULL_DATABASE) | exp system/pass@ORCL FILE=full.dmp FULL=Y |
| OWNER | 指定 Schema 列表 | exp system/pass@ORCL FILE=hr.dmp OWNER=HR |
| TABLES | 指定表列表 | exp hr/pass@ORCL FILE=t.dmp TABLES=EMP,DEPT |
| QUERY | 資料過濾條件 | exp hr/pass@ORCL FILE=q.dmp TABLES=EMP QUERY="WHERE deptno=10" |
| COMPRESS=Y | 匯入時合併 Extents (舊版) | exp ... COMPRESS=Y |
| CONSISTENT=Y | 交易一致性匯出 (Undo 保留) | exp ... CONSISTENT=Y |
| STATISTICS=NONE | 不匯出統計資訊 | exp ... STATISTICS=NONE |
| LOG | 記錄檔 | exp ... LOG=exp.log |
Imp 經典參數與範例
| 參數 | 說明 | 範例 |
| FULL=Y | 全庫匯入 | imp system/pass@ORCL FILE=full.dmp FULL=Y |
| FROMUSER/TOUSER | Schema 重映射 | imp system/pass@ORCL FILE=hr.dmp FROMUSER=HR TOUSER=HR_NEW |
| TABLES | 指定表匯入 | imp hr/pass@ORCL FILE=t.dmp TABLES=EMP |
| IGNORE=Y | 忽略建立錯誤 (表已存在) | imp ... IGNORE=Y |
| INDEXES=N | 不匯入索引 (稍後手建) | imp ... INDEXES=N |
| COMMIT=Y | 定期提交 (大量資料) | imp ... COMMIT=Y BUFFER=10485760 |
| DESTROY=Y | 覆蓋資料檔 (慎用) | imp ... DESTROY=Y |
| SHOW=Y | 僅顯示 DDL 不執行 | imp ... SHOW=Y |
實戰場景腳本
場景 1:Schema 遷移至新資料庫
# 來源
exp system/pass@SRC FILE=hr_schema.dmp OWNER=HR CONSISTENT=Y LOG=exp_hr.log
# 目標 (預建 Tablespace/User)
imp system/pass@TGT FILE=hr_schema.dmp FROMUSER=HR TOUSER=HR LOG=imp_hr.log
場景 2:大表分批匯出/匯入
# 分區表按分區匯出
exp hr/pass@ORCL FILE=orders_p1.dmp TABLES=ORDERS PARTITION=P_2023_Q1
exp hr/pass@ORCL FILE=orders_p2.dmp TABLES=ORDERS PARTITION=P_2023_Q2
# ... 依序匯入
場景 3:僅匯出 DDL (結構)
exp system/pass@ORCL FILE=ddl_only.dmp OWNER=HR ROWS=N LOG=ddl.log
# 匯入時
imp system/pass@ORCL FILE=ddl_only.dmp FROMUSER=HR TOUSER=HR INDEXES=N
常見錯誤與解決
| 錯誤 | 原因 | 解決 |
| EXP-00008: ORACLE error 904 | 版本不相容 (高版本導出低版本匯入) | 用目標版本的 Exp 匯出,或用 Data Pump NETWORK_LINK |
| IMP-00003: ORACLE error 1435 | 使用者不存在 | 先建立使用者/表空間 |
| IMP-00017: 表已存在 | 預設不覆蓋 | 加 IGNORE=Y 或先 DROP TABLE |
| EXP-00056: ORACLE error 1555 | Snapshot too old (CONSISTENT=Y) | 增加 Undo 保留時間、避開高峰期 |
| 字符集不匹配 | NLS_LANG 設定錯誤 | 設定 NLS_LANG 為來源資料庫字符集 |
Data Pump 快速入門 (建議替代)
# 建立 Directory
CREATE DIRECTORY dpump_dir AS '/u01/dpump';
GRANT READ, WRITE ON DIRECTORY dpump_dir TO hr;
# 匯出
expdp hr/pass@ORCL DIRECTORY=dpump_dir DUMPFILE=hr_%U.dmp
SCHEMAS=HR PARALLEL=4 COMPRESSION=ALL LOGFILE=expdp_hr.log
# 匯入
impdp hr/pass@ORCL DIRECTORY=dpump_dir DUMPFILE=hr_%U.dmp
SCHEMAS=HR REMAP_SCHEMA=HR:HR_NEW TABLE_EXISTS_ACTION=REPLACE