今天遇到一个需求,把一个Schema下的对象(Table, Sequence, Package, etc)分别转移到其他两个Schema下。如果用普通的Exp/Imp,需要在tables参数里面写很多东西。并且 wait4friend 还不确定能否对sequence等对象进行排除。所以决定使用10g之后提供的数据泵来处理。
背景是这样的,原始用户是Test,分别导入
1. TestDP_0,全量导入
2. TestDP_1,部分对象导入
准备工作
首先建立各种对象,其中比较重要的是Oracle目录对象。数据泵只能把数据存放在目录对象指定的位置。
PS: DB Link不是必须的,这里是为了测试本机数据不落地直接导入导出。
----------------------------------------------------------------------------------- -------- 建立数据泵需要使用的目录对象 drop directory pump; create directory pump as '/home/oracle/pump'; select * from dba_directories; ----------------------------------------------------------------------------------- -------- 建立连接到自己的db link -- as sysdba drop public database link link_self; create public database link link_self connect to system identified by *** using 'xxxx'; ----------------------------------------------------------------------------------- --------- 建立需要导入的用户 -- dest 0 and src 2 drop user testdp_0 cascade; create user testdp_0 identified by test default tablespace hfzc; grant resource, connect to testdp_0; -- dest 1 drop user testdp_1 cascade; create user testdp_1 identified by test default tablespace hfzc; grant resource, connect to testdp_1; -- dest 2 drop user testdp_2 cascade; create user testdp_2 identified by test default tablespace hfzc; grant resource, connect to testdp_2;
Step 1
全量导出用户下的所有对象,参数文件如下
userid=system/***
directory=pump -- Oracle目录对象
parallel=2
schemas=test
dumpfile=test201.dmp
logfile=test201.log
Step 2
把所有对象和数据导入到新建立的TestDP_0用户中
userid=system/***
directory=pump
parallel=2
schemas=test
remap_schema=test:testdp_0 -- 重新映射用户
dumpfile=test201.dmp
logfile=testdp_0_imp_full.log
transform=OID:N -- 避免在同一个库导入object时发生OID重复的错误
Step 3
把指定的对象导入到TestDP_1用户下,使用了include参数
userid=system/***
directory=pump
parallel=2
schemas=test
remap_schema=test:testdp_1
dumpfile=test201.dmp
logfile=testdp_1_imp_part.log
transform=OID:N
include=table:"in ('EP_BILL','EP_CUSTOMER')",sequence:"in ('BILL_ID') ",package:"in ('EP_PKG')" -- 只导入指定的对象
Step 4
通过exclude参数排除掉一部分对象,把其他的全部导入TestDP_2用户下,并且通过DB Link操作。注意这里没有使用刚才导出的dump文件。
userid=system/***
directory=pump
parallel=2
schemas=test
remap_schema=test:testdp_2
network_link=link_self -- 不使用DUMP文件,而直接使用数据库链接
logfile=testdp_2_imp_dblink.log
transform=OID:N
exclude=table:"in ('EP_BILL','EP_CUSTOMER')",sequence:"in ('BILL_ID') ",package:"in ('EP_PKG')" -- 排除对象
执行ExpDP,ImpDP
因为把参数都写在了参数文件中,所以调用过程非常简单,仅仅是使用不同的参数文件名称填充parfile
[oracle@TESTDB pump]$ expdp parfile=test.par