Oracle官方文档翻译《Database Concepts 26ai》第2章-容器数据库与可插入数据库
2 CDBs and PDBs(2 CDB 与 PDB)
多租户架构使 Oracle 数据库能够作为多租户容器数据库(CDB)运行。从 Oracle Database 21c 开始,多租户容器数据库是唯一受支持的架构。在之前的版本中,Oracle 支持非容器数据库(non-CDB)。
-
• About Containers in a CDB(CDB 中的容器简介)容器是多租户容器数据库(CDB)中模式、对象及相关结构的集合。在 CDB 内,每个容器都有唯一的 ID 和名称。 -
• The CDB Root and System Container(CDB 根容器与系统容器)CDB 根容器,也简称根容器,是所有 PDB 所属的模式、模式对象及非模式对象的集合。 -
• PDBs(PDB)PDB 是用户创建的模式、对象及相关结构的集合,在逻辑上对客户端应用程序显示为一个独立的数据库。
About Containers in a CDB(CDB 中的容器简介)
容器是多租户容器数据库(CDB)中模式、对象及相关结构的集合。在 CDB 内,每个容器都有唯一的 ID 和名称。CDB 包括零个、一个或多个客户创建的可插入数据库(PDB)和应用程序容器。PDB 是可移植的模式、模式对象及非模式对象的集合,对 Oracle Net 客户端显示为独立的数据库。应用程序容器是一个可选的、用户创建的 CDB 组件,用于存储一个或多个应用程序后端的数据和元数据。CDB 包括零个或多个应用程序容器。
注意:“Application Containers”(应用程序容器)详细解释了应用程序容器。
下图展示了 CDB 中可能的容器。
Figure 2-1 Containers in a CDB(图2-1 CDB 中的容器)

每个 CDB 都有以下容器:
-
• 恰好一个 CDB 根容器(也简称根容器)CDB 根容器是所有 PDB 所属的模式、模式对象及非模式对象的集合(参见“CDBs and PDBs”(CDB 与 PDB))。根容器存储 Oracle 提供的元数据和公用用户。元数据的一个示例是 Oracle 提供的 PL/SQL 包的源代码。公用用户是在每个容器中都已知的数据库用户(参见“Common User Accounts”(公用用户帐户))。根容器命名为 CDB$ROOT。 -
• 恰好一个系统容器系统容器包括根 CDB 和 CDB 中的所有 PDB。因此,系统容器是 CDB 本身的逻辑容器。 -
• 零个或多个应用程序容器应用程序容器由恰好一个应用程序根容器以及插入到该根容器的 PDB 组成。系统容器包含 CDB 根容器和 CDB 内的所有 PDB,而应用程序容器仅包含插入到应用程序根容器的 PDB。应用程序根容器属于 CDB 根容器,不属于任何其他容器。 -
• 零个或多个用户创建的 PDBPDB 包含特定功能集所需的数据和代码(参见“PDBs”(PDB))。例如,一个 PDB 可以支持特定的应用程序,如人力资源或销售应用程序。在创建 CDB 时,不存在任何 PDB。您根据业务需求添加 PDB。一个 PDB 属于恰好零个或一个应用程序容器。如果一个 PDB 属于某个应用程序容器,那么它就是一个应用程序 PDB。例如, cust1_pdb和cust2_pdb应用程序 PDB 可能属于saas_sales_ac应用程序容器,在这种情况下,它们不属于任何其他应用程序容器。应用程序种子是一个可选的应用程序 PDB,充当用户创建的 PDB 模板,使您能够快速创建新的应用程序 PDB。 -
• 恰好一个种子 PDB种子 PDB 是系统提供的模板,CDB 可以使用它来创建新的 PDB。种子 PDB 命名为 PDB$SEED。您不能在PDB$SEED中添加或修改对象。
Example 2-1 CDB with No Application Containers(示例 2-1:不带应用程序容器的 CDB)此示例展示了一个简单的 CDB,包含五个容器:系统容器(整个 CDB)、CDB 根容器、PDB 种子(PDB$SEED)以及两个 PDB。每个 PDB 都有自己专用的应用程序。不同的 PDB 管理员管理每个 PDB。公用用户以单一身份存在于整个 CDB 中。在此示例中,公用用户 SYS 可以管理根容器和每个 PDB。在物理层面,此 CDB 由一个或多个数据库实例管理,并为每个 PDB 和 CDB 本身包含一组数据文件。
Figure 2-2 CDB with No Application Containers(图2-2 不带应用程序容器的 CDB)

