ITPub博客

Oracle 12c系列(七)| Non-CDB转换为PDB

原创 Oracle 作者:沃趣科技 时间:2018-05-16 16:28:35 0 删除 编辑


当我们需要将Non-CDB数据库类型更改为PDB数据库类型时,可以使用Cloning的方式将其复制到现有的CDB中,但是该方法需要将Non-CDB中的数据文件复制到新的目录中,除了Cloning的方式外我们还可以使用DBMS_PDB包来生成Non-CDB数据库的XML元数据文件,该XML元数据文件中描述了Non-CDB中的数据文件信息,可以使用XML文件将Non-CDB数据库附加为CDB中的PDB,通过该方式将Non-CDB数据库转换成CDB中的PDB,它的优点在于省去了复制Non-CDB数据文件的过程,但要求Non-CDB必须为12.1.0之上的版本,如果Non-CDB为12c之前的版本,需要将其升级到12c,另外需要我们提前创建一个CDB容器数据库,或者现有环境中已存在CDB容器数据库(将Non-CDB插入已存在的CDB中)。

使用DBMS_PDB将Non-CDB转换为PDB的流程如下:

1. 确保Non-CDB处于只读状态。

2. 使用DBMS_PDB.DESCRIBE创建描述Non-CDB的XML元数据文件。

3. 使用DBMS_PDB.CHECK_PLUG_COMPATIBILITY检查Non-CDB与目标CDB是否兼容。

4. 关闭源Non-CDB。

5. 使用描述Non-CDB的XML文件将Non-CDB插入CDB中。

6. 执行$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql

7. 以读写模式打开新的PDB。

如下示例将Non-CDB:orcl转换成CDB:ora12c中的pdb:orclpdb,详细过程如下:

原数据库:

点击(此处)折叠或打开

  1. sys. orcl>select * from v$version;
  2. BANNER CON_ID
  3. -------------------------------------------------------------------------------- ----------
  4. Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
  5. PL/SQL Release 12.2.0.1.0 - Production 0
  6. CORE 12.2.0.1.0 Production 0
  7. TNS for Linux: Version 12.2.0.1.0 - Production 0
  8. NLSRTL Version 12.2.0.1.0 - Production 0
  9. Elapsed: 00:00:00.00
  10. sys. orcl>select name, dbid, cdb from v$database;
  11. NAME DBID CDB
  12. ------------------------------ ---------- ---
  13. ORCL 1503851221 NO
  14. Elapsed: 00:00:00.01
  15. sys. orcl>

目标数据库:

点击(此处)折叠或打开

  1. sys. ora12c>select * from v$version;
  2. BANNER CON_ID
  3. -------------------------------------------------------------------------------- ----------
  4. Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
  5. PL/SQL Release 12.2.0.1.0 - Production 0
  6. CORE 12.2.0.1.0 Production 0
  7. TNS for Linux: Version 12.2.0.1.0 - Production 0
  8. NLSRTL Version 12.2.0.1.0 - Production 0
  9. Elapsed: 00:00:00.01
  10. sys. ora12c>select name, dbid, cdb from v$database;
  11. NAME DBID CDB
  12. ------------------------------ ---------- ---
  13. ORA12C 345654762 YES
  14. Elapsed: 00:00:00.01
  15. sys. ora12c>show pdbs
  16. CON_ID CON_NAME OPEN MODE RESTRICTED
  17. ---------- ------------------------------ ---------- ----------
  18.      2 PDB$SEED READ ONLY NO
  19.      4 QDATAPDB MOUNTED
  20. sys. ora12c>

1.将Non-CDB:orcl置于只读模式。

点击(此处)折叠或打开

  1. 03:09:33 sys. orcl>shutdown immediate
  2. Database closed.
  3. Database dismounted.
  4. ORACLE instance shut down.
  5. 03:09:57 sys. orcl>startup mount
  6. ORACLE instance started.
  7. Total System Global Area 947912704 bytes
  8. Fixed Size 8627488 bytes
  9. Variable Size 348130016 bytes
  10. Database Buffers 587202560 bytes
  11. Redo Buffers 3952640 bytes
  12. Database mounted.
  13. 03:10:08 sys. orcl>alter database open read only;
  14. Database altered.
  15. Elapsed: 00:00:00.90
  16. 03:12:58 sys. orcl>

2.连接到Non-CDB并使用存储过程dbms_pdb.describe来创建描述Non-CDB的XML文件。 

点击(此处)折叠或打开

  1. sys. orcl>exec dbms_pdb.describe(pdb_descr_file=>'/home/oracle/tmp/orcl.xml');
  2. PL/SQL procedure successfully completed.
  3. Elapsed: 00:00:00.47
  4. sys. orcl>

3.使用dbms_pdb.check_plug_compatibility检查Non-CDB与目标CDB是否兼容:

#pdb_name:指定CDB中新的PDB的名字。


点击(此处)折叠或打开

  1. set serverout on
  2. declare
  3. compatible constant varchar2(3) := case
  4.    dbms_pdb.check_plug_compatibility(
  5.     pdb_descr_file => '/home/oracle/tmp/orcl.xml',
  6.     pdb_name => 'orclpdb')
  7.     when true then 'yes' else 'no' end;
  8. begin
  9. dbms_output.put_line(compatible);
  10. end;
  11. /

