EXP/IMP 概覽
EXP (Export) 與 IMP (Import) 是 Oracle 早期提供的邏輯備份工具,透過將資料導出為二進制 .dmp 檔案,實現資料遷移、備份還原、環境複製等功能。雖然 Oracle 10g+ 推薦使用 Data Pump (EXPDP/IMPDP),但 EXP/IMP 仍廣泛用於小型資料庫、跨版本遷移、表級操作等場景。
EXP 匯出命令核心參數
| 參數 | 說明 | 預設值 | 常用範例 |
USERID | 連線帳號/密碼[@TNS] | 必填 | system/manager@ORCL |
FILE | 輸出 .dmp 檔案路徑 | EXPDAT.DMP | FILE=d:\backup\exp_full.dmp |
FULL | 完整資料庫匯出 (需 DBA 權限) | N | FULL=Y |
OWNER | 指定匯出的 Schema 列表 | - | OWNER=(SCOTT, HR) |
TABLES | 指定匯出的表列表 | - | TABLES=(EMP, DEPT) |
QUERY | 指定 WHERE 條件匯出子集資料 | - | QUERY="WHERE deptno=10" |
ROWS | 是否匯出資料列 | Y | ROWS=N (僅結構) |
COMPRESS | 匯入時合併區段 (初始區段大小) | Y | COMPRESS=N |
CONSISTENT | 交易一致性匯出 (需 UNDO 空間) | N | CONSISTENT=Y |
LOG | 記錄檔路徑 | 螢幕輸出 | LOG=d:\backup\exp.log |
DIRECT | 直接路徑匯出 (繞過 SQL 層,較快) | N | DIRECT=Y |
INCTYPE | 增量匯出類型 (COMPLETE/CUMULATIVE/INCREMENTAL) | - | Oracle 9i 後不建議使用 |
FILESIZE | 單一 .dmp 最大大小 (支援多檔案) | - | FILESIZE=2G |
PARFILE | 參數檔路徑 (避免命令行過長) | - | PARFILE=exp.par |
IMP 匯入命令核心參數
| 參數 | 說明 | 預設值 | 常用範例 |
FILE | 輸入 .dmp 檔案路徑 | EXPDAT.DMP | FILE=d:\backup\exp.dmp |
FULL | 完整匯入 | N | FULL=Y |
FROMUSER | 來源 Schema 對應 | - | FROMUSER=SCOTT |
TOUSER | 目標 Schema 對應 | - | TOUSER=HR |
TABLES | 指定匯入的表 | - | TABLES=(EMP, DEPT) |
IGNORE | 忽略建立錯誤 (表已存在等) | N | IGNORE=Y |
INDEXES | 是否匯入索引 | Y | INDEXES=N |
CONSTRAINTS | 是否匯入約束 | Y | CONSTRAINTS=N |
GRANTS | 是否匯入權限 | Y | GRANTS=N |
ROWS | 是否匯入資料 | Y | ROWS=N |
COMMIT | 定期提交 (避免大交易回滾段不足) | N | COMMIT=Y |
BUFFER | 資料緩衝區大小 | 系統預設 | BUFFER=65536 |
實戰常用場景範例
1. 完整資料庫備份 (需 DBA 權限)
exp system/manager@ORCL FILE=d:\backup\full_exp.dmp FULL=Y LOG=d:\backup\full_exp.log
2. 特定 Schema 結構與資料
exp scott/tiger@ORCL FILE=d:\backup\scott.dmp OWNER=SCOTT LOG=d:\backup\scott.log
3. 僅匯出表結構 (無資料)
exp scott/tiger@ORCL FILE=d:\backup\scott_struct.dmp TABLES=(EMP, DEPT) ROWS=N
4. 條件式匯出子集資料
exp scott/tiger@ORCL FILE=d:\backup\emp_dept10.dmp TABLES=EMP QUERY="WHERE deptno=10"
5. 跨 Schema 匯入 (重命名 Schema)
imp scott/tiger@ORCL FILE=d:\backup\hr.dmp FROMUSER=HR TOUSER=SCOTT IGNORE=Y LOG=d:\backup\imp.log
6. 僅匯入特定表,忽略已存在錯誤
imp scott/tiger@ORCL FILE=d:\backup\full.dmp TABLES=(EMP, DEPT) IGNORE=Y
7. 參數檔案模式 (避免特殊字元轉義問題)
-- exp.par 內容
USERID=system/manager@ORCL
FILE=d:\backup\full.dmp
FULL=Y
LOG=d:\backup\full.log
COMPRESS=Y
CONSISTENT=Y
-- 執行
exp PARFILE=exp.par
字符集與 NLS 關鍵設定
匯出匯入過程涉及三層字符集轉換:
資料庫字符集 → 客戶端 NLS_LANG → 匯入端資料庫字符集
關鍵原則
- 匯出端:設定
NLS_LANG 與資料庫字符集一致,避免轉換損失
- 匯入端:設定
NLS_LANG 與目標資料庫字符集一致
- .dmp 檔案頭:記錄匯出時的字符集 ID (第 2-3 位元組)
字符集修正技巧 (緊急情況)
-- 1. 查看 .dmp 字符集 ID
-- 用二進制編輯器查看第 2-3 位元組,如 0x0001 = 1
SELECT NLS_CHARSET_NAME(1) FROM dual; -- US7ASCII
-- 2. 取得目標字符集 ID
SELECT NLS_CHARSET_ID('ZHS16GBK') FROM dual; -- 852 = 0x0354
-- 3. 修改 .dmp 第 2-3 位元組為 03 54
-- 使用 UltraEdit、WinHex 等工具修改後再匯入
跨版本遷移規則
| 場景 | EXP 版本 | IMP 版本 | 說明 |
| 高版本 → 低版本 | 低版本 EXP | 目標版本 IMP | 如 11g→10g,用 10g EXP |
| 低版本 → 高版本 | 來源版本 EXP | 目標版本 IMP | 如 10g→11g,用 11g IMP |
| 同版本 | 同版本 | 同版本 | 最佳相容性 |
EXP/IMP vs Data Pump (EXPDP/IMPDP) 選擇指南
| 維度 | EXP/IMP | Data Pump |
| 效能 | 單執行緒,較慢 | 並行處理,快 10-100 倍 |
| 大物件支援 | 受限於客戶端記憶體 | 伺服器端串流,支援 TB 級 |
| 網路模式 | 不支援 | 支援 NETWORK_LINK 直連 |
| 壓縮/加密 | 不支援 | 支援 |
| 跨版本 | 支援較好 | 需相容版本參數 |
| 適用場景 | 小型 DB、跨版本、表級操作 | 生產環境備份、大型遷移 |
常見問題排查
| 錯誤現象 | 原因 | 解決方案 |
| IMP-00010: not a valid export file | .dmp 損壞或非 EXP 產生 | 重新匯出、檢查傳輸模式 (FTP 用 BINARY) |
| IMP-00017: following statement failed | 建立物件失敗 (權限、空間、字符集) | 查看 LOG 詳細錯誤,預建表空間/用戶 |
| ORA-02374: conversion error | 字符集轉換失敗 | 統一 NLS_LANG 設定 |
| Snapshot too old (CONSISTENT=Y) | UNDO 空間不足 | 增加 UNDO 表空間或關閉 CONSISTENT |
總結
EXP/IMP 雖為經典工具,但在小型資料庫備份、跨版本遷移、開發測試資料準備等場景仍具不可替代價值。掌握核心參數組合、字符集處理、跨版本規則與常見錯誤排查,能讓你在缺乏 Data Pump 權限或環境受限時,依然高效完成資料遷移任務。