Example 2-2 CDB with an Application Container(示例 2-2:带应用程序容器的 CDB)在此变体中,CDB 包含一个名为 saas_sales_ac 的应用程序容器。在该应用程序容器内,应用程序 PDB cust1_pdb 为一个客户支持应用程序,应用程序 PDB cust2_pdb 为另一个客户支持应用程序。CDB 还包含一个名为 hrpdb 的 PDB,它支持人力资源应用程序,但不属于应用程序容器。
Figure 2-3 CDB with an Application Container(图2-3 带应用程序容器的 CDB)

在此示例中,多个 DBA 管理 CDB 环境:
-
• CDB 管理员管理 CDB 本身。 -
• 应用程序容器管理员管理 saas_sales_ac容器,包括应用程序安装和升级。 -
• 应用程序 PDB 管理员管理 saas_sales_ac容器中的两个 PDB:cust1_pdb和cust2_pdb。 -
• PDB 管理员管理 hrpdb。
The CDB Root and System Container(CDB 根容器与系统容器)
CDB 根容器,也简称根容器,是所有 PDB 所属的模式、模式对象及非模式对象的集合。每个 CDB 都有且只有一个名为 CDB$ROOT 的根容器。根容器存储管理 PDB 所需的系统元数据。所有 PDB 都属于根容器。系统容器是 CDB 根容器以及属于该根容器的所有 PDB。CDB 根容器不存储用户数据。Oracle 建议您不要向根容器添加公用对象,也不要修改根容器中 Oracle 提供的模式。但是,您可以创建用于数据库管理的公用用户和角色。具有必要权限的公用用户可以在容器之间切换。Oracle 建议根容器使用 AL32UTF8 字符集。具有不同字符集的 PDB 可以驻留在同一个 CDB 中,而无需进行字符集转换。
Example 2-3 All Containers in a CDB(示例 2-3:CDB 中的所有容器)以下查询由连接到 CDB 根容器的管理用户发出,列出了 CDB 中的所有容器(包括种子和 CDB 根容器),并按 CON_ID 排序。
COL NAME FORMAT A15SELECT NAME, CON_ID, DBID, CON_UID, GUIDFROM V$CONTAINERS ORDERBY CON_ID;NAME CON_ID DBID CON_UID GUID------------- ------ ---------- ---------- --------------------------------CDB$ROOT 1189528772512003321EDD4F60D6E0534E40E40A41C5PDB$SEED 227953865052795386505200AC90679F07B55E05396C0E40A23FESAAS_SALES_AC 312396464231239646423200B4CE0A8DC1D24E05396C0E40AF8EESALESPDB 436925496343692549634200B4928319C1BCCE05396C0E40A2432HRPDB 537844830903784483090200B4928319D1BCCE05396C0E40A2432
另请参见:
-
• “Common User Accounts”(公用用户帐户)
PDBs(PDB)
PDB 是用户创建的模式、对象及相关结构的集合,在逻辑上对客户端应用程序显示为一个独立的数据库。每个 PDB 都归 SYS 所有,无论是由哪个用户创建的 PDB。SYS 是 CDB 中的公用用户,这意味着该用户在根容器以及 CDB 内所有现有和未来的 PDB 中具有相同的身份。
-
• Types of PDBs(PDB 的类型)所有 PDB 都是使用 CREATE PLUGGABLE DATABASE语句用户创建的,但PDB$SEED除外,后者是 Oracle 提供的。 -
• Purpose of PDBs(PDB 的用途)对于应用程序而言,PDB 是一个自包含、功能齐全的 Oracle 数据库。您可以将 PDB 整合到单个 CDB 中,以实现规模经济,同时保持 PDB 之间的隔离。 -
• Proxy PDBs(代理 PDB)代理 PDB 引用远程 PDB,称为被引用 PDB。 -
• Names for PDBs(PDB 的命名)CDB 中的容器共享相同的命名空间,这意味着它们在此命名空间中必须具有唯一的名称。 -
• Database Links Between PDBs(PDB 之间的数据库链接)默认情况下,连接到一个 PDB 的用户必须使用数据库链接来访问不同 PDB 中的对象。
Types of PDBs(PDB 的类型)
所有 PDB 都是使用 CREATE PLUGGABLE DATABASE 语句用户创建的,但 PDB$SEED 除外,后者是 Oracle 提供的。
您可以创建以下类型的 PDB。
标准 PDB此类型的 PDB 是通过运行 CREATE PLUGGABLE DATABASE 而不将其指定为种子、代理 PDB 或应用程序根容器来创建的。其功能取决于您在其中创建它的容器:
-
• 插入到 CDB 根容器的 PDB此 PDB 属于 CDB 根容器,而不是应用程序容器。此类型的 PDB 不能使用应用程序公用对象。参见“Application Common Objects”(应用程序公用对象)。 -
• 应用程序 PDB应用程序 PDB 属于恰好一个应用程序容器。与插入到 CDB 根容器的 PDB 不同,应用程序 PDB 可以在应用程序容器内共享主应用程序定义。例如,应用程序根容器中的 usa_zipcodes表可能是一个数据链接公用对象,这意味着它包含可供所有插入到该根容器的应用程序 PDB 访问的数据。不在应用程序容器内的 PDB 无法访问其应用程序公用对象。
应用程序根容器将应用程序根容器视为特定于应用程序的根容器。它充当应用程序后端主定义的存储库,包括公用数据和元数据。要创建应用程序根容器,请连接到 CDB 根容器,并在 CREATE PLUGGABLE DATABASE 语句中指定 AS APPLICATION CONTAINER 子句。参见“Application Root”(应用程序根容器)。
种子 PDB与标准 PDB 不同,种子 PDB 不旨在支持应用程序。相反,种子是用于创建支持应用程序的 PDB 的模板。种子可以是以下任一类型:
-
• 插入到 CDB 根容器的种子 PDB ( PDB$SEED)您可以使用此系统提供的模板在应用程序容器或系统容器中创建新的 PDB。系统容器恰好包含一个 PDB 种子。您不能删除PDB$SEED,也不能向其添加对象或修改其中的对象。 -
• 应用程序种子 PDB为了加速在应用程序容器内创建应用程序 PDB,您可以创建一个可选的应用程序种子。应用程序容器包含零个或一个应用程序种子。您可以通过连接到应用程序容器并执行 CREATE PLUGGABLE DATABASE ... AS SEED语句来创建应用程序种子。参见“Application Seed”(应用程序种子)。
代理 PDB代理 PDB 是一种 PDB,它使用数据库链接来引用远程 CDB 中的 PDB。当您在代理 PDB 打开时在其中发出语句时,该语句将在被引用的 PDB 中执行。您必须在连接到 CDB 根容器或应用程序根容器时创建代理 PDB。您可以像更改或删除标准 PDB 一样更改或删除代理 PDB。
Purpose of PDBs(PDB 的用途)
对于应用程序而言,PDB 是一个自包含、功能齐全的 Oracle 数据库。您可以将 PDB 整合到单个 CDB 中,以实现规模经济,同时保持 PDB 之间的隔离。您可以使用 PDB 实现以下特定目标:
-
• 存储特定于应用程序的数据例如,销售应用程序可以拥有自己专用的 PDB,人力资源应用程序也可以拥有自己专用的 PDB。或者,您可以创建一个应用程序容器,它是 PDB 的命名集合,用于存储包含公用数据和元数据的应用程序后端。 -
• 将数据移动到不同的 CDB数据库是“可插入的”,因为您可以将其打包为一个自包含的单元,称为未插入的 PDB,然后将其移动到另一个 CDB 中。 -
• 执行快速升级您可以将 PDB 从较低 Oracle 数据库版本的 CDB 中拔出,然后将其插入到较高版本的 CDB 中。 -
• 在不损失可用性的情况下快速复制数据为了测试和开发,您可以在 PDB 保持打开状态时克隆它,并将克隆存储在同一或不同的 CDB 中。您可以选择将 PDB 指定为可刷新克隆 PDB。或者,您可以使用 Oracle 提供的种子 PDB 或用户创建的应用程序种子来复制新的 PDB。 -
• 引用不同 CDB 中的数据您可以创建一个代理 PDB,它引用不同的 PDB,无论是在同一个 CDB 中还是在不同的 CDB 中。当您在代理 PDB 中发出语句时,它们将在被引用的 PDB 中执行。 -
• 隔离 PDB 内的授权具有适当权限的本地或公用用户可以将模式对象的 EXECUTE权限授予单个 PDB 内的PUBLIC。
另请参见:
-
• “About Application Containers”(应用程序容器简介) -
• 《Oracle AI Database Security Guide》(《Oracle AI 数据库安全指南》),了解如何在 CDB 中授予角色和权限
Proxy PDBs(代理 PDB)
代理 PDB 引用远程 PDB,称为被引用 PDB。尽管您在代理(引用)PDB 中发出 SQL 语句,但这些语句会在被引用的 PDB 中执行。在这方面,代理 PDB 在某种程度上类似于 Linux 中的符号链接文件。代理 PDB 提供以下好处:
-
• 聚合来自多个应用程序模型的数据代理 PDB 使您能够构建位置透明的应用程序,这些应用程序可以聚合来自多个源的数据。这些源可以在同一个数据中心内,也可以分布在不同的数据中心。 -
• 使一个 CDB 中的应用程序根容器能够将应用程序更改传播到另一个应用程序根容器假设 CDB cdb_prod和cdb_test具有相同的应用程序模型。您在cdb_prod的应用程序容器中创建一个代理 PDB,该 PDB 引用cdb_test中的应用程序根容器。当您在cdb_prod的应用程序根容器中运行安装和升级脚本时,Oracle AI Database 会将这些语句传播到代理 PDB,代理 PDB 再将其远程发送到cdb_test中的应用程序根容器。通过这种方式,cdb_test中的应用程序根容器成为cdb_prod中应用程序根容器的副本。要创建代理 PDB,请执行带有AS PROXY FROM子句的CREATE PLUGGABLE DATABASE,其中FROM指定被引用 PDB 的名称和一个数据库链接。创建语句仅复制属于SYSTEM和SYSAUX表空间的数据文件。
Example 2-4 Creating a Proxy PDB(示例 2-4:创建代理 PDB)此示例连接到本地生产 CDB 中的容器 saas_sales_ac。公用用户 sales_admin 创建了一个名为 sales_sync_pdb 的代理 PDB。此应用程序 PDB 引用了远程开发 CDB 中名为 saas_sales_test_ac 的应用程序根容器,并使用 cdb_dev_rem 数据库链接访问它。当生产 CDB 中的 saas_sales_ac 发生应用程序升级时,升级会自动传播到远程开发 CDB 中的应用程序根容器 saas_sales_test_ac。
CONNECT sales_admin@saas_sales_acPassword: ***********CREATE PLUGGABLE DATABASE sales_sync_pdb AS PROXY FROMsaas_sales_test_ac@cdb_dev_rem;
Names for PDBs(PDB 的命名)
CDB 中的容器共享相同的命名空间,这意味着它们在此命名空间中必须具有唯一的名称。以下容器的名称在同一个 CDB 中不得冲突:
-
• CDB 根容器 -
• 插入到 CDB 根容器的 PDB -
• 应用程序根容器 -
• 应用程序 PDB例如,如果同一个 CDB 包含应用程序容器 saas_sales_ac和saas_sales_test_ac,那么两个都名为cust1的应用程序 PDB 不能同时驻留在这两个容器中。命名空间规则还阻止在 CDB 根容器中创建名为cust1pdb的 PDB,并在应用程序根容器中创建名为cust1pdb的 PDB。PDB 和应用程序根容器的名称必须遵循与网络服务名相同的规则。此外,因为 PDB 或应用程序根容器具有以其自身名称命名的服务,所以容器名称在所有通过特定监听器公开其服务的 CDB 中必须是唯一的。用户创建的容器名称的第一个字符必须是字母,其余字符必须是字母数字或下划线 (_)。因为服务名不区分大小写,所以容器名称也不区分大小写,即使使用带引号的标识符指定,也采用大写形式。
另请参见:《Oracle AI Database Net Services Reference》(《Oracle AI 数据库网络服务参考》),了解服务名称的规则
Database Links Between PDBs(PDB 之间的数据库链接)
默认情况下,连接到一个 PDB 的用户必须使用数据库链接来访问不同 PDB 中的对象。
Figure 2-4 Database Link Between PDBs(图2-4 PDB 之间的数据库链接)

