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

Oracle EXP/IMP 邏輯導出導入完全指南:參數詳解、直接路徑優化、字符集轉換鐵律、跨版本遷移實戰與表空間傳輸技術

     編輯:Oracle 資料庫相關知識

EXP/IMP 是 Oracle 歷史最悠久的邏輯備份/遷移工具雖然被 Data Pump (EXPDP/IMPDP) 取代,但在小數據庫、表級遷移、元數據提取、版本交叉驗證場景仍不可替代。本文系統梳理全參數表、直接路徑優化、字符集轉換四要素、跨版本遷移 Bug 規避、表空間傳輸 (TTS) 實戰流程。

一、EXP 完整參數速查表

參數 說明 默認值 典型值
USERID 用戶/密碼[@tns] - system/manager@orcl
FULL 導出整庫 N Y
OWNER 導出指定 Schema 列表 - SCOTT,HR
TABLES 導出指定表列表 - EMP,DEPT
FILE 導出文件名 EXPDAT.DMP exp_20240101.dmp
COMPRESS 合併 Extents (初始 extent = 總大小) Y N (避免導入後空間浪費)
DIRECT 直接路徑導出 (繞過 SQL 層) N Y (大表必開)
CONSISTENT 交叉表一致性 (SET TRANSACTION READ ONLY) N Y (需大 UNDO)
BUFFER 緩衝區大小 (常規路徑) 256KB 10M+
RECORDLENGTH I/O 記錄長度 (跨平台必同步) OS 相關 65535
GRANTS/INDEXES/CONSTRAINTS/TRIGGERS 導出權限/索引/約束/觸發器 Y Y/N 按需
ROWS 導出數據行 Y N (僅結構)
FILESIZE 單文件最大尺寸 (分卷) 0 (不限) 2G (32位限制)
QUERY 導出子集 WHERE 子句 - "WHERE dt > SYSDATE-30"
TRANSPORT_TABLESPACE 可傳輸表空間元數據 N Y (TTS 模式)
TABLESPACES 傳輸表空間列表 - TS_DATA,TS_IDX
PARFILE 參數文件 (避免命令行過長/密碼明文) - exp.par
LOG 日志文件 - exp.log
STATISTICS 統計信息處理 ESTIMATE NONE/COMPUTE
FEEDBACK 進度顯示間隔 (行數) 0 10000

二、IMP 完整參數速查表

參數 說明 默認值 典型值
USERID 用戶/密碼[@tns] - system/manager@orcl
FULL 導入整個 DMP N Y
FROMUSER 源 Schema 列表 - SCOTT
TOUSER 目標 Schema 列表 (Schema 重映射) - APP_USER
TABLES 導入指定表 - EMP,DEPT
IGNORE 忽略創建錯誤 (表已存在) N Y (數據遷移常用)
INDEXES 導入索引 Y N (大表先導數據後建索引)
COMMIT 陣列提交 (加速) N Y (大表加速,LOB/LONG 除外)
DESTROY 覆蓋數據文件 (危險) N N
INDEXFILE 導出 DDL 到文件 (不導入數據) - ddl.sql
SKIP_UNUSABLE_INDEXES 跳過不可用索引維護 N Y
ANALYZE 執行 DMP 中統計命令 Y N (手動收集)
RECALCULATE_STATISTICS 重新計算統計值 N Y
TRANSPORT_TABLESPACE 導入 TTS 元數據 N Y
DATAFILES TTS 數據文件路徑 - '/u01/ts_data.dbf'
TTS_OWNERS TTS 擁有者 - APP_USER

三、常用導出導入模板

1. 全庫結構導出 (無數據)


exp system/manager@orcl FILE=schema_struct.dmp LOG=struct.log FULL=Y ROWS=N COMPRESS=N DIRECT=Y

2. Schema 級導出 (含數據)


exp app_user/pass@orcl FILE=app_schema.dmp LOG=app.log OWNER=APP_USER BUFFER=100000000 FEEDBACK=10000 DIRECT=Y

3. 單表導出 (含查詢過濾)


exp app_user/pass@orcl FILE=orders_2024.dmp LOG=ord.log TABLES=ORDERS QUERY="WHERE order_date > SYSDATE-30" DIRECT=Y

4. Schema 重映射導入 (數據遷移核心)


-- 先在目標庫建表 (自定義存儲參數)
-- 再導入數據
imp app_user/pass@target FILE=app_schema.dmp LOG=imp.log FROMUSER=APP_USER TOUSER=APP_USER IGNORE=Y INDEXES=N COMMIT=Y BUFFER=100000000

5. 大表優化導入流程


-- 1. 導入時跳過索引
imp ... INDEXES=N COMMIT=Y

-- 2. 導入完成後並行重建索引 (NOLOGGING)
ALTER INDEX idx_orders_dt REBUILD PARALLEL 8 NOLOGGING;

-- 3. 重新收集統計信息
EXEC DBMS_STATS.GATHER_TABLE_STATS('APP_USER', 'ORDERS', DEGREE=>8);

四、直接路徑優化機制與限制

  • 原理:繞過 SQL 引擎,直接讀取數據文件塊寫入 DMP
  • 啟用:DIRECT=Y
  • 不兼容場景:TTS、QUERY 參數、某些觸發器/約束
  • 日志識別:EXP-00067: table XXX will be exported in conventional path 表示回退常規路徑
  • 常規路徑必須大 BUFFER:BUFFER=100M+

