| 模式 | 參數 | 包含對象 | 典型用途 |
| Full | FULL=Y | 全庫 (含系統用戶、角色、配置檔、目錄、同義詞、資料庫連結、TS 定義、配額、審計、RLS...) | 跨機器全庫遷移、災備演練 |
| User (Schema) | OWNER=user1,user2 | 指定用戶下所有對象 (表、視圖、索引、序列、觸發器、程序、包、類型、同義詞、授權...) | Schema 級遷移、開發環境構建 |
| Table | TABLES=t1,t2:p1 | 指定表/分區 (含數據、索引、約束、觸發器、授權、註釋) | 單表遷移、分區歸檔、數據修正 |
IMP 導入順序 (依賴拓撲)
- Tablespaces → 2. Profiles → 3. Users → 4. Roles → 5. System Privs → 6. Role Grants → 7. Default Roles → 8. TS Quotas → 9. Resource Costs → 10. Rollback Segments → 11. DB Links → 12. Sequences → 13. Snapshots → 14. Snapshot Logs → 15. Job Queues → 16. Refresh Groups → 17. Clusters → 18. Tables (含授權/註釋/索引/約束/審計) → 19. Referential Integrity (FK) → 20. Post-Table Actions → 21. Synonyms → 22. Views → 23. Stored Procedures → 24. Triggers/Defaults/Auditing
關鍵點:Trigger 最後導入 → 數據載入不觸發 Trigger;Procedure 可能 INVALID 需重新編譯。
關鍵參數速查
| 參數 | EXP | IMP | 說明 |
| BUFFER | ✓ | ✓ | 資料緩衝區大小 (Byte),大表調大 (如 10M) |
| COMPRESS | ✓ | - | Y: INITIAL = 總大小 (單 Extent);N: 保留原 STORAGE。慎用 Y 可能導致導入失敗 (Extent > Datafile) |
| CONSISTENT | ✓ | - | Y: 讀一致性 (SET TRANSACTION READ ONLY),長耗時/高 UNDO,大表必開 |
| DIRECT | ✓ | - | Y: 直接路徑導出 (繞過 SQL 層),快但不觸發 Trigger/約束檢查 |
| GRANTS/INDEXES/CONSTRAINTS/TRIGGERS | ✓ | ✓ | 是否導出/入,預設 Y |
| ROWS | ✓ | ✓ | N: 僅導 DDL (結構遷移) |
| FILE/FILESIZE | ✓ | ✓ | 分卷大小 (2G 限制舊版),多檔自動分卷 |
| LOG | ✓ | ✓ | 日誌檔路徑,必指定 便於審計 |
| PARFILE | ✓ | ✓ | 參數檔路徑,避免命令列洩露密碼/過長 |
| QUERY | ✓ | - | WHERE 子句過濾導出數據 (如 QUERY='WHERE dt>SYSDATE-30') |
| FROMUSER/TOUSER | - | ✓ | Schema 重映射導入,TOUSER 必須預存在 |
| IGNORE | - | ✓ | Y: 忽略建立錯誤 (表已存在),繼續導數據 |
| COMMIT | - | ✓ | Y: 陣列插入後提交,減少 UNDO/鎖持有 |
| DESTROY | - | ✓ | Y: 覆蓋數據檔 (危險,僅全導入全新庫用) |
| INDEXFILE | - | ✓ | 將 DDL 導向檔案不執行,供審查/修改 STORAGE |
版本相容鐵律
- IMP 版本 ≥ EXP 版本 ≥ 5.1.22:向上相容 (舊導出 → 新導入)。
- 跨大版本 (如 9i → 12c) 需在目標庫執行
@?/rdbms/admin/catexp.sql 同步字典視圖。
- 字符集不同時:EXP 端 NLS_LANG 設為源庫字符集,IMP 端設為目標庫字符集,Oracle 自動轉碼。
碎片整理原理與陷阱
COMPRESS=Y 將 INITIAL = SUM(Extents),導入時嘗試分配單一巨大 Extent。
- ✅ 適用:表已刪除大量數據、High Water Mark 偏高、目標表空間有大連續空間 (Bigfile/ASM)。
- ❌ 禁用:表有大量空洞但未清理 (DELETE 未 COMMIT/無 Enable Row Movement)、目標表空間為 Smallfile 多檔案 (Extent 不跨檔)、表接近 2GB/4GB 限制。
- 💡 現代替代:
ALTER TABLE ... MOVE TABLESPACE ... + ALTER INDEX ... REBUILD + DBMS_REDEFINITION 線上重組。
自動化備份腳本 (Linux/Unix)
#!/bin/bash
# exp_full_backup.sh - 每日全庫導出
# Crontab: 0 2 * * * /scripts/exp_full_backup.sh >> /var/log/exp_cron.log 2>&1
export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID=PROD
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8
export TZ=Asia/Shanghai
DATE=$(date +%Y%m%d)
DMP_DIR=/backup/exp
LOG_DIR=/backup/exp/log
mkdir -p $DMP_DIR $LOG_DIR
# 參數檔避免密碼洩露
cat > /tmp/exp_$$.par <> $LOG_DIR/status.log
# 保留 7 天
find $DMP_DIR -name "exp_full_*.dmp" -mtime +7 -delete
find $LOG_DIR -name "exp_full_*.log" -mtime +7 -delete
else
echo "$(date) EXP FULL FAILED CODE=$RET" >> $LOG_DIR/status.log
# 告警邏輯: mail/slack/webhook
fi
Schema 級遷移實戰 (跨版本/跨平台)
# 1. 源庫導出
exp system/pass@src owner=APP_USER file=app_user.dmp log=exp_app.log consistent=y compress=n
# 2. 目標庫建立用戶/表空間/配額 (預先執行)
# CREATE USER app_user IDENTIFIED BY ... DEFAULT TABLESPACE app_data ...
# 3. 目標庫導入 (Schema 重映射可選)
imp system/pass@tgt fromuser=APP_USER touser=APP_USER file=app_user.dmp log=imp_app.log \
grants=y indexes=y constraints=y triggers=y ignore=y commit=y feedback=5000
# 4. 事後處理
# - 重新編譯無效對象: @?/rdbms/admin/utlrp.sql
# - 更新統計信息: EXEC DBMS_STATS.GATHER_SCHEMA_STATS('APP_USER');
# - 檢查外鍵/觸發器狀態
# - 對比行數: SELECT table_name, num_rows FROM dba_tables WHERE owner='APP_USER';
常見問題與對策
| 問題 | 原因 | 對策 |
| IMP-00010: not a valid export file | 版本不匹配/檔案損壞/傳輸模式錯 (ASCII vs BINARY) | 確認版本、FTP 用 binary、檢查檔案頭 "EXPORT:V" 字樣 |
| ORA-02374: conversion error loading table | 字符集轉換失敗 (資料超出目標字符集範圍) | 統一用 AL32UTF8、或預先清洗非法字符 |
| IMP 卡住無響應 | 等待鎖/大量索引維護/UNDO 滿 | INDEXES=N 先導數據,事後手動建索引;COMMIT=Y;增大 UNDO |
| EXP 耗時極長 | CONSISTENT=Y 導致長查詢/UNDO 爭用 | 業務低峰執行、分 Schema 導出、考慮 Data Pump (expdp/impdp) |
總結:為何生產環境建議遷移至 Data Pump (expdp/impdp)?
- 並行度 (PARALLEL) → 速度提升 10x+。
- 網路模式 (NETWORK_LINK) → 無中間 .dmp 落盤,跨庫直傳。
- 細粒度過濾 (INCLUDE/EXCLUDE/SAMPLE) → 靈活選擇對象/數據。
- 可重啟/附加/分離 → 長任務容錯。
- 安全性:加密 (ENCRYPTION)、壓縮 (COMPRESSION)、權限分離。
- EXP/IMP 已標記 Deprecated (12c+ 仍保留但不再增強)。
- 上一篇文章: Oracle 動態交叉表生成:從靜態 SQL 到 Java 動態構建完整方案
- 下一篇文章: 解決 Oracle 安裝過程中「加載數據庫錯誤 areasQueries」的完整指南
Copyright ©
程式碼之家 All Rights Reserved