Oracle 12c系列(7)| Non-CDB转换为PDB
当我们需要将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,详细过程如下:
原数据库:
sys. orcl>select * from v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
PL/SQL Release 12.2.0.1.0 - Production 0
CORE 12.2.0.1.0 Production 0
TNS for Linux: Version 12.2.0.1.0 - Production 0
NLSRTL Version 12.2.0.1.0 - Production 0
Elapsed: 00:00:00.00
sys. orcl>select name, dbid, cdb from v$database;
NAME DBID CDB
------------------------------ ---------- ---
ORCL 1503851221 NO
Elapsed: 00:00:00.01
sys. orcl>
目标数据库:
sys. ora12c>select * from v$version;
BANNER CON_ID
-------------------------------------------------------------------------------- ----------
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production 0
PL/SQL Release 12.2.0.1.0 - Production 0
CORE 12.2.0.1.0 Production 0
TNS for Linux: Version 12.2.0.1.0 - Production 0
NLSRTL Version 12.2.0.1.0 - Production 0
Elapsed: 00:00:00.01
sys. ora12c>select name, dbid, cdb from v$database;
NAME DBID CDB
------------------------------ ---------- ---
ORA12C 345654762 YES
Elapsed: 00:00:00.01
sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 QDATAPDB MOUNTED
sys. ora12c>
1.将Non-CDB:orcl置于只读模式。
03:09:33 sys. orcl>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
03:09:57 sys. orcl>startup mount
ORACLE instance started.
Total System Global Area 947912704 bytes
Fixed Size 8627488 bytes
Variable Size 348130016 bytes
Database Buffers 587202560 bytes
Redo Buffers 3952640 bytes
Database mounted.
03:10:08 sys. orcl>alter database open read only;
Database altered.
Elapsed: 00:00:00.90
03:12:58 sys. orcl>
2.连接到Non-CDB并使用存储过程dbms_pdb.describe来创建描述Non-CDB的XML文件。
sys. orcl>exec dbms_pdb.describe(pdb_descr_file=>'/home/oracle/tmp/orcl.xml');
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.47
sys. orcl>
3.使用dbms_pdb.check_plug_compatibility检查Non-CDB与目标CDB是否兼容:
#pdb_name:指定CDB中新的PDB的名字。
set serverout on
declare
compatible constant varchar2(3) := case
dbms_pdb.check_plug_compatibility(
pdb_descr_file => '/home/oracle/tmp/orcl.xml',
pdb_name => 'orclpdb')
when true then 'yes' else 'no' end;
begin
dbms_output.put_line(compatible);
end;
/
03:14:53 sys. ora12c>set serverout on
03:15:02 sys. ora12c>declare
03:15:03 2 compatible constant varchar2(3) := case
03:15:03 3 dbms_pdb.check_plug_compatibility(
03:15:03 4 pdb_descr_file => '/home/oracle/tmp/orcl.xml',
03:15:03 5 pdb_name => 'orclpdb')
03:15:03 6 when true then 'yes' else 'no' end;
03:15:03 7 begin
03:15:03 8 dbms_output.put_line(compatible);
03:15:03 9 end;
03:15:03 10 /
yes
PL/SQL procedure successfully completed.
Elapsed: 00:00:00.05
03:15:03 sys. ora12c>
4.关闭源库Non-CDB:orcl
03:15:40 sys. orcl>shutdown immediate
Database closed.
Database dismounted.
ORACLE instance shut down.
03:15:59 sys. orcl>
5.将Non-CDB:orcl插入到CDB:ora12c中,且命名为orclpdb。
03:16:29 sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 QDATAPDB MOUNTED
sys. ora12c>create pluggable database orclpdb using '/home/oracle/tmp/orcl.xml' nocopy tempfile reuse;
Pluggable database created.
Elapsed: 00:00:01.36
03:19:16 sys. ora12c>
03:19:33 sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 QDATAPDB MOUNTED
5 ORCLPDB MOUNTED
03:20:09 sys. ora12c>select pdb_id, pdb_name, dbid, status, con_id from cdb_pdbs;
PDB_ID PDB_NAME DBID STATUS CON_ID
---------- -------------------- ---------- ---------- ----------
2 PDB$SEED 1587318379 NORMAL 2
4 QDATAPDB 2726866135 NORMAL 4
5 ORCLPDB 1503851221 NEW 5
Elapsed: 00:00:00.00
03:20:10 sys. ora12c>
6.执行
$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql脚本,这个脚本需要在打开新的PDB:orclpdb之前执行。
03:21:28 sys. ora12c>alter session set container=orclpdb;
Session altered.
Elapsed: 00:00:00.00
03:21:36 sys. ora12c>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql
…
…
7.以读写模式打开新PDB
03:50:20 sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 QDATAPDB MOUNTED
5 ORCLPDB MOUNTED
03:50:21 sys. ora12c>alter pluggable database orclpdb open;
Pluggable database altered.
Elapsed: 00:00:11.04
03:51:48 sys. ora12c>show pdbs
CON_ID CON_NAME OPEN MODE RESTRICTED
---------- ------------------------------ ---------- ----------
2 PDB$SEED READ ONLY NO
4 QDATAPDB MOUNTED
5 ORCLPDB READ WRITE NO
03:55:17 sys. ora12c>alter session set container=orclpdb;
Session altered.
Elapsed: 00:00:00.03
03:55:24 sys. ora12c>create table t as select * from dba_objects;
Table created.
Elapsed: 00:00:01.89
03:55:34 sys. ora12c>
Non-CDB:ORCL成功转换为容器数据库ORA12C中的PDB,且转换过程中未经过数据copy的过程。
| 作者简介
杨禹航·沃趣科技高级数据库技术专家
熟悉Oracle数据库内部机制,丰富的数据库及RAC集群层故障诊断、性能调优、OWI、数据库备份恢复及迁移经验。
- .NET Core的日志[1]:采用统一的模式记录日志
- ASP.NET MVC三个重要的描述对象:ParameterDescriptor
- Ngxtop-Nginx日志实时分析利器
- 数据在内存中的存储
- 数据抓取与利用行为的不正当竞争法规制
- python学习手册-爬爬那些年咱没见过的校花图片
- 正则表达式游戏的答案
- .NET Core的日志[2]:将日志输出到控制台
- 2017年高等教育十大战略性技术(二)
- 通过实例模拟ASP.NET MVC的Model绑定机制:数组
- 《全球贸易信息动态》
- .NET Core的日志[3]:将日志写入Debug窗口
- Code2Cloud:比ALM中断更大
- .NET Core的日志[4]:将日志写入EventLog
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 【译文】Facebook工程师谈运维工作的未来
- 【一天一大 lee】环形链表II (难度:中等) - Day20201010
- 【西法带你学算法】一次搞定前缀和
- 一文快速入门分库分表中间件 Sharding-JDBC (必修课)
- 求求你别再用System.out.println 了!!
- 为什么阿里巴巴Java开发手册中强制要求超大整数禁止使用Long类型返回?
- 独家 | 教你用Python来计算偏差-方差权衡
- 使用 KinD 加速 CI/CD 流水线
- 使用 Docker 加速开发工作流
- Kubernetes CRD 自定义控制器
- 推荐算法之: LFM 推荐算法
- 推荐算法之: DeepFM及使用DeepCTR测试
- Cypress系列(61)- 断言最佳实践
- Cypress系列(62)- 改造 PageObject 模式
- CPU 执行程序的秘密,藏在了这 15 张图里