最近在工作中遇到数据迁移并更改schema的需求。于是在测试环境中测试了expdp,impdp的更改的一些参数。
搭建实验环境:
准备一个oracle 11g 的环境作为源库,一个oracle 19c的环境作为目标库:
查询用户和状态:
set lines 200
set pages 99
col username for a30;
select username,account_status from dba_users order by account_status;
在源库创建实验用户
create user AAA identified by 123456 default tablespace USERS temporary tablespace temp;
create user BBB identified by 123456 default tablespace USERS temporary tablespace temp;
create user CCC identified by 123456 default tablespace USERS temporary tablespace temp;
给用户授权:
grant create session to AAA;
grant create table to AAA;
grant connect,resource to AAA;
grant create session to BBB;
grant create table to BBB;
grant connect,resource to BBB;
grant create session to CCC;
grant create table to CCC;
grant connect,resource to CCC;
在实验用户下创建实验数据
conn AAA/123456
create table a_t1 (id varchar2(50) primary key , name char(200) not null);
insert into a_t1 (id,name) values ('1001','aaa');
conn BBB/123456
create table b_t1 (name varchar2(50) primary key , age number not null);
insert into b_t1 (name, age) values ('bbb',11);
conn CCC/123456
create table c_t1 (name varchar2(50) primary key , pet char(200) not null);
insert into c_t1 (name,pet) values ('cheer','cat');
查询scn
select to_char(dbms_flashback.get_system_change_number) scn_number from dual;
查询目录
select * from dba_directories;
创建目录
create directory EXPDATA as '/u01/app/expdata'
源库计划用sys用户进行导出,所以就省略授权步骤
目标库准备:
create directory IMPDATA as '/u01/app/impdata'
将目录授权给导入用户
grant read,write on directory IMPDATA to C##ENMO;
目标库使用已经存在的PDB1
给PDB1创建tns:
PDB1 =
(DESCRIPTION =
(ADDRESS_LIST =
(ADDRESS = (PROTOCOL = TCP)(HOST = 192.168.182.141)(PORT = 1521))
)
(CONNECT_DATA =
(SERVICE_NAME = PDB1)
)
)
创建expdp导出配置文件:
vi expdp_202111091542.par
写入:
userid="system/123456@orcl"
directory=EXPDATA
schemas=AAA,BBB,CCC
dumpfile=expdp_202111091542.dmp
logfile=expdp_202111091542.log
flashback_scn=1824331
parallel=1
cluster=n
version=11.2
导出命令
expdp parfile=expdp_202111091542.par
使用scp 将dmp文件传输到目标库上:
scp expdp_202111091542.dmp root@192.168.182.141:/u01/app/impdata
测试导入用户连接是否正常
sqlplus C##ENMO/123456@PDB1
在目标库创建impdp导入配置文件
vi impdp_202111091605.par
写入以下内容
userid="C##ENMO/123456@PDB1"
directory=IMPDATA
EXCLUDE=SCHEMA:"='AAA'"
REMAP_SCHEMA=CCC:FFF
REMAP_TABLE=CCC.C_T1:F_T1
dumpfile=expdp_202111091542.dmp
logfile=impdp_202111091605.log
parallel=1
cluster=n
impdp 导入命令
impdp parfile=impdp_202111091605.par
使用参数解释
如果全部导入,并且将旧库schema CCC下的所有对象放在新库schema FFF下面,只用配置:
REMAP_SCHEMA=CCC:FFF
如果需要排除某SCHEMA,并且更改schema:
REMAP_SCHEMA=CCC:FFF
EXCLUDE=SCHEMA:"='AAA'"
更改schema,并且同时更改table_name,注意这里两个参数都需要填:
REMAP_SCHEMA=CCC:FFF
REMAP_TABLE=CCC.C_T1:F_T1
注意:
如果同时配置SCHEMA参数和REMAP_SCHEMA,必须在SCHEMA中包含需要重映射的sechma,例如:
SCHEMAS=AAA,BBB,CCC
REMAP_SCHEMA=CCC:FFF
这样才能正确导入。
如果在SCHEMAS中省略重映射的CCC,例如:
SCHEMAS=AAA,BBB
REMAP_SCHEMA=CCC:FFF
这种情况下只会导入AAA,BBB.REMAP_SCHEMA参数不会生效,可以理解为CCC根本就没导入,所以就不存在重映射的操作。
官方还提供了其他重映射的参数,具体参考oracle官方文档:
https://docs.oracle.com/en/database/oracle/oracle-database/19/sutil/datapump-import-utility.html#GUID-BA74D4F6-2840-4002-A673-0A7D9CBB3D78