Oracle Data Pump (expdp/impdp) 雲為主流,但原版 exp/imp 仍在舊版本維護、跨版本遷移(如 9i→11g)、簡單表級備份、無 Directory 物件權限環境中廣泛使用。本文系統整理 exp/imp 三種工作模式、參數檔最佳實踐、常用場景指令範本。
$ exp
# 按提示輸入:用戶/密碼、匯出檔、全量/用戶/表模式、壓縮、授權、索引等
適合臨時、一次性、參數較少的操作;不適合自動化腳本。
$ exp user/pwd@dbname file=/backup/test.dmp full=y
# 或
$ exp user/pwd@dbname file=/backup/test.dmp owner=SCOTT
適合簡單固定參數的排程作業;參數多時命令過長難維護。
$ exp parfile=scott_exp.par
scott_exp.par 內容:
userid=scott/tiger
buffer=8192000
compress=n
grants=y
file=/backup/scott_20240115.dmp
log=/backup/scott_20240115.log
full=n
owner=scott
rows=y
indexes=y
constraints=y
statistics=none
優勢:參數與腳本分離、易版控、支援註解、避免密碼出現在進程列表(ps -ef 可見)。
| 模式 | 參數 | 適用場景 | 範例 |
|---|---|---|---|
| 全量 | FULL=Y | 整庫遷移、災難恢復基準備份 | exp system/xxx file=full.dmp full=y |
| 用戶/Schema | OWNER=(user1,user2) | 應用 Schema 遷移、開發環境刷新 | exp system/xxx file=app.dmp owner=APP_USER |
| 表級 | TABLES=(t1,t2) | 單表備份、測試資料製造、跨庫同步特定表 | exp app/app file=t1.dmp tables=T1,T2 |
| 參數 | 預設 | 建議值 | 影響 |
|---|---|---|---|
| BUFFER | 4096 | 8M~64M | 記憶體緩衝區大小,直接影響匯出速度 |
| COMPRESS | Y | N | Y=匯入時合併 Extents(易導致大表無法匯入),N=保留原儲存參數 |
| GRANTS | Y | Y | 匯出物件授權 |
| INDEXES | Y | Y | 匯出索引定義 |
| ROWS | Y | Y/N | N=僅匯出結構(Metadata Only) |
| CONSTRAINTS | Y | Y | 匯出約束定義 |
| STATISTICS | ESTIMATE | NONE | 避免匯入過時統計,遷移後重收 |
| DIRECT | N | Y | Direct Path Export,繞過 SQL 層,大表加速 2-5 倍 |
| CONSISTENT | N | Y | Read-Only 一致性視圖(Undo 消耗大),跨表一致性需求時開啟 |
| QUERY | - | - | 表級 WHERE 條件匯出子集,如 QUERY="WHERE created_dt > SYSDATE-30" |
| FILESIZE | 0 | 2G/4G | 分卷大小,突破檔案系統 2GB/4GB 限制 |
| FEEDBACK | 0 | 10000 | 每 N 行顯示進度點,長時間作業可視化 |
exp system/xxx parfile=app_backup.par
# app_backup.par
userid=system/xxx
file=/backup/app_20240115.dmp
log=/backup/app_20240115.log
owner=APP_USER
buffer=32000000
compress=n
grants=y
indexes=y
constraints=y
rows=y
statistics=none
feedback=50000
exp system/xxx file=schema_struct.dmp owner=APP_USER rows=n
exp app/app file=orders_2023Q1.dmp tables=ORDERS \
query="WHERE order_date >= TO_DATE('2023-01-01','YYYY-MM-DD') AND order_date < TO_DATE('2023-04-01','YYYY-MM-DD')" \
buffer=64000000 direct=y
exp app/app file=doc.dmp tables=DOCUMENTS \
buffer=64000000 direct=n -- LONG/LOB 不支援 DIRECT=Y
# 或改用 SQL*Plus COPY 命令(見遷移技巧篇)
| 參數 | 預設 | 建議 | 說明 |
|---|---|---|---|
| IGNORE | N | Y | 忽略建立錯誤(表已存在),繼續載入資料 |
| COMMIT | N | Y | 每陣列提交,減少 Undo/Rollback Segment 壓力 |
| FROMUSER/TOUSER | - | - | Schema 重映射,如 FROMUSER=OLD TOUSER=NEW |
| INDEXES | Y | Y | 匯入索引 |
| CONSTRAINTS | Y | Y | 匯入約束 |
| SKIP_UNUSABLE_INDEXES | N | Y | 跳過不可用索引維護,大幅加速匯入 |
| DESTROY | N | 謹慎 | 表空間傳輸模式下覆蓋資料檔 |
匯出/匯入雙端 NLS_LANG 必須一致(或來源為目標的子集)。不一致會導致字符損壞(如中文變亂碼)。檢查:
SELECT * FROM nls_database_parameters WHERE parameter IN ('NLS_CHARACTERSET','NLS_NCHAR_CHARACTERSET');
# 客戶端環境變數
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK # 或 AL32UTF8
Exp/Imp 雖為前代工具,但在跨大版本遷移、無 Directory 權限環境、簡單表級備份/同步場景仍具不可替代性。掌握參數檔模式、關鍵參數(COMPRESS=N, DIRECT=Y, CONSISTENT=Y, STATISTICS=NONE)、版本相容鐵律與字符集檢查,即可駕輕就熟應對各類邏輯備份需求。