首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫

Oracle EXP/IMP 遷移備份完整指南:參數詳解、版本相容、碎片整理與自動化腳本

     編輯:Oracle 資料庫相關知識

EXP/IMP 核心定位

  • 邏輯備份/遷移工具:導出 DDL + 數據至二進位 .dmp,跨平台、跨版本 (向上相容)。
  • 非物理備份替代品:無法替代 RMAN 實現時間點恢復、塊級增量、加密壓縮。
  • 適用場景:表級遷移、Schema 重組、開發/測試環境刷新、跨版本升級輔助。

三種導出模式對比

IMP 導入順序 (依賴拓撲)

  1. 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 需重新編譯。

關鍵參數速查

模式參數包含對象典型用途
FullFULL=Y全庫 (含系統用戶、角色、配置檔、目錄、同義詞、資料庫連結、TS 定義、配額、審計、RLS...)跨機器全庫遷移、災備演練
User (Schema)OWNER=user1,user2指定用戶下所有對象 (表、視圖、索引、序列、觸發器、程序、包、類型、同義詞、授權...)Schema 級遷移、開發環境構建
TableTABLES=t1,t2:p1指定表/分區 (含數據、索引、約束、觸發器、授權、註釋)單表遷移、分區歸檔、數據修正
參數EXPIMP說明
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';

常見問題與對策

總結:為何生產環境建議遷移至 Data Pump (expdp/impdp)?

  • 並行度 (PARALLEL) → 速度提升 10x+。
  • 網路模式 (NETWORK_LINK) → 無中間 .dmp 落盤,跨庫直傳。
  • 細粒度過濾 (INCLUDE/EXCLUDE/SAMPLE) → 靈活選擇對象/數據。
  • 可重啟/附加/分離 → 長任務容錯。
  • 安全性:加密 (ENCRYPTION)、壓縮 (COMPRESSION)、權限分離。
  • EXP/IMP 已標記 Deprecated (12c+ 仍保留但不再增強)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
問題原因對策
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)