EXP/IMP 是 Oracle 最古老的命令列工具,本質是邏輯轉儲工具而非物理備份工具。其核心價值在於:
局限:TB 級資料庫效能差、無並行、無壓縮/加密、增量備份 9i 後廢棄。
| 參數 | 說明 | 預設 | 關鍵場景 |
|---|---|---|---|
| USERID | 連線字串 (必須為第一參數) | - | sys/pwd@db as sysdba |
| FULL | 完整資料庫導出 | N | 需 DBA/EXP_FULL_DATABASE 權限 |
| OWNER | Schema 列表 | - | OWNER=(SCOTT,HR) |
| TABLES | 表列表 (支援分區: T1:P1) | - | TABLES=(EMP, DEPT) |
| QUERY | WHERE 子句過濾資料 (8i+) | - | QUERY="WHERE dt>SYSDATE-30" |
| ROWS | 導出資料列 | Y | ROWS=N 僅結構 |
| COMPRESS | 匯入時合併初始區段 | Y | COMPRESS=N 保留原區段 |
| CONSISTENT | 交易一致性 (SET TRANSACTION READ ONLY) | N | CONSISTENT=Y 需大 UNDO |
| DIRECT | 直接路徑導出 (繞過 SQL 層) | N | DIRECT=Y 大幅提速 |
| BUFFER | 資料緩衝區大小 | 256KB | BUFFER=1048576 |
| LOG | 記錄檔路徑 | 螢幕 | LOG=exp.log |
| FILESIZE | 單檔最大值 (支援多檔) | - | FILESIZE=2G |
| PARFILE | 參數檔路徑 | - | PARFILE=exp.par |
| TRANSPORT_TABLESPACE | 傳輸表空間元數據 | N | TTS 遷移核心參數 |
| TABLESPACES | 傳輸的表空間列表 | - | TABLESPACES=(TBS1,TBS2) |
適用場景:同平台、同字符集、同區塊大小 (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;
資料庫字符集 (Props$)
↔ 客戶端 NLS_LANG (環境變數/註冊表)
↔ 匯入端資料庫字符集
NLS_LANG = <語言>_<地區>.<字符集>
例: AMERICAN_AMERICA.ZHS16GBK
繁體中文: TRADITIONAL CHINESE_TAIWAN.ZHS16GBK
優先級:參數檔 > 註冊表 > 環境變數 > ALTER SESSION
-- 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 |
| 同版本 | 同版本 | 同版本 | 最佳相容 |
| 場景 | 建議工具 | 理由 |
|---|---|---|
| > 50GB 資料庫 | Data Pump | 並行度、壓縮、網路模式 |
| 跨版本 Schema 遷移 | EXP/IMP | 相容性更好、版本限制少 |
| 表空間傳輸 | Data Pump (12c+) | 功能更完整、效能更好 |
| 邏輯損壞修復 | EXP/IMP | 可跳過損壞區塊導出好資料 |
| 定時自動化備份 | RMAN | 物理備份、增量、目錄管理 |
| 代碼 | 含義 | 解決 |
|---|---|---|
| EXP-00008 | ORACLE error %s encountered | 查看後續 ORA- 錯誤 |
| EXP-00011 | username/password invalid | 檢查連線字串、權限 |
| IMP-00010 | not a valid export file | 檔案損壞/非 EXP 產生/傳輸模式錯誤 |
| IMP-00017 | statement failed | 查看 LOG 具體 DDL 錯誤 (空間/權限/字符集) |
| IMP-00033 | character set conversion not supported | 統一 NLS_LANG、修正 .dmp 字符集標記 |
EXP/IMP 雖為經典工具,但在跨版本遷移、表級操作、TTS 元數據導出、字符集轉換中介、邏輯損壞資料搶救等細分場景仍具獨特價值。掌握參數組合、字符集機制、版本相容規則與 TTS 流程,是資深 DBA 必備技能。對於大型生產環境常規備份,請毫不猶豫選擇 RMAN + Data Pump 組合。