当前位置: 首页 > news >正文

Oracle官方文档翻译《Database Concepts 23ai》第2章-容器数据库与可插入数据库

2 CDBs and PDBs(2 容器数据库与可插入数据库)

多租户体系结构支持 Oracle 数据库作为多租户容器数据库(CDB,Multitenant Container Database)运行。

从 Oracle 数据库 21c 开始,多租户容器数据库是唯一受支持的体系结构。在早期版本中,Oracle 支持非容器数据库(non-CDB)。

About Containers in a CDB(CDB 中的容器简介)

容器(Container)是多租户容器数据库(CDB)中模式、对象及相关结构的集合。在一个 CDB 内,每个容器都有唯一的 ID 和名称。

CDB 包含零个、一个或多个用户创建的可插入数据库(PDB)和应用程序容器:

  • 可插入数据库(PDB):模式、模式对象及非模式对象的可移植集合,对 Oracle Net 客户端而言,表现为一个独立的数据库。
  • 应用程序容器(Application Container):CDB 中可选的用户创建组件,用于存储一个或多个应用程序后端的数据和元数据。一个 CDB 可包含零个或多个应用程序容器。

注意:“应用程序容器”(Application Containers)部分将详细介绍应用程序容器。

下图展示了 CDB 中可能包含的容器类型:

Figure 2-1 Containers in a CDB

每个 CDB 都包含以下类型的容器:

  1. 恰好一个 CDB 根容器(简称“根容器”)
    CDB 根容器(CDB Root)是所有 PDB 所属的模式、模式对象及非模式对象的集合(参见“CDBs and PDBs”)。根容器存储 Oracle 提供的元数据和公用用户:

    • 元数据示例:Oracle 提供的 PL/SQL 包的源代码。
    • 公用用户:在每个容器中都可见的数据库用户(参见“Common User Accounts”)。
      根容器的名称为 CDB$ROOT
  2. 恰好一个系统容器
    系统容器包含 CDB 根容器和 CDB 内的所有 PDB,因此是 CDB 本身的逻辑容器。

  3. 零个或多个应用程序容器
    一个应用程序容器恰好包含一个应用程序根容器(Application Root)以及插入该根容器的 PDB。与包含 CDB 根容器和 CDB 内所有 PDB 的系统容器不同,应用程序容器仅包含插入其应用程序根容器的 PDB。应用程序根容器仅属于 CDB 根容器,不属于其他任何容器。

  4. 零个或多个用户创建的 PDB
    PDB 包含特定功能集所需的数据和代码(参见“PDBs”)。例如,一个 PDB 可支持人力资源或销售等特定应用程序。CDB 创建时不存在任何 PDB,需根据业务需求添加。
    一个 PDB 最多属于一个应用程序容器:若属于某个应用程序容器,则称为“应用程序 PDB”。例如,cust1_pdbcust2_pdb 这两个应用程序 PDB 可能属于 saas_sales_ac 应用程序容器,且不再属于其他任何应用程序容器。应用程序种子(Application Seed)是可选的应用程序 PDB,作为用户创建的 PDB 模板,支持快速创建新的应用程序 PDB。

  5. 恰好一个种子 PDB
    种子 PDB(Seed PDB)是系统提供的模板,CDB 可使用该模板创建新的 PDB。种子 PDB 的名称为 PDB$SEED,无法在 PDB$SEED 中添加或修改对象。

Example 2-1 CDB with No Application Containers(示例 2-1:不含应用程序容器的 CDB)

本示例展示一个包含 5 个容器的简单 CDB:系统容器(整个 CDB)、CDB 根容器、PDB 种子(PDB$SEED)以及两个 PDB。每个 PDB 支持独立的应用程序,由不同的 PDB 管理员管理。公用用户在 CDB 中具有统一身份,例如公用用户 SYS 可管理根容器和所有 PDB。
从物理层面看,该 CDB 由一个或多个数据库实例管理,且包含一组供每个 PDB 和 CDB 本身使用的数据文件。

Figure 2-2 CDB with No Application Containers

Example 2-2 CDB with an Application Container(示例 2-2:包含应用程序容器的 CDB)