点击(此处)折叠或打开

  1. 03:14:53 sys. ora12c>set serverout on
  2. 03:15:02 sys. ora12c>declare
  3. 03:15:03 2 compatible constant varchar2(3) := case
  4. 03:15:03 3 dbms_pdb.check_plug_compatibility(
  5. 03:15:03 4 pdb_descr_file => '/home/oracle/tmp/orcl.xml',
  6. 03:15:03 5 pdb_name => 'orclpdb')
  7. 03:15:03 6 when true then 'yes' else 'no' end;
  8. 03:15:03 7 begin
  9. 03:15:03 8 dbms_output.put_line(compatible);
  10. 03:15:03 9 end;
  11. 03:15:03 10 /
  12. yes
  13. PL/SQL procedure successfully completed.
  14. Elapsed: 00:00:00.05
  15. 03:15:03 sys. ora12c>

4.关闭源库Non-CDB:orcl

点击(此处)折叠或打开

  1. 03:15:40 sys. orcl>shutdown immediate
  2. Database closed.
  3. Database dismounted.
  4. ORACLE instance shut down.
  5. 03:15:59 sys. orcl>

5.将Non-CDB:orcl插入到CDB:ora12c中,且命名为orclpdb。

点击(此处)折叠或打开

  1. 03:16:29 sys. ora12c>show pdbs
  2. CON_ID CON_NAME OPEN MODE RESTRICTED
  3. ---------- ------------------------------ ---------- ----------
  4.      2 PDB$SEED READ ONLY NO
  5.      4 QDATAPDB MOUNTED
  6. sys. ora12c>create pluggable database orclpdb using '/home/oracle/tmp/orcl.xml' nocopy tempfile reuse;
  7. Pluggable database created.
  8. Elapsed: 00:00:01.36
  9. 03:19:16 sys. ora12c>
  10. 03:19:33 sys. ora12c>show pdbs
  11. CON_ID CON_NAME OPEN MODE RESTRICTED
  12. ---------- ------------------------------ ---------- ----------
  13.      2 PDB$SEED READ ONLY NO
  14.      4 QDATAPDB MOUNTED
  15.      5 ORCLPDB MOUNTED
  16. 03:20:09 sys. ora12c>select pdb_id, pdb_name, dbid, status, con_id from cdb_pdbs;
  17. PDB_ID PDB_NAME DBID STATUS CON_ID
  18. ---------- -------------------- ---------- ---------- ----------
  19.      2 PDB$SEED 1587318379 NORMAL 2
  20.      4 QDATAPDB 2726866135 NORMAL 4
  21.      5 ORCLPDB 1503851221 NEW 5
  22. Elapsed: 00:00:00.00
  23. 03:20:10 sys. ora12c>


6.执行

$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql脚本,这个脚本需要在打开新的PDB:orclpdb之前执行。

点击(此处)折叠或打开

  1. 03:21:28 sys. ora12c>alter session set container=orclpdb;
  2. Session altered.
  3. Elapsed: 00:00:00.00
  4. 03:21:36 sys. ora12c>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql


7.以读写模式打开新PDB

点击(此处)折叠或打开

  1. 03:50:20 sys. ora12c>show pdbs
  2. CON_ID CON_NAME OPEN MODE RESTRICTED
  3. ---------- ------------------------------ ---------- ----------
  4.      2 PDB$SEED READ ONLY NO
  5.      4 QDATAPDB MOUNTED
  6.      5 ORCLPDB MOUNTED
  7. 03:50:21 sys. ora12c>alter pluggable database orclpdb open;
  8. Pluggable database altered.
  9. Elapsed: 00:00:11.04
  10. 03:51:48 sys. ora12c>show pdbs
  11. CON_ID CON_NAME OPEN MODE RESTRICTED
  12. ---------- ------------------------------ ---------- ----------
  13.      2 PDB$SEED READ ONLY NO
  14.      4 QDATAPDB MOUNTED
  15.      5 ORCLPDB READ WRITE NO
  16. 03:55:17 sys. ora12c>alter session set container=orclpdb;
  17. Session altered.
  18. Elapsed: 00:00:00.03
  19. 03:55:24 sys. ora12c>create table t as select * from dba_objects;
  20. Table created.
  21. Elapsed: 00:00:01.89
  22. 03:55:34 sys. ora12c>

Non-CDB:ORCL成功转换为容器数据库ORA12C中的PDB,且转换过程中未经过数据copy的过程。


| 作者简介

杨禹航·沃趣科技高级数据库技术专家

熟悉Oracle数据库内部机制,丰富的数据库及RAC集群层故障诊断、性能调优、OWI、数据库备份恢复及迁移经验。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/28218939/viewspace-2154574/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论
杭州沃趣科技股份有限公司创建于2012年(股票代码:839849),是一家专注为企业用户提供基于高性能、高可用、可扩展的开放数据库云平台解决方案的国产厂商。公司创始团队为原阿里巴巴数据库技术团队核心骨干,凭借丰富的研发及运维经验,为行业客户提供数据库云产品及软硬件一体化解决方案。

注册时间:2016-07-18

  • 博文量
    156
  • 访问量
    601656