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

Oracle EXP/IMP 工具深度解析:從基礎參數到表空間傳輸、字符集轉換與跨版本遷移

     編輯:Oracle 資料庫基礎

定位與價值:不只是備份工具

EXP/IMP 是 Oracle 最古老的命令列工具,本質是邏輯轉儲工具而非物理備份工具。其核心價值在於:

  • 小型資料庫 (<50GB) 完整邏輯備份
  • 跨版本/平台 Schema 遷移
  • 表級/分區級資料抽取與移動
  • 表空間傳輸 (TTS) 元數據導出
  • 邏輯/物理損壞檢測輔助
  • 字符集轉換中介

局限:TB 級資料庫效能差、無並行、無壓縮/加密、增量備份 9i 後廢棄。

EXP 核心參數完整對照

參數說明預設關鍵場景
USERID連線字串 (必須為第一參數)-sys/pwd@db as sysdba
FULL完整資料庫導出N需 DBA/EXP_FULL_DATABASE 權限
OWNERSchema 列表-OWNER=(SCOTT,HR)
TABLES表列表 (支援分區: T1:P1)-TABLES=(EMP, DEPT)
QUERYWHERE 子句過濾資料 (8i+)-QUERY="WHERE dt>SYSDATE-30"
ROWS導出資料列YROWS=N 僅結構
COMPRESS匯入時合併初始區段YCOMPRESS=N 保留原區段
CONSISTENT交易一致性 (SET TRANSACTION READ ONLY)NCONSISTENT=Y 需大 UNDO
DIRECT直接路徑導出 (繞過 SQL 層)NDIRECT=Y 大幅提速
BUFFER資料緩衝區大小256KBBUFFER=1048576
LOG記錄檔路徑螢幕LOG=exp.log
FILESIZE單檔最大值 (支援多檔)-FILESIZE=2G
PARFILE參數檔路徑-PARFILE=exp.par
TRANSPORT_TABLESPACE傳輸表空間元數據NTTS 遷移核心參數
TABLESPACES傳輸的表空間列表-TABLESPACES=(TBS1,TBS2)

表空間傳輸 (TTS) 完整流程

適用場景:同平台、同字符集、同區塊大小 (9i+ 放寬) 的大量資料快速遷移,速度接近檔案複製。

前置檢查

-- 檢查表空間自包含性
EXEC SYS.DBMS_TTS.TRANSPORT_SET_CHECK('TBS_DATA,TBS_IDX', TRUE);
SELECT * FROM SYS.TRANSPORT_SET_VIOLATIONS;
-- 無資料行 = 符合自包含條件

執行步驟

-- 1. 來源端:設為 READ ONLY
ALTER TABLESPACE tbs_data READ ONLY;
ALTER TABLESPACE tbs_idx READ ONLY;

-- 2. 導出元數據 (需 SYSDBA)
exp userid='sys/pwd as sysdba' \
  transport_tablespace=y \
  tablespaces=(tbs_data, tbs_idx) \
  file=tts_meta.dmp \
  log=tts_exp.log

-- 3. 複製資料檔 (OS 層面 cp/scp/ftp binary 模式)
scp /u01/oradata/prod/tbs_data*.dbf target:/u01/oradata/prod/

-- 4. 來源端:恢復 READ WRITE
ALTER TABLESPACE tbs_data READ WRITE;
ALTER TABLESPACE tbs_idx READ WRITE;

-- 5. 目標端:匯入元數據並掛載資料檔
imp userid='sys/pwd as sysdba' \
  transport_tablespace=y \
  file=tts_meta.dmp \
  datafiles=('/u01/oradata/prod/tbs_data01.dbf','/u01/oradata/prod/tbs_idx01.dbf') \
  log=tts_imp.log

-- 6. 目標端:設為 READ WRITE
ALTER TABLESPACE tbs_data READ WRITE;
ALTER TABLESPACE tbs_idx READ WRITE;

TTS 限制條件

  • ❌ SYS 物件不可傳輸
  • ❌ 物化視圖、基於函數索引、XMLIndex 不可傳輸 (版本相關)
  • ❌ 目標端不可有同名表空間
  • ✅ 9i+ 區塊大小可不同
  • ✅ 12c+ 支援跨平台 (需 ENDIAN 相同或轉換)

字符集與 NLS_LANG 深度解析

三層字符集轉換鏈

資料庫字符集 (Props$) 
  ↔ 客戶端 NLS_LANG (環境變數/註冊表)
  ↔ 匯入端資料庫字符集

NLS_LANG 結構與優先級

NLS_LANG = <語言>_<地區>.<字符集>
例: AMERICAN_AMERICA.ZHS16GBK
     繁體中文: TRADITIONAL CHINESE_TAIWAN.ZHS16GBK

優先級:參數檔 > 註冊表 > 環境變數 > ALTER SESSION

關鍵原則

  • 客戶端字符集 必須與資料庫字符集相容 (子集→超集或相同)
  • 語言/地區部分不影響資料正確性,僅影響訊息/格式
  • EXP/IMP 過程中發生兩次轉換:DB→Client→DB

.dmp 檔案字符集修正技巧 (緊急救援)

-- 1. 讀取 .dmp 第 2-3 位元組 (Big Endian)
-- 十六進位: 00 01 → 十進位: 1
SELECT NLS_CHARSET_NAME(1) FROM dual;  -- US7ASCII

-- 2. 取得目標字符集 ID
SELECT NLS_CHARSET_ID('ZHS16GBK') FROM dual;  -- 852

-- 3. 轉十六進位: 852 = 0x0354
-- 4. 用二進位編輯器修改 .dmp 第 2-3 位元組為 03 54
-- 5. 以目標字符集環境匯入

跨版本遷移鐵律

遷移方向EXP 版本IMP 版本核心規則
高版本 → 低版本目標低版本目標版本如 19c→11g,用 11g EXP
低版本 → 高版本來源版本目標高版本如 11g→19c,用 19c IMP
同版本同版本同版本最佳相容

版本特殊說明

  • 8i → 9i/10g/11g:直接用目標版本 IMP
  • 10g → 11g:10g EXP 導出,11g IMP 導入
  • 11g → 12c/19c:11g EXP,目標版本 IMP (注意 PDB/非 PDB)
  • ⚠️ 9i 後不支援增量/累積導出 (INCTYPE)

Data Pump (EXPDP/IMPDP) 取代指南

場景建議工具理由
> 50GB 資料庫Data Pump並行度、壓縮、網路模式
跨版本 Schema 遷移EXP/IMP相容性更好、版本限制少
表空間傳輸Data Pump (12c+)功能更完整、效能更好
邏輯損壞修復EXP/IMP可跳過損壞區塊導出好資料
定時自動化備份RMAN物理備份、增量、目錄管理

常見錯誤代碼速查

代碼含義解決
EXP-00008ORACLE error %s encountered查看後續 ORA- 錯誤
EXP-00011username/password invalid檢查連線字串、權限
IMP-00010not a valid export file檔案損壞/非 EXP 產生/傳輸模式錯誤
IMP-00017statement failed查看 LOG 具體 DDL 錯誤 (空間/權限/字符集)
IMP-00033character set conversion not supported統一 NLS_LANG、修正 .dmp 字符集標記

總結

EXP/IMP 雖為經典工具,但在跨版本遷移、表級操作、TTS 元數據導出、字符集轉換中介、邏輯損壞資料搶救等細分場景仍具獨特價值。掌握參數組合、字符集機制、版本相容規則與 TTS 流程,是資深 DBA 必備技能。對於大型生產環境常規備份,請毫不猶豫選擇 RMAN + Data Pump 組合。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved