多租户架构的其他好处
- 多租户架构确保了向后兼容原则。一个例子是数据字典视图。 DBA_OBJECTS 视图在 PDB 中显示与特定应用程序在非 CDB 中相同的结果。
- 多租户架构旨在与 RAC 完全互操作。 Oracle RAC 中的每个实例都作为一个整体打开 CDB。会话只能看到它连接到的单个 PDB。
- Enterprise Manager 集成了 CDB 并模拟了 CDB 管理员和 PDB 管理员的职责分离。
- CDB 可以定义为目标。可以授予企业管理器用户凭据以在此类目标中充当 CDB 管理员。
- PDB 可以设置为 CDB 目标的子目标。可以为企业管理器用户提供凭据以在此类目标中充当 PDB 管理员。已使用凭据设置为特定 PDB 的 PDB 管理员的 Enterprise Manager 用户能够连接到该 PDB,并且不知道同一 CDB 中是否存在对等 PDB。此外,当打算执行应用程序管理员的职责时,该企业管理器用户不知道环境是 CDB 而不是非 CDB。
- 资源管理器通过新的 PDB 间功能进行了扩展,以允许管理 CDB 内 PDB 之间的资源。向后兼容原则意味着资源管理器在 PDB 中的运行方式必须与在非 CDB 中完全相同。
- 当你用n个PDB升级整个CDB时,你可以用升级一个非CDB的成本达到升级n个非CDB的效果。
多租户架构(Multitenant Architecture):好处
将许多非 CDB 数据库整合到单个平台上可减少实例开销,避免数据字典的冗余副本,从而避免存储分配。
它受益于通过职责分离和应用程序隔离实现的快速配置、省时升级和更好的安全性。
将数据库整合在一起的新多租户数据库是多租户容器数据库或者 CDB 以及整合在 CDB、可插拔数据库或者 PDB 中的数据库。
- 无需更改应用程序且配置非常快:可以快速配置新数据库。可以快速创建已填充数据库的克隆。填充的数据库可以从一个平台上的 CDB 中快速拔出,并快速插入不同平台上的 CDB。非 CDB 可以快速插入 CDB。
- Oracle 数据库版本的快速升级和修补:升级许多 PDB 的成本(所需时间和人力)是升级单个 Oracle 数据库事件的成本。我们还可以通过拔下 PDB 并将其插入不同 Oracle 数据库版本的 CDB 来升级单个 PDB。
- 安全的职责分离:应用程序的管理员可以通过连接到实现其后端的 PDB 来执行所需的任务。但是,连接到 PDB 的用户无法看到其他 PDB。要将 PDB 作为实体进行管理(例如,创建、删除、拔出或者插入一个),系统管理员必须连接到 CDB。连接到 CDB 的用户必须具有特殊权限。
- 应用程序隔离:例如,除非我们使用 Oracle Database Vault,否则可能无法手动完成此任务。隔离的一个很好的例子是字典分离,使 Oracle 数据库能够将多个 PDB 彼此分开并与 CDB 本身分开管理。
工具
有不同的工具可以创建和升级容器数据库。
如下表所示,我们可以使用 SQL*Plus 或者数据库配置助手 (DBCA) 或者在安装 Oracle Database 18c 期间创建新的 CDB 或者新的 PDB。
SQL Developer 和 EM Cloud Control 允许我们创建可插入的数据库。
Task | SQL*Plus | OUI | DBCA | EM Cloud Control | EM Database Express | SQL Developer | DBUA |
---|---|---|---|---|---|---|---|
Create a new CDB or PDB | yes | yes | yes | yes (PDB only) | yes (PDB only) | yes (PDB only) | N/A |
Explore CDB instance, architecture, and PDBs | yes | N/A | N/A | yes | yes | yes | N/A |
Upgrade a 12c CDB to 18c CDB | N/A | N/A | N/A | yes | N/A | N/A | yes |
创建 CDB 后,我们可以使用视图来浏览 CDB 的实例、数据库架构、文件和可插入数据库。
使用 SQL*Plus 直接使用 SELECT 语句查询视图,或者使用企业管理器或者 SQL Developer 等 GUI 工具间接查询视图。
我们可以使用企业管理器或者数据库升级助手 (DBUA) 将 Oracle Database 12c CDB 升级到 Oracle Database 18c CDB。
配置
数据库配置的可能实例是什么?
- 每个数据库实例可以与一个且仅一个非 CDB 或者多租户容器数据库相关联。
- 在 Oracle RAC 环境中,多个实例可以关联到非 CDB 或者多租户容器数据库。
- 一个实例与整个 CDB 相关联。
如果同一服务器上有多个数据库,则每个非 CDB 或者 CDB 都有一个单独且不同的实例。
非 CDB 和 CDB 之间不能共享实例。
共有三种可能的配置选项:
多租户配置
通常每个 CDB 有一个以上的 PDB,但可以在任何时候保存零个、一个或者多个 PDB,以利用 Multitenant 架构的全部功能,这需要获得许可的 Oracle Multitenant 选项。
单租户配置
多租户架构的特殊情况,不需要许可选项。
Non-CDB
Oracle 数据库 11g 架构
Oracle 多租户容器数据库
上图说明了将部署到三个不同的非 CDB 中的三个应用程序合并为一个应用程序。
它显示了一个包含四个容器的多租户容器数据库:CDB 根和三个可插拔数据库。
每个可插拔数据库都有自己的专用应用程序,并由其自己的 DBA 或者作为 CDB 根容器的 SYS 用户(普通用户)的容器管理员进行管理。
这个公共 SYS 用户可以管理 CDB 根容器和每个可插拔数据库。
可插拔数据库是一组数据库模式,在逻辑上对用户和应用程序显示为一个单独的数据库。
但在物理层面,多租户容器数据库有一个数据库实例和数据库文件,就像非 CDB 一样。
没有任何变化:客户端代码和数据库对象都没有变化。
将非 CDB 插入 CDB 很容易。
CDB 避免冗余:
- 后台进程
- 内存分配
- 多个数据字典中的 Oracle 元数据
将多个应用程序组合在一起的 CDB 最终只有一个实例。
此实例将在 CDB 根容器中具有一组后台进程、一个 SGA 分配和一个数据字典,这对所有 PDB 都是通用的。
每个 PDB 将维护自己的应用程序数据字典。
当我们必须修补或者升级应用程序时,我们只能在 CDB 上执行一次维护操作。
因此,与 CDB 关联的所有应用程序将同时修补或者更新。
术语
有不同类型的数据库管理员。
- 在非 CDB 中,DBA 负责数据库级别的所有管理任务。
- 在 CDB 中,有不同的管理级别:
- 负责管理 CDB 实例、CDB 根和所有 PDB 的 DBA
- 负责管理各自 PDB 的 DBA
CDB 和 PDB 中实体的术语如下:
- 通用用户、角色和配置文件存在于所有容器中,并且在这些容器中具有相同的名称。本地用户、角色和配置文件对于它们所在的容器 (PDB) 具有唯一的名称。
- 公共特权是“共同”授予 CDB 中所有容器的特权,而不是在 PDB 中本地授予的特权。
- 通用对象存在于 Oracle 提供的模式中。本地对象是在本地模式的 PDB 中创建的。
- CDB资源管理工作在CDB级别,PDB资源管理工作在PDB级别。
- 可以在 CDB 根和每个 PDB 中创建审计策略。加密主密钥、Database Vault 领域和命令规则具有相同的概念。
- XStream Out 仅在 CDB 级别可用,XStream In 仅在 PDB 级别可用。 XStream 由 Oracle 数据库组件和应用程序编程接口 (API) 组成,它们使客户端应用程序能够从 Oracle 数据库接收数据更改并将数据更改发送到 Oracle 数据库。 XStream Out 提供了 Oracle 数据库组件和 API,使我们能够与其他系统共享对 Oracle 数据库所做的数据更改。 XStream In 提供了 Oracle 数据库组件和 API,使我们能够与 Oracle 数据库共享对其他系统所做的数据更改。
影响
如果 CDB 有 AL32UTF8 的 unicode 数据库字符集,则 CDB 可以包含具有不同数据库字符集的 PDB,因为所有字符集都可以转换为 AL32UTF8.
可以使用现有数据库字符集迁移步骤将现有 PDB 的字符集更改为任何兼容的字符集。
CDB 只有一个 spfile。
PDB 参数值存储在字典表中。
使用数据库链接访问另一个 PDB 中的对象。
如果将 Oracle Active Dataguard 用于报告目的,则无需复制 PDB。
Oracle 数据库 12c 版使我们能够通过使用带有要复制的 PDB 列表的 STANDBYS 子句在备用数据库中实现 PDB 的子集。
如果用户执行 ALTER DATABASE SWITCHOVER TO ... VERIFY 语句将带有 PDB 子集的备用数据库切换到主数据库,则会出现警告错误消息。
但是,这些备用数据库可以成为主数据库。
在以下语句中,将在备用数据库 stdby1 和 stdby2 上创建 PDB1:
SQL> CREATE PLUGGABLE DATABASE pdb1 … STANDBYS=(stdby1,stdby2);
在 Oracle Database Vault 中,每个 PDB 都有自己的 Database Vault 元数据。
Database Vault 构造(例如领域)在 PDB 中是隔离的。
Oracle 数据库 12.2 版引入了对具有公共领域和命令规则的公共对象的保护。
每个 PDB 都有自己的主密钥,用于加密 PDB 中的数据。
当 PDB 从一台主机移动到另一台主机时,TDE 主加密密钥必须从源数据库密钥库传输到目标数据库密钥库。
对于列加密,每个 PDB 都维护自己的 ENC$,它不是元数据链接的对象。
统一的审计配置在所有 PDB 中可见并强制执行。
它使管理员能够避免为每个容器单独配置审计。
这不仅可以创建所有 PDB 使用的审计策略,还可以创建专用于每个 PDB 的审计策略。
未在所有 PDB 中强制实施的审计配置意味着它仅适用于 PDB 内并且在其外部不可见。
热图和 ADO(自动数据优化)支持信息生命周期管理 (ILM) 操作的自动化,通过压缩和存储分层将数据自动移动到适当的存储格式。
ADO 依赖于热图报告和收集的统计数据,热图是段级别和块级别的跟踪活动。
自 Oracle Database 12c 第 2 版起,CDB 中启用了热图和 ADO。
XStream 是一个编程接口,允许客户端应用程序访问数据库中的更改,称为 XStream 出站服务器。
XStream Inbound Server 允许客户端应用程序将更改提供给数据库并利用数据库中可用的应用过程。
Oracle GoldenGate 是逻辑复制,XStream 通过 Oracle GoldenGate (OGG) 许可获得许可。
从数据库捕获更改必须始终来自 CDB 根。
XStream 出站可以配置为从 PDB 或者整个 CDB 捕获更改。
通过 Oracle GoldenGate 应用更改是按 PDB 完成的。
XStream 入站服务器配置为将更改应用于特定 PDB 并在 PDB 上下文中执行其所有工作。
XStream 和 Oracle GoldenGate 中的支持适用,没有特定限制。
Logminer 即席查询(V$LOGMNR_CONTENTS、DBMS_LOGMNR)支持 PDB 中的客户公共对象,就像它们支持 PDB 中的本地对象一样。
一般来说,用户创建的所有调度器对象都可以使用数据泵导出或者导入到 PDB 中。
不会导出预定义的调度程序对象,这意味着在将数据库导入 PDB 时,用户对这些对象所做的任何更改都必须再次应用。
PDB 中定义的作业仅在 PDB 打开时运行。
多租户容器数据库架构
上图显示了一个带有四个容器的 CDB:CDB 根、CDB 种子和两个 PDB。
这两个应用程序使用单个实例并单独维护。
在物理层面上,CDB 有一个数据库实例和数据库文件,就像非 CDB 一样。
- 重做日志文件对于整个 CDB 是通用的。它包含的信息使用发生更改的 PDB 的标识进行注释。 Oracle GoldenGate 可以理解 CDB 的重做日志的格式。 CDB 中的所有 PDB 共享 CDB 的 ARCHIVELOG 模式。
- 控制文件对于整个 CDB 是通用的。更新控制文件以反映插入的 PDB 的任何添加表空间和数据文件。
- UNDO 表空间默认在每个容器中都是本地的。所有容器共享一个 UNDO 表空间是可能的。在这种情况下,RAC 数据库中的每个实例都有一个 UNDO 表空间。
- CDB 根或者 PDB 只能有一个默认的临时表空间或者表空间组。每个 PDB 都可以有临时表空间供 PDB 中的本地或者普通用户使用。
- 每个容器都有自己的数据字典存储在其适当的 SYSTEM 表空间中,包含自己的元数据和一个 SYSAUX 表空间。
- PDB 可以根据应用程序需要在 PDB 内创建表空间。
- 每个数据文件都与一个名为 CON_ID 的特定容器相关联。
用户添加到非 CDB 的对象
在非 CDB 中,添加了用户和用户数据。
最佳实践是将此数据添加到专用于用户数据的表空间中。
将数据存储在单独的表空间中使我们能够更轻松地保护、保护和传输数据,即使用户元数据与 Oracle 系统元数据一起位于数据字典中:
- 对象定义
- 用户定义
- PL/SQL 代码
- 其他用户创建的对象
挑战
从 Oracle Database 12c 开始,多租户架构使我们可以在单个 Oracle Database 实例中拥有多个可插拔数据库。
在 Oracle Database 18c 中使用多租户架构有什么好处?
目前,许多 Oracle 客户拥有大量基于 Oracle RDBMS 构建的“部门”应用程序。
- 这些应用程序很少使用部署它们的硬件的很大一部分。大量实例和所有这些小型数据库的存储分配量阻止将它们放置在同一物理和存储服务器上。
- 此外,它们通常不够复杂,需要全职管理员 100% 的注意力。
- 为了更好地利用硬件和 DBA 资源,客户更愿意将这些部门应用程序中的大部分整合到单个 Oracle RDBMS 部署中。
多租户架构允许 DBA 将大量小型部门数据库应用程序整合到一个更大的 RDBMS 安装中。
容器
总而言之,CDB 是一个 Oracle 数据库,其中包含 CDB 根、CDB 种子以及可能的多个可插拔数据库 (PDB)。
什么是 CDB 中的 PDB?
PDB 是水平分区数据字典的下部加上用户的配额消耗数据。
非 CDB 不能包含 PDB。
多租户架构使 Oracle 数据库能够包含模式、模式对象和非模式对象的可移植集合,这些对象在 Oracle Net 客户端中显示为单独的数据库。
为了使 PDB 存在和工作,CDB 需要在创建 CDB 时生成的特定类型的容器,即 CDB 根。
CDB 根是系统提供的容器,用于存储普通用户(可以连接到多个容器的用户)以及系统提供的元数据和数据。
系统提供的 PL/SQL 包的源代码存储在 CDB 根目录中。
一个 CDB 中只有一个 CDB 种子 PDB。
CDB 种子 PDB 是系统提供的模板,用于创建新的 PDB。
一个 CDB 最多可以包含 4,096 个 PDB,包括 CDB 种子,服务限制为 10,000。
V$CONTAINERS 视图显示所有 PDB,包括 CDB 根和 CDB 种子。
总之,
CDB root
- CDB 创建时创建的第一个强制容器
- Oracle 系统提供的通用对象和元数据
- Oracle 系统提供的常用用户和角色
可插拔数据库 (PDB)
- 表空间(永久和临时)
- 模式/对象/权限
- 创建/克隆/拔出/插入/代理
- 特定 PDB:用于快速配置新 PDB 的 CDB 种子 (PDB$SEED)
数据字典和动态视图
为了向后兼容,DBA 视图在 PDB 中显示与在非 CDB 中相同的结果: DBA_OBJECTS 显示运行查询的 PDB 中存在的对象。
这反过来意味着,尽管 PDB 和 CDB 根具有单独的数据字典,但 PDB 中的每个数据字典视图都显示从这两个数据字典中获取的结果。
CDB 根目录中的 DBA_xxx 视图显示,即使在填充的 CDB 中,也仅显示 Oracle 提供的系统 — 正如在新创建的非 CDB 中看到的那样。
为了支持 CDB 管理员的职责,支持一系列数据字典视图,名称如 CDB_xxx。
每个 DBA_xxx 视图都有一个 CDB_xxx 视图对应物,带有一个另外的列 Con_ID,它显示列出的事实来自哪个容器。
从 CDB 根和任何 PDB 查询 CDB_xxx 视图。
来自特定 CDB_xxx 视图的结果是来自 CDB 根和所有当前打开的 PDB 上对应的 DBA_xxx 视图的结果的并集。
当从 PDB 查询 CDB_xxx 视图时,它仅显示它在其 DBA_xxx 视图副本中显示的信息。
如果我们连接到 CDB 根并查询 CDB_USERS,我们将获得每个容器的普通用户和本地用户列表。
如果我们查询 DBA_USERS,我们将获得普通用户列表。
如果我们连接到 PDB 并查询 CDB_USERS 或者 DBA_USERS,我们将获得 PDB 的相同用户列表(公共用户和本地用户)。
同样的向后兼容性原则也适用于每个熟悉的 V$ 视图。
例如:
SQL> select OBJECT_ID, ORACLE_USERNAME, LOCKED_MODE, CON_ID from V$LOCKED_OBJECT; OBJECT_ID ORACLE_USERNAME LOCKED_MODE CON_ID ---------- ---------------- ----------- ------ 83711 SYS 3 3 <--- PDB1 83710 DOM 3 4 <--- PDB2
Non-CDB架构
在 Oracle 数据库 11g 版中,唯一受支持的数据库类型是非 CDB。
旧架构称为非 CDB 架构。
术语非 CDB 是预发布 12.1Oracle 数据库的简写。
这种类型的数据库需要自己的实例,它必须有自己的后台进程和 SGA 的内存分配。
它必须将 Oracle 元数据存储在其数据字典中。
数据库管理员仍然可以使用相同的 pre-12.1 架构创建 Oracle 18c 非 CDB。
这些数据库不是多租户容器数据库;它们是非 CDB。
当我们管理小型部门数据库应用程序时,我们必须创建与应用程序一样多的数据库,这需要增加实例的数量。
因此,这会增加 SGA 的后台进程数和内存分配。
因此,我们必须为这些数据库的所有数据字典提供足够的存储空间。
当我们需要将应用程序升级到新版本时,我们必须升级每个数据库,这对于 DBA 来说非常耗时。
USER 容器中的 SYSTEM 对象
在多租户容器数据库中,引入了容器的概念以将 Oracle 提供的对象和包含元数据的用户数据分离到不同的容器中。
每个容器都有一个 SYSTEM 表空间,其中包含一个数据字典。
- 仅 Oracle 元数据容器中有一个字典,其中包含 Oracle 提供的对象的元数据。
- 用户容器中有一个保存用户元数据的字典。
多租户架构的目标之一是每个容器都与应用程序具有一对一的关系。
分离元数据是第一步,第二步是允许“用户”容器内的应用程序或者用户访问 Oracle 提供的对象。
用户容器称为可插拔数据库 (PDB)。
Oracle 对象可以在每个 PDB 中复制,但这会占用大量空间,并且每次 Oracle 提供的对象更改(例如,使用补丁)时都需要升级每个 PDB。
Oracle 提供的对象驻留在称为 CDB 根容器的容器中,该容器名为 CDB$ROOT。
从 PDB 到 Oracle 提供的对象的指针允许访问“系统”对象,而无需在 PDB 中复制它们。
PDB 具有成为数据库应用程序完整环境所需的部分。
应用程序可以在 PDB 中运行,就像在非 CDB 中一样。
non-CDB 中的数据库对象
Oracle 元数据如何在非 CDB 中的多个应用程序之间共享?
在创建非 CDB 之后,数据字典中的唯一对象是 Oracle 提供的对象。
此时,没有用户数据。
数据库中唯一的模式是数据库系统所需的模式。
供应可插拔数据库
要创建新的 PDB,请使用提供的 CDB 种子 PDB。
此 CDB 种子容器名为 PDB$SEED,是每个 CDB 的一部分。
创建新 PDB 时,CDB 种子 PDB 将被克隆并为新 PDB 提供我们指定的名称。
这个操作非常快。
它以秒为单位。
花费的时间主要用于复制文件。
提供可插入数据库的方法有多种:
- 从 PDB$SEED 可插拔数据库创建一个新的 PDB:此方案很有用,例如,对于新的应用程序实现。
- 从非 CDB 创建新的 PDB:作为迁移策略的一部分,将非 CDB 作为 PDB 插入 CDB。这也是将非 CDB 合并为 CDB 的好方法。
- 克隆非 CDB :将 CDB 中的非 CDB 克隆为 PDB,作为迁移策略的一部分。这是保留非 CDB 的好方法,因此有机会比较新 PDB 和原始非 CDB 之间的性能,或者至少等到我们认为 PDB 可以正常工作。
- 将另一个 PDB 中的 PDB 克隆到同一个或者另一个 CDB 中:此方法的一个示例是应用程序测试。将一个 PDB 重定位到另一个 CDB 以调度资源。
- 将已拔出的 PDB 插入另一个 CDB:例如,我们可以从一个 Oracle 数据库版本拔出可插入数据库,然后将其插入新创建的更高版本的多租户容器数据库,而不是将多租户容器数据库从一个版本升级到另一个版本.
- 代理 PDB :代理 PDB 提供对远程 CDB 中另一个 PDB 的完整功能访问。此功能使我们能够构建位置透明的应用程序,这些应用程序可以聚合来自同一数据中心或者分布在各个数据中心的多个来源的数据。