工具定位對比
| 維度 | 傳統 EXP/IMP | Data Pump (EXPDP/IMPDP) |
| 架構 | Client 端進程,透過 SQL 層讀寫 | Server 端進程(DBMS_DATAPUMP),直接讀寫資料檔 |
| 效能 | 單執行緒,大表慢 | 支援並行 (PARALLEL),速度快 10-100 倍 |
| 網路模式 | 需 Client 安裝,資料經網路傳輸 | 可在遠端資料庫間直接導入 (NETWORK_LINK),無中間檔案 |
| 檔案格式 | 專有二進位,版本敏感 | 專有二進位,但向後相容性更好 |
| 過濾靈活度 | TABLES/QUERY 參數有限 | INCLUDE/EXCLUDE/SAMPLE/QUERY 細粒度物件級過濾 |
| 可中斷續傳 | 不支援 | 支援 ATTACH/CONTINUE_CLIENT、作業狀態查詢 |
| 壓縮/加密 | 不支援(需外部工具) | 內建 COMPRESSION/ENCRYPTION |
| 重映射能力 | 僅 FROMUSER/TOUSER | REMAP_SCHEMA/REMAP_TABLESPACE/REMAP_TABLE/REMAP_DATA(函數轉換) |
| 元資料 API | 無 | DBMS_METADATA/DBMS_DATAPUMP 程式化控制 |
版本相容性鐵律
- 傳統 EXP/IMP:導出工具版本 必須 ≥ 目標資料庫版本,否則報
EXP-00003、EXP-00008 等錯誤。導入工具可讀取舊版導出檔(向下相容)。
- Data Pump:
EXPDP 版本必須 ≥ 資料庫版本;IMPDP 版本必須 ≥ 導出檔版本。10g 導出檔可在 11g/12c/19c 導入,反之不可。
遷移策略決策樹
IF 資料庫版本 ≤ 10g R2 AND 資料量 < 50GB AND 無並行需求:
使用傳統 EXP/IMP(熟悉度高、腳本現成)
ELSE IF 跨平台/跨版本/大數據量/需並行/需重映射:
強制使用 Data Pump
ELSE IF 需零停機同步:
使用 GoldenGate / Active Data Guard / Streams
END IF
Data Pump 實戰範例
導出
-- 建立目錄物件(一次性)
CREATE DIRECTORY dp_dir AS '/u01/dpump';
GRANT READ, WRITE ON DIRECTORY dp_dir TO system;
-- 全庫導出(並行 4、壓縮、加密)
expdp system/manager@ORCL \
directory=dp_dir \
dumpfile=full_%U.dmp \
logfile=expdp_full.log \
full=y \
parallel=4 \
compression=ALL \
encryption=ALL \
encryption_password=Secret123 \
metrics=y
導入(Schema 重映射、表空間重映射、忽略已存在)
impdp system/manager@NEWDB \
directory=dp_dir \
dumpfile=full_%U.dmp \
logfile=impdp_full.log \
full=y \
parallel=4 \
remap_schema=OLD_SCHEMA:NEW_SCHEMA \
remap_tablespace=OLD_TBS:NEW_TBS \
table_exists_action=REPLACE \
exclude=STATISTICS \
transform=SEGMENT_ATTRIBUTES:N:TABLE
常見遷移坑點
- 目錄物件路徑:必須是資料庫伺服器本地路徑,非 Client 端路徑。
- 權限:需
DATAPUMP_EXP_FULL_DATABASE/DATAPUMP_IMP_FULL_DATABASE 角色。
- 字符集:目標庫字符集需為源庫超集,否則導入報
ORA-39002。
- 統計資訊:導入後建議重新收集
DBMS_STATS.GATHER_SCHEMA_STATS,或導出時 EXCLUDE=STATISTICS。
- 序列值:Data Pump 導入會重設序列為導出時的
LAST_NUMBER,若源庫導出後序列已大幅推進,目標庫可能產生重複鍵,需手動 ALTER SEQUENCE ... INCREMENT BY ... 對齊。