首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> Oracle 資料庫 >> Oracle 資料庫基礎

Oracle 匯出匯入 (exp/imp) 完整指南與自動化備份腳本

     編輯:Oracle 資料庫基礎

exp 匯出工具

三種模式

  • 使用者模式:匯出特定使用者所有物件與資料 (OWNER=scott)
  • 資料表模式:匯出指定資料表 (TABLES=emp,dept)
  • 完整資料庫模式:需 EXP_FULL_DATABASE 權限 (FULL=Y)

互動式範例

$ exp scott/tiger@orcl
Enter array fetch buffer size: 4096 >
Export file: expdat.dmp > scott.dmp
(1)E(ntire database), (2)U(sers), or (3)T(ables): (2)U > 3
Export table data (yes/no): yes >
Compress extents (yes/no): yes >
Table(T) or Partition(T:P) to be exported: (RETURN to quit) > emp
. . exporting table EMP 14 rows exported
Table(T) or Partition(T:P) to be exported: (RETURN to quit) >
Export terminated successfully without warnings.

非互動式 (腳本適用) 範例

# 完整參數列
exp userid=scott/tiger@orcl \
    tables=emp,dept \
    file=/backup/exp_scott_$(date +%F).dmp \
    log=/backup/log/exp_scott_$(date +%F).log \
    buffer=8192000 \
    compress=n \
    grants=y \
    indexes=y \
    rows=y \
    consistent=y \
    statistics=none

# 使用參數檔 (parfile)
exp parfile=exp_scott.par

# exp_scott.par 內容
userid=scott/tiger@orcl
tables=emp,dept
file=/backup/exp_scott_%U.dmp
filesize=2G
log=/backup/log/exp_scott.log
buffer=8192000
compress=n
grants=y
indexes=y
rows=y
consistent=y

關鍵參數說明

參數說明建議值
BUFFER陣列提取緩衝區大小 (bytes)8M~64M
COMPRESS匯入時合併 extent (Y/N)大表設 N 避免匯入失敗
CONSISTENT交易一致性讀 (Y/N)Y (需足夠 UNDO)
FILESIZE單一 dump 檔最大尺寸2G (突破 32-bit 限制)
QUERY匯出資料的 WHERE 條件如 WHERE status='A'
DIRECT直接路徑匯出 (Y/N)Y (大量資料較快)
PARALLEL並行匯出 (需多檔案)配合 FILESIZE 使用

imp 匯入工具

匯入步驟順序

  1. 建立資料表 (CREATE TABLE)
  2. 插入資料 (INSERT)
  3. 建立索引 (CREATE INDEX)
  4. 建立觸發器/約束/授權

常見匯入指令

# 完整匯入 (需 DBA/IMP_FULL_DATABASE)
imp system/manager@orcl file=full.dmp full=y log=imp_full.log

# 結構重映射:將 scott 物件匯入 hr
imp system/manager@orcl file=scott.dmp fromuser=scott touser=hr log=imp_remap.log

# 忽略物件已存在錯誤,僅導入資料
imp scott/tiger@orcl file=scott.dmp tables=emp ignore=y

# 只列出 dump 內容不匯入
imp scott/tiger@orcl file=scott.dmp show=y

常見問題與對策

問題原因解決
ORA-00001 唯一鍵違反目標表已有資料且無 PK/UK 阻擋重複先 TRUNCATE 或 DROP 目標表,或使用 IGNORE=Y 搭配 PK/UK
ORA-02291 父鍵不存在FK 約束檢查失敗先匯入父表,再匯入子表;或匯入前 DISABLE FK,匯入後 ENABLE
IMP-00010 非有效輸出檔版本不相容 (imp 版本 < exp 版本)使用目標資料庫版本的 imp 工具;imp 可向下相容,不可向上
字元集不符導致亂碼NLS_LANG 設定錯誤匯出/匯入前設定相同 NLS_LANG,完成後再改回
大表匯入失敗:無法分配 extentCOMPRESS=Y 導致單一 extent 過大匯出時 COMPRESS=N;或預先建表指定大 extent

Linux 自動化每日備份 Shell 腳本

#!/bin/bash
# ==========================================
# Oracle 每日邏輯備份 (exp) + 壓縮 + 保留兩代
# 部署:crontab -e  ->  0 2 * * * /home/oracle/scripts/daily_exp.sh
# ==========================================

export ORACLE_HOME=/u01/app/oracle/product/19.0.0/dbhome_1
export ORACLE_SID=orcl
export PATH=$ORACLE_HOME/bin:$PATH
export NLS_LANG=AMERICAN_AMERICA.AL32UTF8

BAK_DIR=/backup/exp
BAK_KEEP=2          # 保留天數
DATE_TAG=$(date +%Y%m%d_%H%M)
PAR_FILE=$BAK_DIR/exp_full.par
LOG_FILE=$BAK_DIR/log/exp_${DATE_TAG}.log

# 1. 建立目錄
mkdir -p $BAK_DIR $BAK_DIR/log

# 2. 清理舊備份 (保留最近 $BAK_KEEP 天)
find $BAK_DIR -type f -name 'exp_*.dmp.gz' -mtime +$BAK_KEEP -delete
find $BAK_DIR/log -type f -name 'exp_*.log' -mtime +$BAK_KEEP -delete

# 3. 參數檔 (動態產生多檔案並行)
cat > $PAR_FILE <> $BAK_DIR/backup_history.log
else
  echo "$(date) EXP FAILED with status $EXP_STATUS" >> $BAK_DIR/backup_history.log
  # 可加入郵件通知
fi

# 6. 簡易驗證 (列出 dump 內容)
# zcat $BAK_DIR/exp_${DATE_TAG}_01.dmp.gz | imp show=y 2>&1 | head -20 >> $LOG_FILE

進階建議

  • 生產環境建議改用 Data Pump (expdp/impdp):效能更高、支援並行、可網路模式、可篩選中繼資料。
  • 搭配 RMAN 實體備份 做雙重保護:RMAN 負責完整/增量備份與時間點復原,exp/expdp 負責邏輯備份與跨版本/跨平台遷移。
  • 定期演練 還原測試,驗證備份檔完整性與 RTO/RPO 指標。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved