Oracle exp/imp 備份遷移實戰:參數詳解與常見錯誤排查
傳統 exp/imp 雖被 Data Pump 取代,但在中小資料庫、跨版本遷移仍常用。本文整理實戰指令、關鍵參數與踩坑記錄。
導出
exp userid=clsoft/clweiye@orcl \
file=clerp20100711.dmp \
direct=y \
log=clerp20100711exp.log
導入
imp clsoftoa/clsoftoa@orcl124 \
fromuser='CLSOFT' touser='clsoftoa' \
file='D:\clsoft_2012-06-26_17.dmp' \
log='D:\clsoft_2012-06-26_17.dmp.log' \
ignore=y \
buffer=100000000
核心參數對照表
| 參數 | 用途 | 建議值 |
| userid | 連線帳密@TNS | 具 DBA 權限帳號 |
| file | 匯出/匯入檔案路徑 | 完整路徑,避免相對路徑 |
| direct=y | 直接路徑導出(效能較好) | 大表建議開啟 |
| buffer | 資料緩衝區大小 | 100000000 (100MB) 視記憶體調整 |
| ignore=y | 導入時忽略建立錯誤(表已存在) | 遷移建議開啟 |
| fromuser/touser | Schema 重映射 | 跨使用者遷移必備 |
| log | 記錄檔路徑 | 務必指定,便於事後稽核 |
實戰遷移流程(11g → 10g 跨版本)
- 來源端導出:用 11g
exp 導出(注意:高版本導出低版本可能有相容性問題)
- 目標端備份:先用 10g
exp 備份原資料
- 修正 DMP 版本號:16 進位編輯器將檔頭
11.20.00 改為 10.20.10
- 清空目標 Schema:PL/SQL Developer → Objects → Tables → 全選 Drop
- 目標端導入:用 10g
imp 導入修正後 DMP
常見錯誤與解決
| 錯誤 | 原因 | 解決 |
| EXP-00056 ORA-28009 | Linux 下 sysdba 需轉義 | exp \'sys/pwd as sysdba\' ... |
| IMP-00010 頭部驗證失敗 | 跨版本 DMP 不相容 | 十六進位編輯器修改檔頭版本號 |
| IMP-00015 物件已存在 | 目標表未清空 | 先 Drop 所有物件或加 ignore=y |
| ORA-01435 使用者不存在 | fromuser/touser 拼錯 | 確認大小寫,Oracle 使用者名通常大寫 |
進階技巧
- 分表導出:
tables=table1,table2
- 只導結構:
rows=n
- 查詢導出:
query='WHERE created_date > SYSDATE-30'
- 壓縮傳輸:導出後
gzip file.dmp 再 FTP
遷移檢查清單
- 字元集一致性(
SELECT * FROM NLS_DATABASE_PARAMETERS)
- 表空間預建或
imp 自動建立權限
- 序列、同義詞、DB Link 等非表物件手動重建
- 導入後統計資訊重收集
DBMS_STATS.GATHER_SCHEMA_STATS
- 應用端連線字串、權限驗證