继11g后12C中,Oracle 由原本 Single 实例进行多路演化,推出 CDB 架构,单个CDB容器在没有授权liscense的且个人使用的情况下,可支持多个PDB。也可将原non-CDB架构的库转换成CDB下的一个PDB。本文侧重讲解 NON-CDB 如何转换到 CDB 架构中。
-
资源整合与共享
共享资源:CDB 中的多个 PDB 共享相同的后台进程、内存和存储资源(如 UNDO 表空间、REDO 日志等),从而减少资源浪费。
资源隔离:通过资源管理器(Resource Manager),可以为每个 PDB 分配独立的资源配额(如 CPU、内存、I/O),确保关键业务不受其他 PDB 的影响。
-
简化管理与运维
集中管理:管理员可以在 CDB 级别统一管理多个 PDB,而不需要为每个数据库单独配置和维护。统一备份与恢复:CDB 支持对整个容器数据库进行备份和恢复,简化了操作流程。
快速部署:通过 PDB 的克隆、复制和迁移功能,可以快速创建新的数据库实例,显著缩短部署时间。
-
高可用性与灵活性
快速迁移:PDB 可以在不同的 CDB 之间快速迁移,支持跨平台、跨版本的数据迁移。高可用性:CDB 支持 Oracle Data Guard 和 Oracle RAC,确保 PDB 的高可用性和容灾能力。
快速升级:可以在 CDB 级别统一升级数据库版本,而不需要逐个升级 PDB。
-
简化补丁和升级
统一补丁管理:在 CDB 级别应用补丁,所有 PDB 都会自动继承这些补丁,减少了逐个数据库打补丁的工作量。版本一致性:CDB 和 PDB 的版本保持一致,避免了多版本数据库管理的复杂性。
1、源库及目标库必须是12C及以上的版本
2、源库实现转换后,除数据文件所处的路径及文件夹以外,源库相关文件均可删除
3、当前转换并不需要移动数据文件,提高转换效率
1、前提条件
源库必须是12C的数据库,且目标环境必须是CDB架构。否则无法进行转换。
select * from v$version;
2、源库开启只读模式
SQL>shutdown immediate
SQL>startup mount
SQL>alter database open read only;
3、源库创建XML
SQL>exec dbms_pdb.describe(pdb_descr_file=>'/u01/ORCLPDB.xml');
4、目标库检查是否兼容源库
set serverout on
declare
compatible constant varchar2(3) := case
dbms_pdb.check_plug_compatibility(
pdb_descr_file => '/u01/ORCLPDB.xml',
pdb_name => 'testpdb')
when true then 'yes' else 'no' end;
begin
dbms_output.put_line(compatible);
end;
/
5、关闭源库
SQL>shutdown immediate
6、目标库创建PDB
注意:此处需要使用源库创建的XML新建
create pluggable database ORCLPDB using '/u01/ORCLPDB.xml' nocopy tempfile reuse;
7、转换架构
注意:此处需要进入到新建的PDB下进行转换
SQL>alter session set container=ORCLPDB;
SQL>@$ORACLE_HOME/rdbms/admin/noncdb_to_pdb.sql; -- 此处需要等待半小时左右,具体时长根据库大小而定。
8、打开新的PDB即可
SQL>alter pluggable database ORCLPDB open;
9、监听文件中追加新的PDB服务
# tnsname.ora 文件:文件中将需要对外暴露的库信息进行书写。按照当前对应的格式编辑即可
LISTENER_CDB =
(ADDRESS = (PROTOCOL = TCP)(HOST = testcdb.localdomain.com)(PORT = 1521))
CDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = testcdb.localdomain.com)(PORT = 1521))
(CONNECT_DATA =
(SERVER = DEDICATED)
(SERVICE_NAME = cdb)
)
)
PDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = testcdb.localdomain.com)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = PDB)
(INSTANCE_NAME = CDB)
)
)
ORCLPDB =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = testcdb.localdomain.com)(PORT = 1521))
(CONNECT_DATA =
(SERVICE_NAME = ORCLPDB)
(INSTANCE_NAME = CDB)
)
)
# 注意:listener.ora文件:其中注册对应的PDB库信息并标明PDB所对应的容器是哪个即可。
CDB =
(DESCRIPTION_LIST =
(DESCRIPTION =
(ADDRESS = (PROTOCOL = TCP)(HOST = testcdb.localdomain.com)(PORT = 1521))
(ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
)
)
SID_LIST_TEST =
(SID_LIST =
(SID_DESC =
(ORACLE_HOME=/u01/db/CDBOH/cdb)
(SID_NAME = CDB)
)
(SID_DESC =
(GLOBAL_DBNAME = PDB)
(SID_NAME = CDB)
)
(SID_DESC =
(GLOBAL_DBNAME = ORCLPDB)
(SID_NAME = CDB)
)
)
10、重新启动监听并连接新的PDB即可
$ lsnrctl reload