在此图中,PDB 管理员连接到名为 hrpdb1 的 PDB。默认情况下,在此用户会话期间,c##dba 如果不指定数据库链接,则无法查询 hrpdb2 中的 emp2 表。
此规则的例外情况包括:
-
• 数据链接公用对象,所有包含指向此对象的数据链接的应用程序 PDB 都可以访问它。例如,应用程序容器 saas_sales_ac可能在其应用程序中包含数据链接表usa_zipcodes。在这种情况下,公用 CDB 用户c##dba可以连接到该容器中的应用程序 PDB,然后查询usa_zipcodes,即使实际的表驻留在应用程序根容器中。在这种情况下,不需要数据库链接。 -
• 从 CDB 根容器或应用程序根容器发出的 SQL 中的 CONTAINERS()子句。使用此子句,您可以跨插入到容器根容器的所有 PDB 查询数据。创建代理 PDB 时,必须在CREATE PLUGGABLE DATABASE ... AS PROXY语句的FROM子句中指定数据库链接名称。如果代理 PDB 和被引用的 PDB 驻留在不同的 CDB 中,则必须在将包含代理 PDB 的 CDB 的根容器中定义数据库链接。数据库链接必须连接到远程被引用的 PDB 或远程 CDB 的 CDB 根容器。
另请参见:“Common and Local Objects”(公用对象与本地对象)
夜雨聆风