五、字符集轉換鐵律:四要素同步原則

四要素:

  1. 導出端數據庫字符集 (NLS_CHARACTERSET)
  2. 導出端客戶端 NLS_LANG
  3. 導入端數據庫字符集
  4. 導入端客戶端 NLS_LANG

場景 1:同字符集庫遷移 (最簡單)


-- 導出端
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK  # = 源庫字符集
exp ...

-- 導入端
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK  # = 目標庫字符集
imp ...

場景 2:異字符集遷移 (嚴格超集要求)


-- 源庫: ZHS16GBK, 目標庫: AL32UTF8 (UTF8 是 GBK 嚴格超集)

-- 導出端: 客戶端 = 源庫字符集
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
exp ...

-- 導入端: 客戶端 = 導出端客戶端 (保持轉換鏈路)
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
imp ...

-- 轉換鏈路: 源庫(GBK) → 客戶端(GBK) → 目標庫(UTF8) 只發生一次轉換
> ⚠️ 鐵律:目標庫字符集必須是源庫字符集的嚴格超集,否則數據截斷/亂碼不可逆。

六、跨版本遷移:9i/10g/11g/12c/19c 實戰規則

遷移方向 EXP 版本 IMP 版本 關鍵動作
低版本 → 高版本 (如 10g → 19c) 源庫版本 (10g) 目標庫版本 (19c) 無特殊問題,IMP 自動升級字典
高版本 → 低版本 (如 19c → 11g) 目標庫版本 (11g) 目標庫版本 (11g) 必須用低版本 EXP 導出高版本數據
9i 特殊 Bug (EXP-00008 / ORA-00904) 9i EXP 9i IMP 重建 EXU81RLS 視圖 (見下文)

9i 跨版本 Bug 修復腳本 (METALINK Bug 2261722)


-- 在 9i 高版本庫執行
CREATE OR REPLACE VIEW EXU81RLS
(OBJOWN, OBJNAM, POLICY, POLOWN, POLSCH, POLFUN, STMTS, CHKOPT, ENABLED, SPOLICY)
AS
SELECT U.NAME, O.NAME, R.PNAME, R.PFSCHMA, R.PPNAME, R.PFNAME,
       DECODE(BITAND(R.STMT_TYPE,1),0,'','SELECT,') ||
       DECODE(BITAND(R.STMT_TYPE,2),0,'','INSERT,') ||
       DECODE(BITAND(R.STMT_TYPE,4),0,'','UPDATE,') ||
       DECODE(BITAND(R.STMT_TYPE,8),0,'','DELETE,'),
       R.CHECK_OPT, R.ENABLE_FLAG,
       DECODE(BITAND(R.STMT_TYPE,16),0,0,1)
FROM USER$ U, OBJ$ O, RLS$ R
WHERE U.USER# = O.OWNER#
  AND R.OBJ# = O.OBJ#
  AND (UID = 0 OR UID = O.OWNER# OR EXISTS (SELECT 1 FROM SESSION_ROLES WHERE ROLE='SELECT_CATALOG_ROLE'));
/
GRANT SELECT ON SYS.EXU81RLS TO PUBLIC;
/

七、表空間傳輸 (TTS) 實戰流程

前提條件:同平台、同字符集、同塊大小、目標無同名表空間、自包含對象集、無 SYS 對象、無 MView/函數索引等不可傳輸對象。

驗證自包含性


EXEC SYS.DBMS_TTS.TRANSPORT_SET_CHECK('TS_DATA,TS_IDX', TRUE);
SELECT * FROM SYS.TRANSPORT_SET_VIOLATION;  -- 無記錄 = 通過

操作步驟

  1. 源庫:表空間 READ ONLY
  2. 源庫:EXP 導出元數據 TRANSPORT_TABLESPACE=Y TABLESPACES=(TS_DATA,TS_IDX)
  3. 複製數據文件到目標庫 (OS 複製/ftp 二進制模式)
  4. 源庫:表空間 READ WRITE
  5. 目標庫:IMP 導入元數據 TRANSPORT_TABLESPACE=Y DATAFILES=('...')
  6. 目標庫:表空間 READ WRITE

八、EXP/IMP 優化總結清單

優化點 EXP IMP
核心參數 DIRECT=Y, BUFFER=大, RECORDLENGTH=統一 COMMIT=Y, INDEXES=N(後建), BUFFER=大
存儲優化 COMPRESS=N (避免大 INITIAL) 預建表指定存儲, IGNORE=Y
日志優化 - NOLOGGING 重建索引, 大 Redo Log 組/文件
排序優化 - SORT_AREA_SIZE=100M (手動 PGA)
分卷導出 FILESIZE=2G 多文件 -

九、總結

EXP/IMP 定位:小數據庫、表級遷移、元數據提取、版本交叉驗證的「瑞士軍刀」。
核心鐵律:DIRECT=Y 加速導出,INDEXES=N+COMMIT=Y 加速導入,字符集四要素同步,跨版本低版本工具雙向。
大數據庫 (TB 級) 必須用 Data Pump (EXPDP/IMPDP) + 並行 + 網絡模式。

掌握 EXP/IMP 參數矩陣、字符集轉換鏈路、跨版本規則、TTS 流程,您就能應對 95% 的邏輯遷移場景,並在 Data Pump 失效時提供可靠的備選方案。

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