本示例中,CDB 包含一个名为 saas_sales_ac 的应用程序容器:

  • 应用程序容器内,应用程序 PDB cust1_pdb 为一个客户的应用程序提供支持,cust2_pdb 为另一个客户的应用程序提供支持。
  • CDB 还包含一个名为 hrpdb 的 PDB,用于支持人力资源应用程序,但不属于任何应用程序容器。

Figure 2-3 CDB with an Application Container

本示例中,多个数据库管理员(DBA)共同管理 CDB 环境:

  • CDB 管理员:管理 CDB 本身。
  • 应用程序容器管理员:管理 saas_sales_ac 容器,包括应用程序的安装和升级。
  • 应用程序 PDB 管理员:管理 saas_sales_ac 容器中的两个 PDB(cust1_pdbcust2_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 根容器的管理员用户执行,按 CON_ID 排序列出 CDB 中的所有容器(包括种子 PDB 和 CDB 根容器):

COL NAME FORMAT A15
SELECT NAME, CON_ID, DBID, CON_UID, GUID 
FROM V$CONTAINERS ORDER BY CON_ID;

查询结果如下

NAMECON_IDDBIDCON_UIDGUID
CDB$ROOT1189528772512003321EDD4F60D6E0534E40E40A41C5
PDB$SEED227953865052795386505200AC90679F07B55E05396C0E40A23FE
SAAS_SALES_AC312396464231239646423200B4CE0A8DC1D24E05396C0E40AF8EE
SALESPDB436925496343692549634200B4928319C1BCCE05396C0E40A2432
HRPDB537844830903784483090200B4928319D1BCCE05396C0E40A2432

另请参见:“Common User Accounts”(公用用户账户)

PDBs(可插入数据库)

可插入数据库(PDB)是用户创建的模式、对象及相关结构的集合,从逻辑上看,对客户端应用程序而言相当于一个独立的数据库。

无论由哪个用户创建,每个 PDB 的所有者都是 SYSSYS 是 CDB 中的公用用户,这意味着该用户在根容器以及 CDB 中所有现有和未来的 PDB 中都具有相同身份。

Types of PDBs(PDB 的类型)

除 Oracle 提供的 PDB$SEED 外,所有 PDB 均通过 CREATE PLUGGABLE DATABASE 语句由用户创建。

可创建以下类型的 PDB:

Standard PDB(标准 PDB)
通过 CREATE PLUGGABLE DATABASE 语句创建、且未指定为种子 PDB、代理 PDB 或应用程序根容器的 PDB。其功能取决于创建时所在的容器:

  • 插入 CDB 根容器的 PDB
    属于 CDB 根容器,不属于任何应用程序容器,无法使用应用程序公用对象(参见“Application Common Objects”)。

  • 应用程序 PDB)
    恰好属于一个应用程序容器的 PDB。与插入 CDB 根容器的 PDB 不同,应用程序 PDB 可在应用程序容器内共享主应用程序定义。例如,应用程序根容器中的 usa_zipcodes 表可能是“数据链接公用对象”(Data-Linked Common Object),意味着该表包含的数据可被所有插入该根容器的应用程序 PDB 访问;不属于该应用程序容器的 PDB 无法访问其应用程序公用对象。

Application Root(应用程序根容器)
应用程序根容器可视为“应用程序专用的根容器”,作为应用程序后端主定义(包括公用数据和元数据)的存储库。创建应用程序根容器时,需连接到 CDB 根容器,并在 CREATE PLUGGABLE DATABASE 语句中指定 AS APPLICATION CONTAINER 子句。参见“Application Root”(应用程序根容器)。

