經典 EXP/IMP (Original Export/Import) 雖被 EXPDP/IMPDP 取代,但在 10g 及以下、小數據量、跨版本遷移、簡單邏輯備份場景仍具不可替代價值。本文系統梳理全庫/用戶/表/條件導出、導入參數、壓縮、Parfile 模板、異機遷移、常見報錯應對。
| 參數 | EXP | IMP | 說明 |
|---|---|---|---|
USERID | 用戶/密碼@TNS | 用戶/密碼@TNS | 連接字符串,AS SYSDBA 需外部認證 |
FULL | Y/N | Y/N | 全庫導出/導入(需 EXP_FULL_DATABASE/IMP_FULL_DATABASE 役) |
OWNER | 用戶列表 | - | 指定 Schema 導出 |
TABLES | 表列表 | 表列表 | 指定表導出/導入,支持 SCHEMA.TABLE |
QUERY | WHERE 子句 | - | 條件導出,QUERY=\"WHERE col > 100\" (雙引號轉義) |
FILE | 導出文件 | 導入文件 | 支持多文件 FILE=exp1.dmp,exp2.dmp |
LOG | 日志文件 | 日志文件 | 記錄導出/導入過程 |
COMPRESS | Y/N | - | Y=合併 Extent (導入後表更緊湊),需目標表空間足夠大 |
CONSISTENT | Y/N | - | Y=確保導出數據一致性 (SCN 級),大表增加 Undo 壓力 |
BUFFER | 字節數 | - | 客戶端緩衝區,建議 10MB+ (10485760) |
IGNORE | - | Y/N | Y=忽略創建對象錯誤(如表已存在),繼續導入數據 |
GRANTS | Y/N | Y/N | 導出/導入授權 |
INDEXES | Y/N | Y/N | 導出/導入索引 |
CONSTRAINTS | Y/N | Y/N | 導出/導入約束 |
ROWS | Y/N | Y/N | 導出/導入數據行,N=僅結構 |
PARFILE | 參數文件 | 參數文件 | 將參數寫入文件,命令行簡潔 |
# 1. 全庫導出 (需 DBA/EXP_FULL_DATABASE)
exp system/manager@ORCL FILE=/backup/full.dmp LOG=/backup/full.log FULL=Y COMPRESS=Y CONSISTENT=Y BUFFER=10485760
# 2. 指定 Schema 導出
exp system/manager@ORCL FILE=/backup/schema.dmp LOG=/backup/schema.log OWNER=(SCOTT,HR)
# 3. 指定表導出
exp scott/tiger@ORCL FILE=/backup/tables.dmp LOG=/backup/tables.log TABLES=(EMP,DEPT)
# 4. 條件導出 (WHERE 子句,注意引號轉義)
exp system/manager@ORCL FILE=/backup/cond.dmp LOG=/backup/cond.log TABLES=(ORDERS) QUERY="WHERE order_date > TO_DATE('2023-01-01','YYYY-MM-DD')"
# 5. 僅導出結構 (ROWS=N)
exp scott/tiger@ORCL FILE=/backup/struct.dmp LOG=/backup/struct.log ROWS=N
# 1. 全庫導入 (需 DBA/IMP_FULL_DATABASE)
imp system/manager@ORCL FILE=/backup/full.dmp LOG=/backup/imp_full.log FULL=Y IGNORE=Y
# 2. 指定表導入
imp scott/tiger@ORCL FILE=/backup/tables.dmp LOG=/backup/imp_tables.log TABLES=(EMP,DEPT) IGNORE=Y
# 3. 異機遷移:Schema 重映射 (FROMUSER/TOUSER)
imp system/manager@NEWDB FILE=/backup/schema.dmp LOG=/backup/remap.log FROMUSER=SCOTT TOUSER=SCOTT_NEW GRANTS=Y INDEXES=Y CONSTRAINTS=Y BUFFER=409600
# 4. Parfile 模板 (import.par)
# FROMUSER=SCOTT
# TOUSER=SCOTT_NEW
# ROWS=Y
# INDEXES=Y
# GRANTS=Y
# CONSTRAINTS=Y
# BUFFER=409600
# FILE=/backup/schema.dmp
# LOG=/backup/imp.log
# 執行:imp PARFILE=import.par
COMPRESS=Y:導出時合併 Extent,**導入後表更緊湊**,但要求目標表空間有足夠連續空間容納初始 Extent。exp ... | gzip > exp.dmp.gz (管道流式壓縮,節省磁盤,需解壓導入)。exp userid=scott/tiger@REMOTE FILE=local.dmp (客戶端直連遠程數據庫,無需遠程主機磁盤空間)。NLS_LANG **必須一致**,且與數據庫字符集兼容,否則中文亂碼。EXPDP/IMPDP VERSION= 參數控制導出生成的 DDL 兼容性。| 錯誤 | 原因 | 解決 |
|---|---|---|
EXP-00008: ORACLE error 942 encountered | 權限不足,無法訪問對象 | 授予 SELECT ANY TABLE 或對象級 SELECT |
IMP-00003: ORACLE error 955 encountered | 表已存在 | 加 IGNORE=Y 或先 DROP TABLE |
IMP-00017: following statement failed with ORACLE error 2291 | 外鍵約束違反 (父表數據缺失) | 先導入父表,或 CONSTRAINTS=N 後手動啟用 |
EXP-00091: Exporting questionable statistics | 統計信息不可靠 | 導入後 DBMS_STATS.GATHER_SCHEMA_STATS 重收集 |
LRM-00116: syntax error at 'QUERY' | QUERY 參數引號轉義錯誤 | Windows: QUERY="WHERE col='val'"; Linux: QUERY='WHERE col=\"val\"' |
IF 數據庫版本 <= 10g 或 需跨版本向上遷移 (9i→11g) 或 數據量 < 50GB 且無並行需求
→ EXP/IMP (簡單、客戶端工具、無目錄對象依賴)
ELSE IF 數據量 > 50GB 或 需並行/壓縮/加密/網絡導入/可插拔表空間/精細過濾
→ EXPDP/IMPDP (服務端並行、Data Pump API、功能全面)
ELSE IF 需邏輯備份 + 物理備份混合策略
→ RMAN (物理) + EXPDP (邏輯對象級)
掌握 EXP/IMP 的「參數正交組合、引號轉義、Parfile 模板化、字符集一致性」四大核心,即可在老舊系統維護、跨版本遷移、輕量級邏輯備份場景中游刃有餘。