CDB与PDB是Oracle 12C引入的新特性,在ORACLE 12C数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为ContainerDatabase,中文翻译为数据库容器,PDB全称为Pluggable Database,即可插拔数据库。在ORACLE 12C之前,实例与数据库是一对一或多对一关系(RAC):即一个实例只能与一个数据库相关联,数据库可以被多个实例所加载。而实例与数据库不可能是一对多的关系。当进入ORACLE 12C后,实例与数据库可以是一对多的关系。下面是官方文档关于CDB与PDB的关系图。
一个CDB数据库容器包含了下面一些组件:
ROOT组件
ROOT又叫CDB$ROOT,存储着ORACLE提供的元数据和Common User,元数据的一个例子是ORACLE提供的PL/SQL包的源代码,Common User 是指在每个容器中都存在的用户。
SEED组件
Seed又叫PDB$SEED,这个是你创建PDBS数据库的模板,你不能在Seed中添加或修改一个对象。一个CDB中有且只能有一个Seed.这个感念,个人感觉非常类似SQL SERVER中的model数据库。
PDBS
CDB中可以有一个或多个PDBS,PDBS向后兼容,可以像以前在数据库中那样操作PDBS,这里指大多数常规操作。
这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个PDB是一个容器。每个容器在CDB中都有一个独一无二的的ID和名称
1.1概念
ORACLE多租户环境包括一个容器数据库CDB和一个或多个可插入数据库PDB。CDB是一组表空间,对外显示为一个逻辑数据库。CDB创建后,将至少包括两个容器。根容器CDB$ROOT是环境容器。一般来说,只有DBA会连根容器。种子容器PDB$SPEED是一个已提供的只读容器,可以复制,可以创建可插入容器(名字随意)。
要点
A.有一个数据库CDB
B.有一个数据库实例,一个系统全局区(SGA)和一组后台进程
C.PDB只是一组表空间和一个服务
D.PDB服务通过数据库侦听器提供给用户
E.链接到一个PDB服务时,会话范围仅限于与PDB相关联的表空间
F.根容器定义的对象可以有所以PDB共享、访问
G.PDB中定义的对象(包括用户)PDB私有
H.每个PDB都有自己的数据字典,定义其本地对象,其指针指向在根容器的数据字典中定义的共享对象
特别注意
所有容器必须使用相同的字符集
补丁应用与根容器
非CDB视图
USER_
ALL_
DBA
CDB视图多一个
CDB
非CDB每个数据库实例都有自己的SGA 后台进程和数据库字典
一个CDB只有一组后台进程、一个SGA(通常远小于各个SGA的总和),许多数据库字典的一个副本,一个ORACLE HOME 节约了资源
1.2CBD和根容器
CDB是数据库,由实例安装和打开
根容器是管理共享资源的容器,其主要组件如下
控制文件
undo表空间
redo
实例SGA和后台进程
数据字典
公共用户和角色
根容器至少四个表空间
system、undo、sysaux、temp,它还有传播到所有PDB的公共用户和角色,并拥有ORACLE提供的、每个PDB都需要的所有对象。
根容器是唯一一个不通过侦听连接的容器
C:\Users\Administrator>set ORACLE_SID=orclpdb
C:\Users\Administrator>sqlplus / as sysdba
SQL*Plus: Release 12.2.0.1.0 Production on 星期四 12月 14 10:03:02 2017
Copyright (c) 1982, 2016, Oracle. All rights reserved.
连接到:
Oracle Database 12c Enterprise Edition Release 12.2.0.1.0 - 64bit Production
SQL> show con_name
CON_NAME
CDB$ROOT
SQL> alter session set container=orclpdb
2 ;
会话已更改。
SQL> show con_name;
CON_NAME
------------------------------ ORCLPDB
2.PDB可插入容器
C:\Users\Administrator>sqlplus pdb2/pdb2@pdb2 as sysdba
SQL> set line 100
SQL> select 'instance: '||instance_name from v$instance
2 union all select 'database: '||name from v$database
3 union all select 'container: '||global_name from global_name;
'INSTANCE:'||INSTANCE_NAME
instance: orcl
database: ORCL
container: PDB2
SQL> conn system/xxxxxxx@orclpdb
已连接。
SQL> select 'instance: '||instance_name from v$instance
2 union all select 'database: '||name from v$database
3 union all select 'container: '||global_name from global_name;
'INSTANCE:'||INSTANCE_NAME
instance: orcl
database: ORCL container: ORCLPDB
SQL> alter session set container=cdb$root
2 ;
会话已更改。
SQL> set line 100 SQL> col name format A20 SQL> select con_id,name from v$containers;
CON_ID NAME
1 CDB$ROOT
2 PDB$SEED
3 ORCLPDB
4 PDB2
3.1.可插入数据库的配置
4种技术
A.创建一个新的PDB
B.丛非CDB创建一个PDB
C.克隆一个新的PDB
D.插入一个拔出的PDB
3.2容器间通讯
SQL> show user;
USER 为 "SYSTEM"
SQL> show con_name;
CON_NAME
------------------------------ CDB$ROOT
SQL> select * from dual;
DU
X
SQL> select con_id,name,dummy from containers(sys.dual) natural join v$containers;
CON_ID NAME DU
1 CDB$ROOT X
3 ORCLPDB X
4 PDB2 X