Seed PDBs(种子 PDB)
与标准 PDB 不同,种子 PDB 不用于支持应用程序,而是作为创建应用程序支持型 PDB 的模板。种子 PDB 分为以下两类:

  • 插入 CDB 根容器的种子 PDB(PDB$SEED:系统提供的模板,可用于在应用程序容器或系统容器中创建新 PDB。系统容器恰好包含一个此类种子 PDB,无法删除 PDB$SEED,也无法在其中添加或修改对象。
  • 应用程序种子 PDB:为加速应用程序容器内应用程序 PDB 的创建,可创建可选的应用程序种子。一个应用程序容器包含零个或一个应用程序种子。
    创建应用程序种子时,需连接到应用程序容器并执行 CREATE PLUGGABLE DATABASE ... AS SEED 语句。参见“Application Seed”(应用程序种子)。

Proxy PDBs(代理 PDB)
代理 PDB 是通过数据库链接引用远程 PDB(称为“引用 PDB”)的 PDB。当 PDB 处于打开状态时,在代理 PDB 中执行的语句会在引用 PDB 中运行。

必须在连接到 CDB 根容器或应用程序根容器时创建代理 PDB,且可像修改或删除标准 PDB 一样操作代理 PDB。

Purpose of PDBs(PDB 的用途)

对应用程序而言,PDB 是独立且功能完整的 Oracle 数据库。可将多个 PDB 整合到单个 CDB 中以实现规模经济,同时保持 PDB 之间的隔离性。

PDB 可用于实现以下特定目标:

  1. 存储应用程序专用数据
    例如,销售应用程序可拥有专用 PDB,人力资源应用程序也可拥有专用 PDB;也可创建应用程序容器(PDB 的命名集合),用于存储包含公用数据和元数据的应用程序后端。

  2. 将数据迁移到其他 CDB
    PDB 具有“可插入性”,因为可将其打包为独立单元(称为“拔出的 PDB”),然后迁移到另一个 CDB 中。

  3. 快速升级
    可从较低 Oracle 数据库版本的 CDB 中拔出 PDB,再插入较高版本的 CDB 中。

  4. 快速复制数据且不影响可用性
    测试和开发场景中,可在 PDB 保持打开状态的同时克隆 PDB,并将克隆存储在同一 CDB 或不同 CDB 中;也可指定 PDB 为“可刷新克隆 PDB”,或使用 Oracle 提供的种子 PDB 或用户创建的应用程序种子复制新 PDB。

  5. 引用其他 CDB 中的数据
    可创建引用其他 PDB(同一 CDB 或不同 CDB 中的 PDB)的代理 PDB,在代理 PDB 中执行的语句会在引用 PDB 中运行。

  6. 在 PDB 内隔离权限授予
    具有相应权限的本地用户或公用用户,可在单个 PDB 内将模式对象的 EXECUTE 权限授予 PUBLIC

另请参见:

  • “About Application Containers”(应用程序容器简介)
  • 《Oracle Database Security Guide》(《Oracle 数据库安全指南》),了解如何在 CDB 中授予角色和权限

Proxy PDBs(代理 PDB)

代理 PDB 引用远程 PDB(称为“引用 PDB”)。

尽管在代理 PDB(引用方)中执行 SQL 语句,但语句实际在引用 PDB 中运行。从这个角度看,代理 PDB 大致类似于 Linux 中的符号链接文件。

代理 PDB 的优势

  • 聚合多个应用程序模型的数据
    代理 PDB 支持构建“位置透明”的应用程序,这类应用程序可聚合来自多个数据源的数据(数据源可位于同一数据中心或分布在不同数据中心)。

  • 使一个 CDB 中的应用程序根容器将应用程序更改传播到另一个应用程序根容器
    假设 CDB cdb_prodcdb_test 具有相同的应用程序模型,可在 cdb_prod 的应用程序容器中创建代理 PDB,该代理 PDB 引用 cdb_test 中的应用程序根容器。在 cdb_prod 的应用程序根容器中运行安装和升级脚本时,Oracle 数据库会将这些语句传播到代理 PDB,进而由代理 PDB 远程发送到 cdb_test 的应用程序根容器,最终使 cdb_test 的应用程序根容器成为 cdb_prod 应用程序根容器的副本。

创建代理 PDB 时,需执行 CREATE PLUGGABLE DATABASE 语句并指定 AS PROXY FROM 子句,其中 FROM 子句用于指定引用 PDB 的名称和数据库链接。创建语句仅复制属于 SYSTEMSYSAUX 表空间的数据文件。

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_ac
Password: ***********
CREATE PLUGGABLE DATABASE sales_sync_pdb AS PROXY FROM 
saas_sales_test_ac@cdb_dev_rem;

Names for PDBs(PDB 的命名规则)

CDB 中的所有容器共享同一命名空间,这意味着容器名称在该命名空间内必须唯一。

同一 CDB 中,以下容器的名称不得冲突:

  • CDB 根容器
  • 插入 CDB 根容器的 PDB
  • 应用程序根容器
  • 应用程序 PDB

例如:

  • 若同一 CDB 包含应用程序容器 saas_sales_acsaas_sales_test_ac,则两个容器中不能同时存在名为 cust1 的应用程序 PDB。
  • 命名空间规则还禁止在 CDB 根容器中创建名为 cust1pdb 的 PDB,同时在应用程序根容器中创建同名 PDB。

PDB 和应用程序根容器的名称需遵循与网络服务名(Net Service Name)相同的规则;此外,由于 PDB 或应用程序根容器拥有与其名称对应的服务,容器名称在所有通过特定监听器暴露服务的 CDB 中必须唯一。
用户创建的容器名称需满足:

  • 首字符必须为字母。
  • 其余字符可为字母、数字或下划线(_)。
  • 服务名不区分大小写,因此容器名称也不区分大小写,即使使用分隔标识符指定,最终也会转换为大写。

另请参见:《Oracle Database Net Services Reference》(《Oracle 数据库网络服务参考》),了解服务名的命名规则。

Database Links Between PDBs(PDB 之间的数据库链接)

默认情况下,连接到一个 PDB 的用户必须通过数据库链接才能访问另一个 PDB 中的对象。

Figure 2-4 Database Link Between PDBs

如上图所示,PDB 管理员连接到名为 hrpdb1 的 PDB。默认情况下,在该用户会话中,用户 c##dba 必须指定数据库链接才能查询 hrpdb2 中的 emp2 表。

例外情况
以下场景无需数据库链接即可访问其他 PDB 中的对象:

  1. 数据链接公用对象:所有包含指向该对象的数据链接的应用程序 PDB 均可访问。例如,应用程序容器 saas_sales_ac 的应用程序中可能包含数据链接表 usa_zipcodes,此时 CDB 公用用户 c##dba 连接到该容器中的应用程序 PDB 后,无需数据库链接即可查询 usa_zipcodes 表(实际表存储在应用程序根容器中)。

  2. 从 CDB 根容器或应用程序根容器执行包含 CONTAINERS() 子句的 SQL:通过该子句,可查询插入容器根的所有 PDB 中的数据。

创建代理 PDB 时,必须在 CREATE PLUGGABLE DATABASE ... AS PROXY 语句的 FROM 子句中指定数据库链接名称。若代理 PDB 和引用 PDB 位于不同 CDB 中,需在包含代理 PDB 的 CDB 的根容器中定义数据库链接,且该链接必须连接到远程引用 PDB 或远程 CDB 的根容器。

另请参见:“Common and Local Objects”(公用对象与本地对象)

http://www.dtcms.com/a/341466.html

相关文章:

  • Qwen Image edit的ComfyUI工作流搭建
  • vue中动态设置class类名和style样式
  • Javascript面试题及详细答案150道之(121-135)
  • 医学影像分析中的持续学习:近期进展与未来展望综述|文献速递-深度学习人工智能医疗图像
  • 42-Python基础语法-2
  • Lecture 5 GPUs课程笔记
  • Leetcode 深度优先搜索 (9)
  • Kafka-Kraft
  • leetcode3 无重复字符的最长子串
  • vue2封装日期选择组件--有时间选择版本
  • 创建Vue项目的不同方式及项目规范化配置
  • Playwright 与 Scrapy 的实际应用场景能力分析
  • 深入理解 Spring 的 @ControllerAdvice
  • 【AI应用】修改向量数据库Milvus默认密码
  • KylinV10服务器版和桌面版SVN搭建步骤
  • python中view把矩阵维度降低的时候是什么一个排序顺序
  • 深度解析LangChain:LLM应用开发利器
  • Linux: network: arp: arp_accept
  • linux内核 - 内存管理单元(MMU)与地址翻译(二)
  • 直播预告|鸿蒙全场景开发指南
  • 【GPT入门】第50课 LlamaFacotory 客观评估模型效果
  • 接美国血统(中序、后序→前序)
  • 如何让FastAPI任务系统在失败时自动告警并自我修复?
  • Frida 动态 Hook 安卓 WebView 与第三方内核完全指南
  • 一种数字相机中的自动曝光算法
  • 01-Docker概述
  • 多摄像头多算法智能监控系统设计与实现
  • 关于 preprocessing.scale 函数
  • 机器语言、操作系统与硬件执行:深入解析计算机的底层逻辑
  • 【C++】模版(初阶)