1.5.2 CDB结构
1.Oracle多租户数据库的基本概念
(1)CDB
多租户结构使得Oracle数据库可成为容器数据库(Container DataBase,CDB)。多租户容器数据库是指能够容纳一个或多个插接式数据库的数据库。Oracle 12c中的每个数据库要么是CDB,要么是非CDB(no CDB),即传统的数据库。CDB的结构如图1-6所示。
图1-6 CDB的结构
(2)容器
容器是指CDB中的数据文件和元数据的集合。CDB中的根、种子和PDB均称为容器。CDB中的每个容器有唯一的容器编号(ID)和名称。每个CDB都由一个根容器、一个种子容器和多个(0~N)插接式数据库构成。
(3)根容器
根容器(简称为根)是每个PDB的对象、模式对象和非模式对象的集合。每个CDB只能有一个名字为CDB$ROOT的根容器,在根中存储管理PDB所需的元数据和公用用户。根中不存储用户数据,即不能在根中添加数据或修改根中的系统模式。可以建立管理数据库的公用用户,具有权限的公用用户可在PDB之间切换。
(4)种子容器
每个CDB只能有一个名称为PDB$SEED的种子容器,它是创建PDB的模板。不能修改种子容器中的对象,也不能向种子容器中添加对象。
(5)PDB
插接式数据库(Pluggable DataBases,PDB)由一组可插拔的模式、模式对象和非模式对象组成,包含数据和应用的代码,如支持人力资源或销售应用的PDB。PDB可以通过复制另一个数据库来创建。如果有必要,也可以将PDB从一个CDB传送到另一个CDB。每个CDB都有一个用于创建其他插接式数据库的种子容器。所有PDB都属于某个CDB。
PDB完全兼容Oracle 12c以前的Oracle数据库。可根据应用需求将PDB添加到某个CDB中。PDB与非CDB的兼容性保证了客户程序可以像以前一样通过Oracle Net连接到PDB上。基于CDB上的应用与基于非CBD应用在安装过程和运行后的结果都完全一样。像Oracle数据保护、数据库备份与恢复这样对整个数据库的操作,在整个非CDB上进行的操作也与整个CDB上的一样。
(6)公用用户和本地用户
插接式数据库环境中有公共用户和本地用户。
①公共用户。公共用户(Common User)是在Oracle 12c中引入的新概念,仅存在于多租户数据库环境中。公共用户是指存在于根容器和所有插接式数据库中的用户,即在根和每个PDB中都有同一标识的用户。初始时必须在根容器中创建这种用户,然后它们会在所有现存的插接式数据库和将来创建的插接式数据库中被自动创建。
公共用户可以登录到根和任何有权限的PDB中,然后根据相应的权限完成指定操作。建立PDB或从CDB中拨出PDB必须由公用用户来完成。如果在连接根容器时为公共用户赋予权限,那么该权限不会传递到插接式数据库中。如果需要为公共用户赋予能够传递到插接式数据库的权限,可创建公共角色并将之分配给公共用户。
数据库管理员以公共用户连接到CDB可管理整个CDB和根的属性,也可管理PDB的部分属性。管理员可建立、插接(Plug in)、拨出(Unplug)和删除PDB,也可指定整个CDB的临时表空间和根的默认表空间,也可以改变PDB的打开模式。
公共用户或公用角色的名称必须以C##开头。SYS和SYSTEM用户是Oracle在CDB中自动创建的公用用户。
②本地用户。本地用户(Local User)是指在插接式数据库中创建的普通用户。在插接式数据库中使用本地用户的方法,与在非CDB数据库中使用用户的方法相同。本地用户的管理方法中没有特殊内容。可以使用非CDB数据库中管理用户的方法管理本地用户。
2.CDB的结构
CDB的结构与非CDB数据库的结构不同。图1-6显示一个CDB数据库,它含有一个根容器、一个种子容器和两个插接式数据库(SALEPDB和HRPDB)。
下面将就图1-6中所示的内容进行说明。
(1)图1-6展示了一个非RAC配置,因此,仅有一套内存分配方案和一组后台进程,即仅使用了一个实例。这个CDB中的所有PDB都使用同一个实例和同一组后台进程。
(2)具有权限的用户可连接CDB。连接CDB就是连接CDB$ROOT根容器。可通过SYS用户访问根容器,就像访问非CDB数据库一样。
(3)种子容器(PDB$SEED)只是用于创建插接式数据库的模板。可以连接只读的种子容器,但不能使用它执行任何事务。