Oracle Data Pump (expdp, impdp) 是 Oracle 10g 之后中新增的一個(gè)功能消别,用于導(dǎo)出和導(dǎo)入數(shù)據(jù)熄驼,速度非惩獬В快,適用于 10g, 11g, 12c, 18c, 19c 版本荠诬。
實(shí)際使用 expdp/impdp 工具的過程中中碰到了不少問題,做個(gè)記錄涯捻,以備不時(shí)之需浅妆。
本次操作環(huán)境:
- Oracle 版本:11g Enterprise Edition Release 11.2.0.1.0 - 64bit
- Linux 版本:CentOS x86_64(內(nèi)核版本Linux 3.10.0-327.el7.x86_64)
- 導(dǎo)出數(shù)據(jù)庫(kù)用戶為:HPM_DEV,表空間為:TBS_PERM_HPM_DEV
- 導(dǎo)入數(shù)據(jù)庫(kù)用戶為:HPM_UAT障癌,表空間為:TBS_PERM_HPM_UAT
Oracle expdp/impdp 提供四種導(dǎo)入導(dǎo)出的方式
- Table Exports/Imports(按表導(dǎo)出導(dǎo)入)
官方示例:
expdp scott/tiger@db10g tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=expdpEMP_DEPT.log
impdp scott/tiger@db10g tables=EMP,DEPT directory=TEST_DIR dumpfile=EMP_DEPT.dmp logfile=impdpEMP_DEPT.log
- Schema Exports/Imports(按用戶導(dǎo)出導(dǎo)入)
官方示例凌外;
expdp scott/tiger@db10g schemas=SCOTT directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log
impdp scott/tiger@db10g schemas=SCOTT directory=TEST_DIR dumpfile=SCOTT.dmp logfile=impdpSCOTT.log
- Database Exports/Imports(按數(shù)據(jù)庫(kù)全量導(dǎo)出導(dǎo)入)
官方示例;
expdp system/password@db10g full=Y directory=TEST_DIR dumpfile=DB10G.dmp logfile=expdpDB10G.log
impdp system/password@db10g full=Y directory=TEST_DIR dumpfile=DB10G.dmp logfile=impdpDB10G.log
- INCLUDE and EXCLUDE(按條件導(dǎo)出導(dǎo)入)
基本語(yǔ)法:
INCLUDE=object_type[:name_clause] [, ...]
EXCLUDE=object_type[:name_clause] [, ...]
官方示例涛浙;
expdp scott/tiger@db10g schemas=SCOTT include=TABLE:"IN ('EMP', 'DEPT')" directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log
expdp scott/tiger@db10g schemas=SCOTT exclude=TABLE:"= 'BONUS'" directory=TEST_DIR dumpfile=SCOTT.dmp logfile=expdpSCOTT.log
本次使用的是按用戶(scheme)導(dǎo)出導(dǎo)入方式
- 新建一個(gè)目錄存放導(dǎo)出的數(shù)據(jù)文件
在 SQLPlus 中操作康辑,創(chuàng)建一個(gè)邏輯目錄,映射一個(gè)物理地址轿亮,導(dǎo)出的文件就存放在這個(gè)物理地址中:
CREATE OR REPLACE DIRECTORY TEST_DIR AS '/u01/app/oracle/oradata/';
然后分別為導(dǎo)出用戶和導(dǎo)入用戶授權(quán)讀寫這個(gè)目錄:
GRANT READ, WRITE ON DIRECTORY TEST_DIR TO HPM_DEV;
GRANT READ, WRITE ON DIRECTORY TEST_DIR TO HPM_UAT;
- 導(dǎo)出數(shù)據(jù)
導(dǎo)出 HPM_DEV 的數(shù)據(jù)存放在服務(wù)器地址中
expdp HPM_DEV/{password}@ORCL schemas=HPM_DEV directory=TEST_DIR dumpfile=HPM_DEV.dmp logfile=expdpHPM_DEV.log
導(dǎo)出數(shù)據(jù)比較簡(jiǎn)單疮薇,一般來說也比較順利。
- 導(dǎo)入數(shù)據(jù)
這里最麻煩的地方是:
HPM_DEV 用戶使用的表空間是 TBS_PERM_HPM_DEV我注,要導(dǎo)入的用戶是 HPM_UAT按咒,而表空間是 TBS_PERM_HPM_UAT
因此導(dǎo)入的時(shí)候需要將用戶/schemes和表空間進(jìn)行轉(zhuǎn)換
這里需要用到兩個(gè)參數(shù):REMAP_SCHEMA 和 REMAP_TABLESPACE
- REMAP_SCHEMA:Loads all objects from the source schema into a target schema.
就是將導(dǎo)出的 scheme(HPM_DEV)轉(zhuǎn)換成另一個(gè)被導(dǎo)入的 scheme(HPM_UAT)
語(yǔ)法如下:
REMAP_SCHEMA = source_schema:target_schema
- REMAP_TABLESPACE:Remaps all objects selected for import with persistent data in the source tablespace to be created in the target tablespace.
和上面轉(zhuǎn)換 scheme 一樣,這個(gè)命令的作用就是轉(zhuǎn)換表空間
最終導(dǎo)入的 sql 為:
impdp HPM_UAT/{password}@ORCL REMAP_SCHEMA=HPM_DEV:HPM_UAT REMAP_TABLESPACE=TBS_PERM_HPM_DEV:TBS_PERM_HPM_UAT directory=TEST_DIR dumpfile=HPM_DEV.dmp logfile=impdpHPM_UAT.log
命令運(yùn)行到最后出了一個(gè)很奇怪的錯(cuò)誤:
ORA-39126: Worker unexpected fatal error in KUPW$WORKER.PUT_DDLS [TABLE_STATISTICS]
ORA-06502: PL/SQL: numeric or value error
LPX-00242: invalid use of ampersand ('&') character (use &)
ORA-06512: at "SYS.DBMS_SYS_ERROR", line 95
ORA-06512: at "SYS.KUPW$WORKER", line 9001
網(wǎng)友說是 Oracle 11g 的一個(gè)bug但骨,在導(dǎo)入語(yǔ)句中加入一個(gè)參數(shù):EXCLUDE=STATISTICS
即可解決
最終導(dǎo)入語(yǔ)句為:
impdp HPM_UAT/{password}@ORCL REMAP_SCHEMA=HPM_DEV:HPM_UAT REMAP_TABLESPACE=TBS_PERM_HPM_DEV:TBS_PERM_HPM_UAT directory=TEST_DIR dumpfile=HPM_DEV.dmp logfile=impdpHPM_UAT.log EXCLUDE=STATISTICS
最后順利導(dǎo)入成功励七。