Oralce 12c中的多租户数据库的启用,使得原来分布于多台服务器或者一台服务器上运行N多实例的情形需要进行整合。那就是将之前的N多非CDB数据库整合到CDB,原来的数据库将作为CDB数据库下一个PDB容器,各个PDB之间也可以通过快速dblink实现交互。常用的方法包括导出导入,DBMS_PDB包方式,以及GoldenGate复制方式等。本文主要描述使用DataPump方式实现迁移。
一、几种常用的迁移方法
如上图所示,通常有3种方式来实现将非CDB迁移到CDB数据库
注:文中所描述的迁移到CDB,指的是非CDB迁移之后将作为目标CDB的一个PDB数据库
1、Datapump/TTS
使用Datapump迁移的场景:
源非CDB数据库使用了与目标数据库不同的字节码(简单说就是跨OS平台)
源非CDB数据库使用了与目标数据库不同的字符集
使用TTS方式迁移
TTS方式与传统的导出导入方式以及可传输数据库多适用于用户定义的对象位于当个表空间情行
2、使用DBMS_PDB包实现
该方式将非CDB数据库构建一个XML文件用于描述其结构然后在目标端读取它实现导入
此种方式最为简单,但是仅仅使用在Oracle 12c版本中
3、使用复制方式,如GoldenGate
该方式能实现Oracle 12c版本之前最小化停机时间 ,但是配置复杂
二、演示使用DataPump迁移非CDB到CDB
演示说明:
1、以下演示将Oracle 11g一个schema soe作为一个pdb导入到Oracle 12c
2、在导入pdb前,做了schema映射(soe到report_usr),如果是正式迁移应创建原账号,导入完成后并将其密码变更为原密码
3、导入完成后应检查所有迁移期间涉及到的对象,如表,视图,存储过程,包,dblink,无效对象等等
--当前环境
SQL> select banner from v$version where rownum<2;
BANNER
--------------------------------------------------------------------------------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
--当前数据库字符集,此书与原数据库字符集是一致的
SQL> select * from nls_database_parameters where parameter like '%CHARACTERSET%';
PARAMETER VALUE
----------------------------------- --------------------
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8
SQL> select 'Leshami' Author,'http://blog.csdn.net/leshami' Blog,
2 '645746311' QQ from dual;
AUTHOR BLOG QQ
------- ---------------------------- ---------
Leshami http://blog.csdn.net/leshami 645746311
--创建可插拔数据库
SQL> create pluggable database reportdb
2 admin user reportdba identified by pass roles=(connect)
3 file_name_convert=('/app/oracle/ora12c/oradata/cdb1/pdbseed',
4 '/app/oracle/ora12c/oradata/cdb1/reportdb');
--将数据库置为open
SQL> alter pluggable database reportdb open;
--连接到刚刚创建的pdb数据库
SQL> conn sys/pass@192.168.1.244:1521/reportdb as sysdba
--为pdb用户授权
SQL> grant dba to reportdba;
--使用pdb账号reportdba连接到pdb
SQL> conn reportdba/pass@192.168.1.244:1521/reportdb
SQL> show user;
USER is "REPORTDBA"
--创建一个用于导入的临时目录
SQL> create directory dump_dir as '/tmp';
--创建表空间
SQL> create tablespace report_tbs datafile
2> '/app/oracle/ora12c/oradata/cdb1/reportdb/report_tbs.dbf' size 500m autoextend on;
--创建一个新schema存放导入源数据schema,如果不使用新用户,则创建源schema
SQL> create user report_usr identified by report_usr default tablespace report_tbs;
--对新schema授权
SQL> grant create session,resource,connect,dba to report_usr;
--下面开始源数据schema导出,如下,连接到Oracle 11g
SQL> conn sys/oracle@ora11g as sysdba
SQL> select * from v$version where rownum=1;
BANNER
--------------------------------------------------------------------------------
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
--SOE下的对象数目
SQL> select count(*) from dba_objects where owner='SOE';
COUNT(*)
----------
47
--导出SOE schema
SQL> ho expdp soe/soe directory=DATA_PUMP_DIR dumpfile=soe.dmp logfile=exp_soe.log schemas=soe
--将其复制到临时位置
$ cp /app/oracle/ora11g/admin/ora11g/dpdump/soe.dmp /tmp
--导入SOE schema,并将其映射到report_usr
$ impdp report_usr/report_usr@192.168.1.244:1521/reportdb directory=dump_dir dumpfile=soe.dmp \
> logfile=imp_soe.log schemas=soe remap_schema=soe:report_usr transform=segment_attributes:n
--连接到目标数据库,验证导入
SQL> conn report_usr/report_usr@192.168.1.244:1521/reportdb
SQL> show con_name;
CON_NAME
------------------------------
REPORTDB
--对像数目比对,其它的对象以及状态也需要比对,此处省略
SQL> select count(*) from user_objects;
COUNT(*)
----------
47