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 匯入工具
匯入步驟順序
- 建立資料表 (
CREATE TABLE)
- 插入資料 (
INSERT)
- 建立索引 (
CREATE INDEX)
- 建立觸發器/約束/授權
常見匯入指令
# 完整匯入 (需 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,完成後再改回 |
| 大表匯入失敗:無法分配 extent | COMPRESS=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 指標。