Oracle 12C 引入了 CDB 与 PDB 的新特性,在 ORACLE 12C 数据库引入的多租用户环境(Multitenant Environment)中,允许一个数据库容器(CDB)承载多个可插拔数据库(PDB)。CDB 全称为 Container Database,中文翻译为数据库容器,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。
PDBS
CDB 中可以有一个或多个 PDBS,PDBS 向后兼容,可以像以前在数据库中那样操作 PDBS,这里指大多数常规操作。
这些组件中的每一个都可以被称为一个容器。因此,ROOT(根)是一个容器,Seed(种子)是一个容器,每个 PDB 是一个容器。每个容器在 CDB 中都有一个独一无二的的 ID和名称。
注意:
一个 CDB 可以包含 253 个 PDB(去掉一个是 seed 还能创建 252 个 PDB)。
文件
数据文件:ROOT,SEED 以及每一个 PDB 的数据文件是独立的。
REDO:一个单实例的 CDB 有一个 redo log;RAC 环境中每个实例有一个 redo log。
control file: 一个 CDB 也仅有一个控制文件(可以多路复用)。
参数文件:一个 CDB 使用一个 SPFILE 或者一个 PFILE,其中为 ROOT 设置的参数的值可以被 PDB 继承。另外,也可以使用 ALTER SYSTEM 语句来设置 PDB 的参数。对参数文件执行操作时,必须使用 common user 并且使用 AS SYSDBA、ASSYSOPER、AS SYSBACKUP来连接数据库。要创建 CDB,必须要将初始化参数 ENABLE_PLUGGABLE_DATABASE 的值设置为 TRUE。
进程:只有一组后台进程,它们被 ROOT 和所有 PDB 共享。
数据库设置
字符集:所有 PDB 的字符集都使用 CDB 的字符集。
时区:可以设置所有 PDB 的时区与 CDB 相同,也可以单独为 PDB 设置时区。
db_size:块大小被应用于整个 CDB。
db_name:ROOT 的全局数据库名就是 CDB 的全局数据库名;PDB 的全局数据库名是由 PDB name 和 DB_DOMAIN 参数共同定义的。
表空间:
ROOT 与每一个 PDB 都有自己的 SYSAUX 表空间和 SYSTEM 表空间。可以为 ROOT 和每一个 PDB 设置默认表空间。而默认的临时表空间对于整个 CDB 只有一个,但是可以为每个 PDB 创建临时表空间。
UNDO 表空间对于 CDB 是唯一的。在 CDB 中,初始化参数UNDO_MANAGEMENT 必须被设置为 AUTO。当前容器为 PDB 时,无法通过数据字典视图查看 UNDO 表空间,只能通过动态性能视图。
可以把多个 PDB 集成进一个平台。
可以快速提供一个新的 PDB 或一个已有 PDB 的克隆。
通过拔插技术,可以快速把存在的数据库重新部署到一个新平台上。
多个 PDB 数据库补丁或升级一次完成。
通过把单个 PDB 拔插到较高版本的不同 CDB,可以补丁或升级一个PDB。
从同一个 CDB 中众多 PDB 中分离出某个 PDB 的内容。
分离这些 PDB 应用管理员的责任。
在一个 CDB 中,你可以拥有很多 PDB。
PDB 和 12.1 之前版本的普通数据库是向后兼容的。
PDB 对应用是透明的——你不需要改变客户端代码或数据库对象。
RAC 中每个实例作为一个整体打开 CDB(因此 CDB 和其中的 PDB 数据库版本都是相同的)。
会话仅仅看到它自己连接的那个 PDB。
你可以从一个 CDB 拔出一个 PDB,然后插入另一个 CDB。
你可以在同一个 CDB 或不同 CDB 间克隆 PDB。
资源管理器随着 PDB 的功能得以扩展。
通过 SQL 语句实现了实体 PDB 的操作(创建,拔出,插入,克隆,清除,设置打开模式)。
当连接到所谓的“根”(ROOT)时,CDB 管理员来执行这些操作。
所有的 PDB 能被一次备份,但可以分别单独恢复。
每个 PDB 有自己的私有数据字典用于用户创建的数据库对象;另一方面,CDB 作为一个整体也包含 Oracle 提供系统的数据字典,其中,每个数据字典定义自己的命名空间。换句话说,有全局数据字典(CDB级)和本地数据字典(PDB级)。
有新的分开的数据字典架构,该架构允许一个 PDB 被快速从一个 CDB 拔出并插入一个不同的 CDB。
每个 PDB 只能看到 Oracle 提供系统的只读定义。
有全局数据库参数,也有本地数据库参数。PDB 参数仅仅属于特定的 PDB,并且拔出后,PDB 参数也将保持不变。
数据库用户可以是全局的(CDB)或本地的(PDB)。SYS 和 SYSTEM 用户一开始就在两级 DB 中存在。如果你在 CDB 中创建了一个新用户,那么你在 PDB 中也能看到这个用户。在 PDB 中创建的用户只能在该 PDB 中使用。
临时表空间可以是全局或本地的。
Redo 日志和 Undo 表空间都是全局的(CDB级)。
Data Guard 在 CDB 级作为一个整体发挥作用;RMAN 调度的备份也作为一个整体在 CDB 级完成;任何时候,你可以只备份一个 PDB。
应用连接 PDB 时,不需做代码修改;系统管理员可以连接 CDB;连接串中的服务名确定目标 PDB。
PDB 允许更加清晰的声明定义一个应用;一个 PDB 对同一个 CDB 里的其他 PDB一无所知;每个 PDB 是个密闭的容器。这保证了新层面 DB 的独立和安全。