EXP/IMP 是 Oracle 歷史最悠久的邏輯備份/遷移工具雖然被 Data Pump (EXPDP/IMPDP) 取代,但在小數據庫、表級遷移、元數據提取、版本交叉驗證場景仍不可替代。本文系統梳理全參數表、直接路徑優化、字符集轉換四要素、跨版本遷移 Bug 規避、表空間傳輸 (TTS) 實戰流程。
| 參數 | 說明 | 默認值 | 典型值 |
|---|---|---|---|
| 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 |
| 參數 | 說明 | 默認值 | 典型值 |
|---|---|---|---|
| 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 |
exp system/manager@orcl FILE=schema_struct.dmp LOG=struct.log FULL=Y ROWS=N COMPRESS=N DIRECT=Y
exp app_user/pass@orcl FILE=app_schema.dmp LOG=app.log OWNER=APP_USER BUFFER=100000000 FEEDBACK=10000 DIRECT=Y
exp app_user/pass@orcl FILE=orders_2024.dmp LOG=ord.log TABLES=ORDERS QUERY="WHERE order_date > SYSDATE-30" DIRECT=Y
-- 先在目標庫建表 (自定義存儲參數)
-- 再導入數據
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
-- 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);
DIRECT=YEXP-00067: table XXX will be exported in conventional path 表示回退常規路徑BUFFER=100M+四要素:
NLS_CHARACTERSET)
-- 導出端
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK # = 源庫字符集
exp ...
-- 導入端
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK # = 目標庫字符集
imp ...
-- 源庫: ZHS16GBK, 目標庫: AL32UTF8 (UTF8 是 GBK 嚴格超集)
-- 導出端: 客戶端 = 源庫字符集
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
exp ...
-- 導入端: 客戶端 = 導出端客戶端 (保持轉換鏈路)
export NLS_LANG=AMERICAN_AMERICA.ZHS16GBK
imp ...
-- 轉換鏈路: 源庫(GBK) → 客戶端(GBK) → 目標庫(UTF8) 只發生一次轉換
> ⚠️ 鐵律:目標庫字符集必須是源庫字符集的嚴格超集,否則數據截斷/亂碼不可逆。
| 遷移方向 | EXP 版本 | IMP 版本 | 關鍵動作 |
|---|---|---|---|
| 低版本 → 高版本 (如 10g → 19c) | 源庫版本 (10g) | 目標庫版本 (19c) | 無特殊問題,IMP 自動升級字典 |
| 高版本 → 低版本 (如 19c → 11g) | 目標庫版本 (11g) | 目標庫版本 (11g) | 必須用低版本 EXP 導出高版本數據 |
| 9i 特殊 Bug (EXP-00008 / ORA-00904) | 9i EXP | 9i IMP | 重建 EXU81RLS 視圖 (見下文) |
-- 在 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;
/
前提條件:同平台、同字符集、同塊大小、目標無同名表空間、自包含對象集、無 SYS 對象、無 MView/函數索引等不可傳輸對象。
EXEC SYS.DBMS_TTS.TRANSPORT_SET_CHECK('TS_DATA,TS_IDX', TRUE);
SELECT * FROM SYS.TRANSPORT_SET_VIOLATION; -- 無記錄 = 通過
TRANSPORT_TABLESPACE=Y TABLESPACES=(TS_DATA,TS_IDX)TRANSPORT_TABLESPACE=Y DATAFILES=('...')| 優化點 | 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 失效時提供可靠的備選方案。