Oracle学习笔记之Oracle19c中的CDB与PDB

Oracle 12C引入了新特性多租用户环境(Multitenant Environment),它允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB全称为Container Database,即容器数据库,PDB全称为Pluggable Database,即可插拔数据库。在Oracle 12C之前,实例与数据库是一对一或多对一关系(RAC),而不能实现一对多的关系。在Oracle 12C中,基于多租用户环境这一新特性,实现了实例与数据库的一对多关系。 下图是官方文档给出的CDB与PDB的关系图。
Oracle学习笔记之Oracle19c中的CDB与PDB

1.CDB组件

Contenter Database,即容器数据库,CDB由以下3部分组成:
1.Root,即CDB$ROOT,存储数据库系统元数据和公共用户。原则上Oracle不建议去修改CDB$ROOT中的任何数据,也不建议在CDB$ROOT下创建业务数据,一个CDB有且只有一个root。
2.CDB seed,即PDB$SEED,它是一个PDB模板,PDB都是基于此模板创建的,用户无法增加或修改CDB seed的任何对象,一个CDB有且只有一个CDB seed。
3.PDBs,每个PDB都是单独的,从用户和应用角度来看,PDB就像是和非CDB数据库一样,可以看作成一个单独的数据库,所有的PDB都属于CDB$ROOT,一个CDB可以有多个PDB。
可以通过视图V$CONTAINERS来查询CDB中的所有容器。
SELECT NAME, CON_ID, DBID, CON_UID, GUID FROM V$CONTAINERS ORDER BY CON_ID;
Oracle学习笔记之Oracle19c中的CDB与PDB
CON_ID:来表示容器的ID,但是当PDB移动时,CON_ID会发生变化,CON_ID为0的是CDB本身,1为CDB$ROOT,2为PDB$SEED,>2的为用户PDB。
CON_UID:PDB的唯一标识符,当PDB移动时候,该号码也不会变动,CDB$ROOT的CON_UID为1。
DBID:基于数据库兼容性的考虑,每个容易还有一个DBID,CDB的DBID就是CDB$ROOT,PDB的DBID就是CON_UID。
GUID:一个包含16字节的RAW值,他在PDB创建的时候生成,并且永远不会改变,当使用OMF的时候,GUID被用于目录结构,并且作为PDB的唯一标识符。

2. PDB

Pluggable Database,即可插拔数据库,可以实现从一个CDB拔出,插入到另一个CDB中。PDB有多种类型,包括:Standard PDB(标准PDB),Seed PDB(PDB$SEED)和Proxy PDB(代理PDB)。

2.1. Standard PDB

标准PDB是只通过CREATE PLUGGABLE DATABASE语句创建的PDB,它的作用在不同容器下是不同的。
1.在CDB$ROOT下创建的PDB,这种PDB属于CDB$ROOT而不属于Application容器,也就是无法使用Application容器下的公共对象。
2.在Application容器下创建的PDB,Application容器是Oracle 12C R2推出的新特性,可以理解为Application容器是一个区域,在这个区域下,可以创建多个PDB,Application Root则共享公共对象给所有的Application PDB,而CDB$ROOT的公共对象则不共享,也就是说Application PDB仅能够使用Application Root下的公共对象。
Oracle学习笔记之Oracle19c中的CDB与PDB

2.2. Application Root

Application容器有且只有一个Application Root,Application Root在创建后是无法改变的,它唯一所属的容器是CDB Root。Application Root既有CDB的特点又有PDB的特点。
1.在功能上和CDB Root类似,Application Root是所有在其容器下的PDB的父亲,可以去管理公共用户、公共权限和创建Application PDB,甚至执行应用于所有容器内的PDB的DDL语句。
2.和PDB类似,通过CREATE PLUGGABLE DATABASE语句去创建,通过ALTER PLUGGABLE DATABASE去修改,通过DDL语句去插拔和删除。
Application root区别于CDB root和Standard PDB的一点在于,用户可以在其中创建公共对象,这些对象叫做application common objects。Application common objects只可以被该Application容器内的PDB共享,也就是说CDB root,其他application root和不属于该容器的PDB是无法使用这些公共对象的。

2.3. Seed PDBs

和standard PDB不同,seed PDB不用于支持业务,而是被当作一个模板,用来创建PDB。通过CREATE PLUGGABLE DATABASE ... AS SEED来创建,Seed PDB有2种类型:
1.CDB root中的seed pdb(PDB$SEED),无论在CDB root中或者Application root中,都可以使用seed pdb这个模板来创建PDB,需要注意的是,用户无法增加删除修改PDB$SEED中的任何对象。
2.Application root中的seed pdb,该PDB的作用是加快在Application容器中创建PDB的速度,Application容器中可以容纳0个或多个application seed,在点上和CDB root不同,CDB root中的seed pdb只能有一个。

2.4. Proxy PDBs

代理PDB,实现的是像访问本地CDB root中的pdb一样去访问远程的PDB,简单的说类似DBLINK。

上一篇:MonoRail学习笔记十六:AJax在MonoRail中的使用


下一篇:Mellanox亚太及中国区市场开发高级总监刘通 —— 未来3年内25G将成数据中心主流网络