核心工具
- `exp` / `expdp` (Data Pump, 10g+ 推薦) - 匯出
- `imp` / `impdp` - 匯入
本文聚焦傳統 `exp/imp` (仍廣泛用於中小庫、跨版本遷移)。
一、EXP 匯出語法與參數
exp userid/password@tns_alias
FILE=dump.dmp
LOG=exp.log
[FULL=Y | OWNER=schema1,schema2 | TABLES=t1,t2]
[QUERY="WHERE condition"]
[BUFFER=8192]
[COMPRESS=N]
[GRANTS=Y]
[INDEXES=Y]
[CONSTRAINTS=Y]
[CONSISTENT=Y]
[STATISTICS=ALWAYS]
二、IMP 匯入語法與參數
imp userid/password@tns_alias
FILE=dump.dmp
LOG=imp.log
[FULL=Y | FROMUSER=src_schema TOUSER=target_schema | TABLES=t1,t2]
[IGNORE=Y]
[COMMIT=Y]
[BUFFER=2048000]
[GRANTS=Y]
[INDEXES=Y]
[SHOW=N]
三、實戰範例
1. 完整庫匯出/匯入
# 匯出
exp system/manager@TEST FILE=d:\daochu.dmp FULL=Y
# 匯入
imp system/manager@TEST FILE=d:\daochu.dmp
2. 指定 Schema 匯出/匯入
# 匯出 SYSTEM, SYS (慎用 SYS)
exp system/manager@TEST FILE=d:\daochu.dmp OWNER=(system,sys)
# 匯入並重映射 Schema
imp aichannel/aichannel@HUST FULL=Y FILE=d:\data\newsmgnt.dmp IGNORE=Y
3. 表級匯出/匯入
# 匯出多表
exp aichannel/aichannel@TESTDB2 FILE=d:\data\newsmgnt.dmp TABLES=(inner_notify,notify_staff_relat)
# 匯入指定表
imp system/manager@TEST FILE=d:\daochu.dmp TABLES=(table1)
4. 條件匯出 (WHERE 子句)
exp system/manager@TEST FILE=d:\daochu.dmp TABLES=(table1) QUERY="WHERE filed1 LIKE '00%'"
5. 定時備份腳本 (Linux/Unix Shell)
#!/bin/bash
dateString=$(date +%y%m%d%H%M)
exp userid/password TABLES=table1,table2 \
FILE=/backup/backup_${dateString}.dmp \
BUFFER=8192 GRANTS=Y COMPRESS=N
四、關鍵參數深度解析
| 參數 | 預設 | 建議 | 說明 |
| FULL | N | Y (完整備份) | 需 DBA 權限,包含所有用戶對象 |
| OWNER | - | Schema 列表 | 僅匯出指定擁有者 |
| TABLES | - | 表列表 | 支援分區表 `table:partition` |
| QUERY | - | 條件過濾 | 僅適用 TABLES 模式,需雙引號 |
| BUFFER | 4096 | 大表調大 (MB 級) | 資料緩衝區,影響效能 |
| COMPRESS | Y | N | Y 會嘗試將段壓縮到單一 extent,大表匯入易失敗 |
| CONSISTENT | N | Y (熱備份) | Y 使用 SET TRANSACTION READ ONLY,確保時間點一致性 |
| IGNORE | N | Y (遷移/重建) | Y 忽略建表錯誤 (ORA-00955) 繼續載入資料 |
| COMMIT | N | Y (大表) | Y 每陣列提交,避免巨大交易回滾段 |
| STATISTICS | ALWAYS | ALWAYS | 匯出優化器統計資訊 |
| SHOW | N | Y (預覽) | 僅顯示 DDL 不實際匯入 |
五、常見問題與對策
| 問題 | 原因 | 解決 |
| IMP-00009: 已存在表 | 目標表已存在 | 加 `IGNORE=Y` 或先 `DROP TABLE` |
| EXP-00008: ORACLE error 942 | 權限不足 | 授予 `EXP_FULL_DATABASE` / `DBA` |
| 字符集不匹配 | NLS_LANG 不一致 | 設定 `NLS_LANG=.AL32UTF8` (或源庫字符集) |
| 大表匯入極慢 | 索引/約束同步維護 | 先 `INDEXES=N CONSTRAINTS=N` 匯入資料,再 `imp ... INDEXFILE=idx.sql` 產生腳本手動建索引 |
| 跨版本遷移 (11g→19c) | 傳統 exp/imp 仍支援 | 目標庫用較高版本 imp 導入低版本 dmp,或改用 Data Pump (expdp/impdp) + VERSION 參數 |
六、Data Pump (expdp/impdp) 快速對照
# 匯出
expdp system/manager@TEST DIRECTORY=dp_dir DUMPFILE=full_%U.dmp FULL=Y PARALLEL=4
# 匯入
impdp system/manager@TEST DIRECTORY=dp_dir DUMPFILE=full_01.dmp REMAP_SCHEMA=src:tgt TABLE_EXISTS_ACTION=REPLACE
- 需建立 `DIRECTORY` 物件指向 OS 目錄
- 支援並行、壓縮、加密、網絡鏈接、過濾、重映射
- 大庫 (>100G) **強制使用 Data Pump**