Oracle数据库19c技术架构

英文网页版见这里

Database Server

Oracle 数据库至少由一个数据库实例和一个数据库组成。 数据库实例处理内存和进程。 数据库由称为数据文件的物理文件组成,可以是非容器数据库或多租户容器数据库。 Oracle 数据库在其运行期间还使用多个数据库系统文件。

单实例数据库架构由一个数据库实例和一个数据库组成。 数据库和数据库实例之间存在一对一的关系。 多个单实例数据库可以安装在同一台服务器机器上。 每个数据库都有单独的数据库实例。 此配置对于在同一台机器上运行不同版本的 Oracle 数据库很有用。

Oracle Real Application Clusters (Oracle RAC) 数据库架构由在不同服务器计算机上运行的多个实例组成。 他们都共享同一个数据库。 服务器机器集群在一端显示为单个服务器,在另一端显示为最终用户和应用程序。 此配置专为高可用性、可伸缩性和高端性能而设计。

侦听器是一个数据库服务器进程。 它接收客户端请求,建立与数据库实例的连接,然后将客户端连接交给服务器进程。 侦听器可以在数据库服务器上本地运行,也可以远程运行。 典型的 Oracle RAC 环境是远程运行的。

Database Instance

一个数据库实例包含一组 Oracle 数据库后台进程和内存结构。 主要的内存结构是系统全局区 (SGA) 和程序全局区 (PGA)。 后台进程对数据库中存储的数据(数据文件)进行操作,并使用内存结构来完成它们的工作。 数据库实例只存在于内存中。

Oracle 数据库还创建服务器进程来代表客户端程序处理与数据库的连接,并为客户端程序执行工作; 例如,解析和运行 SQL 语句,检索结果并将结果返回给客户端程序。 这些类型的服务器进程也称为前台进程。

有关详细信息,请参阅 Oracle 数据库实例

System Global Area

系统全局区 (SGA) 是包含一个 Oracle 数据库实例的数据和控制信息的内存区域。 所有服务器和后台进程共享 SGA。 启动数据库实例时,会显示为 SGA 分配的内存量。 SGA包括以下数据结构:

  • 共享池:缓存可以在用户之间共享的各种构造; 例如,共享池存储解析后的 SQL、PL/SQL 代码、系统参数和数据字典信息。 共享池几乎涉及数据库中发生的每一个操作。 例如,如果用户执行 SQL 语句,则 Oracle 数据库访问共享池。
  • Flashback buffer:是SGA中的可选组件。 启用闪回数据库后,称为恢复写入进程 (RVWR) 的后台进程将启动。 RVWR周期性的从buffer cache中复制修改的block到flashback buffer中,并依次将Flashback buffer中的Flashback Database数据写入到Flashback Database日志中,循环复用。
  • 数据库缓冲区缓存:是存储从数据文件中读取的数据块副本的内存区域。 缓冲区是一个主内存地址,缓冲区管理器临时缓存当前或最近使用的数据块。 同时连接到数据库实例的所有用户共享对缓冲区缓存的访问。
  • 数据库智能闪存缓存:是数据库缓冲区缓存的可选内存扩展,适用于在 Solaris 或 Oracle Linux 上运行的数据库。 它为数据库块提供二级缓存。 它可以提高数据仓库 (DW) 环境中读取密集型联机事务处理 (OLTP) 工作负载以及临时查询和批量数据修改的响应时间和总体吞吐量。 Database Smart Flash Cache 驻留在一个或多个闪存盘设备上,这些设备是使用闪存的固态存储设备。 数据库智能闪存缓存通常比附加主内存更经济,并且比磁盘驱动器快一个数量级。
  • 重做日志缓冲区:是 SGA 中的一个循环缓冲区,用于保存有关对数据库所做更改的信息。 此信息存储在重做条目中。 重做条目包含重建(或重做)由数据操作语言 (DML)、数据定义语言 (DDL) 或内部操作对数据库所做的更改所必需的信息。 如有必要,重做条目用于数据库恢复。
  • 大池:是一个可选的内存区域,用于分配大于共享池的内存。 大池可以为共享服务器和 Oracle XA 接口(用于事务与多个数据库交互的地方)的用户全局区 (UGA) 提供大内存分配,用于并行执行语句的消息缓冲区,用于 Recovery Manager 的缓冲区( RMAN) I/O 从站和延迟插入。
  • In-Memory Area:是一个可选组件,它使对象(表、分区和其他类型)能够以一种称为列格式的新格式存储在内存中。 这种格式使扫描、连接和聚合的执行速度比传统的磁盘格式快得多,从而为 OLTP 和 DW 环境提供快速报告和 DML 性能。 此功能对于在几列上运行并返回多行的分析应用程序特别有用,而不是对于在几行上运行并返回多列的 OLTP。
  • Memoptimize Pool:是一个可选组件,可为基于键的查询提供高性能和可扩展性。 Memoptimize Pool包含两部分,memoptimize缓冲区和哈希索引。 快速查找使用 memoptimize 池中的哈希索引结构,提供对永久固定在缓冲区缓存中的给定表(为 MEMOPTIMIZE FOR READ 启用)的块的快速访问,以避免磁盘 I/O。 memoptimize 池中的缓冲区与数据库缓冲区缓存完全分开。 哈希索引在配置 Memoptimized Rowstore 时创建,并由 Oracle 数据库自动维护。
  • 共享 I/O 池 (SecureFiles):用于 SecureFile 大型对象 (LOB) 上的大型 I/O 操作。 LOB 是一组数据类型,旨在保存大量数据。 SecureFile 是一个允许重复数据删除、加密和压缩的 LOB 存储参数。
  • 流池:由 Oracle 流、数据泵和 GoldenGate 集成捕获和应用进程使用。 Streams 池存储缓冲的队列消息,并为 Oracle Streams 捕获进程和应用进程提供内存。 除非您专门配置它,否则流池的大小从零开始。 使用 Oracle Streams 时,池大小会根据需要动态增长。
  • Java 池:用于 Java 虚拟机 (JVM) 中所有特定于会话的 Java 代码和数据。 Java 池内存以不同的方式使用,具体取决于 Oracle 数据库运行的模式。
  • Fixed SGA:是一个内部管理区域,包含有关数据库和数据库实例状态的一般信息,以及进程之间通信的信息。

有关详细信息,请参阅系统全局区 (SGA) 概述

Program Global Area

程序全局区 (PGA) 是一个非共享内存区域,其中包含专供服务器和后台进程使用的数据和控制信息。 Oracle 数据库创建服务器进程来代表客户端程序处理与数据库的连接。 在专用服务器环境中,为每个启动的服务器和后台进程创建一个 PGA。 每个 PGA 由堆栈空间、哈希区、位图合并区和用户全局区 (UGA) 组成。 当关联的服务器或使用它的后台进程终止时,PGA 将被释放。

  • 在共享服务器环境中,多个客户端用户共享服务器进程。 UGA被移入大池中,PGA只剩下堆栈空间、散列区和位图合并区。
  • 在专用服务器会话中,PGA 由以下组件组成:
    • SQL 工作区:排序区由排序数据的函数使用,例如 ORDER BY 和 GROUP BY。
    • 会话内存:这个用户会话数据存储区是为会话变量分配的,例如登录信息和数据库会话所需的其他信息。 OLAP池管理OLAP数据页,相当于数据块。
    • 私有 SQL 区域:该区域保存有关已解析的 SQL 语句的信息和其他用于处理的特定于会话的信息。 当服务器进程执行SQL或PL/SQL代码时,进程使用私有SQL区来存储绑定变量值、查询执行状态信息和查询执行工作区。 相同或不同会话中的多个私有 SQL 区域可以指向 SGA 中的单个执行计划。 持久区域包含绑定变量值。 运行时区包含查询执行状态信息。 游标是私有 SQL 区域中特定区域的名称或句柄。 您可以将游标视为客户端的指针和服务器端的状态。 因为游标与私有 SQL 区域密切相关,所以这些术语有时可以互换使用。
    • 堆栈空间:堆栈空间是分配用于保存会话变量和数组的内存。
    • 哈希区:该区域用于执行表的哈希连接。
    • 位图合并区:该区域用于合并从多个位图索引扫描中检索到的数据。

有关详细信息,请参阅程序全局区 (PGA) 概述

Background Processes

后台进程是数据库实例的一部分,执行操作数据库和最大化多个用户性能所需的维护任务。 每个后台进程执行一个独特的任务,但与其他进程一起工作。 Oracle 数据库在您启动数据库实例时自动创建后台进程。 存在的后台进程取决于数据库中使用的功能。 当您启动数据库实例时,强制后台进程会自动启动。 您可以稍后根据需要启动可选的后台进程。

所有典型的数据库配置中都存在强制性后台进程。 这些进程默认在读/写数据库实例中运行,该实例以最低限度配置的初始化参数文件启动。 只读数据库实例会禁用其中一些进程。 强制后台进程包括进程监控进程(PMON)、进程管理进程(PMAN)、监听器注册进程(LREG)、系统监控进程(SMON)、数据库写入进程(DBWn)、检查点进程(CKPT)、可管理性监控进程( MMON)、可管理性监视器 Lite 进程 (MMNL)、恢复进程 (RECO) 和日志写入进程 (LGWR)。

大多数可选后台进程特定于任务或功能。 一些常见的可选进程包括归档进程 (ARCn)、作业队列协调进程 (CJQ0)、恢复写入进程 (RVWR)、闪回数据存档进程 (FBDA) 和空间管理协调进程 (SMCO)。

从属进程是代表其他进程执行工作的后台进程; 例如,调度程序进程 (Dnnn) 和共享服务器进程 (Snnn)。

有关后台进程的完整列表,请参阅后台进程

Shared Pool

共享池是系统全局区(SGA)的一个组成部分,负责缓存各类程序数据。 例如,共享池存储解析后的SQL、PL/SQL代码、系统参数、数据字典信息等。 共享池几乎涉及数据库中发生的每一个操作。 例如,如果用户执行 SQL 语句,则 Oracle 数据库访问共享池。

共享池分为几个子组件:

  • 库缓存:是一种共享池内存结构,存储可执行的SQL和PL/SQL代码。 此缓存包含共享 SQL 和 PL/SQL 区域和控制结构,例如锁和库缓存句柄。 执行 SQL 语句时,数据库会尝试重用以前执行过的代码。 如果库缓存中存在 SQL 语句的解析表示并且可以共享,则数据库会重用该代码。 此操作称为软解析或库缓存命中。 否则,数据库必须构建应用程序代码的新可执行版本,这称为硬解析或库缓存未命中。
  • 保留池:是共享池中的一块内存区域,Oracle 数据库可以使用它来分配大的连续内存块。 数据库从共享池中分块分配内存。 分块允许将大对象(超过 5 KB)加载到缓存中,而无需单个连续区域。 通过这种方式,数据库减少了因为碎片而耗尽连续内存的可能性。
  • 数据字典缓存:存放数据库对象的信息(即字典数据)。 此缓存也称为行缓存,因为它将数据保存为行而不是缓冲区。
  • 服务器结果缓存:是共享池内的内存池,保存结果集。 服务器结果缓存包含 SQL 查询结果缓存和 PL/SQL 函数结果缓存,它们共享相同的基础结构。 SQL 查询结果缓存存储查询结果和查询分片。 大多数应用程序都受益于这种性能改进。 PL/SQL 函数结果缓存存储函数结果集。 结果缓存的良好候选者是依赖于相对静态数据的频繁调用的函数。
  • 其他组件:包括队列、锁存器、信息生命周期管理 (ILM) 位图表、活动会话历史记录 (ASH) 缓冲区和其他次要内存结构。 排队是共享内存结构(锁),用于序列化对数据库资源的访问。 它们可以与会话或事务相关联。 示例有:控制文件事务、数据文件、实例恢复、媒体恢复、事务恢复、作业队列等。 锁存器用作低级序列化控制机制,用于保护 SGA 中的共享数据结构免受同时访问。 示例是行缓存对象、库缓存 pin 和日志文件并行写入。

有关详细信息,请参阅共享池

Large Pool

大池是一个可选的内存区域,数据库管理员可以配置它为以下对象提供大内存分配:

  • 用户全局区 (UGA):共享服务器和 Oracle XA 接口的会话内存(用于事务与多个数据库交互的地方)
  • I/O 缓冲区:I/O 服务器进程、并行查询操作中使用的消息缓冲区、Recovery Manager (RMAN) I/O 从属的缓冲区以及高级队列内存表存储
  • 延迟插入池:快速摄取功能支持将高频单行数据插入数据库,用于定义为 MEMOPTIMIZE FOR WRITE 的表。 快速摄取的插入也称为延迟插入。 它们最初缓冲在大型池中,然后在每个对象每个会话写入 1MB 后或 60 秒后由空间管理协调器 (SMCO) 和 Wxxx 从属后台进程异步写入磁盘。 在此池中缓冲的任何数据,即使已提交,也不能被任何会话(包括写入器)读取,直到 SMCO 后台进程清除。该池在内存优化表的第一个插入行的大型池中初始化。 当空间足够时,从大池中分配2G。 如果大型池中没有足够的空间,则会在内部发现并自动清除 ORA-4031。 以请求大小的一半重试分配。 如果大池中仍然没有足够的空间,则重新尝试分配 512M 和 256M,之后该功能将被禁用,直到实例重新启动。 池初始化后,大小保持不变。 它不能增长或收缩。
  • 空闲内存

大池不同于共享池中的保留空间,后者使用与从共享池分配的其他内存相同的最近最少使用 (LRU) 列表。 大型池没有 LRU 列表。 内存块被分配并且在它们被使用完之前不能被释放。

来自用户的请求是单个 API 调用,它是用户 SQL 语句的一部分。 在专用服务器环境中,一个服务器进程处理对单个客户端进程的请求。 每个服务器进程都使用系统资源,包括 CPU 周期和内存。 在共享服务器环境中,会发生以下操作:

  1. 客户端应用程序向数据库实例发送请求,该请求由调度程序接收。
  2. 调度程序将请求放在大池中的请求队列中。
  3. 该请求由下一个可用的共享服务器进程接收。 共享服务器进程检查公共请求队列中的新请求,以先进先出的方式挑选新请求。 一个共享服务器进程在队列中拾取一个请求。
  4. 共享服务器进程对数据库进行所有必要的调用以完成请求。 首先,共享服务器进程访问共享池中的库缓存来验证请求的项目; 例如,它检查表是否存在,用户是否有正确的权限,等等。 接下来,共享服务器进程访问缓冲区高速缓存以检索数据。 如果数据不存在,则共享服务器进程访问磁盘。 不同的共享服务器进程可以处理每个数据库调用。 因此,解析查询、获取第一行、获取下一行和关闭结果集的请求可能分别由不同的共享服务器进程处理。 因为不同的共享服务器进程可能会处理每个数据库调用,所以用户全局区 (UGA) 必须是共享内存区,因为 UGA 包含有关每个客户端会话的信息。 或者相反,UGA 包含有关每个客户端会话的信息,并且必须对所有共享服务器进程可用,因为任何共享服务器进程都可以处理任何会话的数据库调用。
  5. 请求完成后,共享服务器进程将响应放入大池中调用调度程序的响应队列。 每个调度程序都有自己的响应队列。
  6. 响应队列将响应发送给调度程序。
  7. 调度程序将完成的请求返回给适当的客户端应用程序。

有关详细信息,请参阅大池

Database Buffer Cache

数据库缓冲区缓存,也称为缓冲区缓存,是系统全局区(SGA)中的内存区域,用于存储从数据文件中读取的数据块的副本。 缓冲区是数据库块大小的内存块。 每个缓冲区都有一个地址,称为数据库缓冲区地址 (DBA)。 同时连接到数据库实例的所有用户共享对缓冲区缓存的访问。 缓冲区缓存的目标是优化物理 I/O 并将经常访问的块保留在缓冲区缓存中,并将不经常访问的块写入磁盘。

Oracle 数据库用户进程第一次需要特定数据时,它会在数据库缓冲区缓存中搜索数据。 如果进程发现数据已经在缓存中(缓存命中),它可以直接从内存中读取数据。 如果进程在缓存中找不到数据(缓存未命中),则在访问数据之前,它必须将数据块从磁盘上的数据文件复制到缓存中的缓冲区中。 通过缓存命中访问数据比通过缓存未命中访问数据更快。

缓存中的缓冲区由复杂的算法管理,该算法结合了最近最少使用 (LRU) 列表和触摸计数。 LRU 有助于确保最近使用的块倾向于保留在内存中,以最大限度地减少磁盘访问。

数据库缓冲区缓存由以下部分组成:

  • 默认池:是通常缓存块的位置。 默认块大小为 8 KB。 除非您手动配置单独的池,否则默认池是唯一的缓冲池。 其他池的可选配置对默认池没有影响。
  • 保留池:适用于频繁访问但由于空间不足而超出默认池的块。 keep buffer pool的目的是将指定的对象保留在内存中,从而避免I/O操作。
  • 回收池:用于不经常使用的块。 回收池可防止指定对象占用缓存中不必要的空间。
  • 非默认缓冲池:适用于使用 2 KB、4 KB、16 KB 和 32 KB 的非标准块大小的表空间。 每个非默认块大小都有自己的池。 Oracle 数据库以与默认池中相同的方式管理这些池中的块。
  • Database Smart Flash Cache(闪存缓存):允许您使用闪存设备来增加缓冲区缓存的有效大小,而无需添加更多主内存。 闪存缓存可以通过将数据库缓存中经常访问的数据存储到闪存中而不是从磁盘读取数据来提高数据库性能。 当数据库请求数据时,系统首先在数据库缓冲区缓存中查找。 如果未找到数据,系统会在数据库智能闪存缓存中查找。 如果在那里没有找到数据,它只会在磁盘存储中查找。 您必须在 Oracle Real Application Clusters 环境中的所有实例或所有实例上配置闪存缓存。
  • 最近最少使用列表 (LRU):包含指向脏缓冲区和非脏缓冲区的指针。 LRU 链表有热端和冷端。 冷缓冲区是最近未使用的缓冲区。 热缓冲区被频繁访问并且最近被使用过。 从概念上讲,只有一个LRU,但为了数据并发,数据库实际上使用了多个LRU。
  • 检查点队列
  • Flash Buffer Area:由一个DEFAULT Flash LRU Chain和一个KEEP Flash LRU Chain组成。 如果没有 Database Smart Flash Cache,当一个进程试图访问一个块并且该块不存在于缓冲区缓存中时,该块将首先从磁盘读取到内存中(物理读取)。 当内存缓冲区缓存已满时,缓冲区将根据最近最少使用 (LRU) 机制从内存中逐出。 使用数据库智能闪存,当一个干净的内存缓冲区老化时,缓冲区内容由数据库写入进程 (DBWn) 在后台写入闪存缓存,缓冲区标头作为元数据保存在内存中 DEFAULT flash 或 KEEP Flash LRU 列表,具体取决于 FLASH_CACHE 对象属性的值。 KEEP flash LRU 列表用于在单独的列表中维护缓冲区标头,以防止常规缓冲区标头替换它们。 因此,属于指定为 KEEP 的对象的闪存缓冲区标头往往会在闪存缓存中停留更长时间。 如果 FLASH_CACHE 对象属性设置为 NONE,则系统不会在闪存缓存或内存中保留相应的缓冲区。 当再次访问已经老化到内存不足的缓冲区时,系统会检查闪存缓存。 如果找到缓冲区,它会从闪存缓存中读回它,这只需要从磁盘读取时间的一小部分。 跨 Real Application Clusters (RAC) 的闪存缓存缓冲区的一致性以与 Cache Fusion 相同的方式维护。 由于闪存缓存是扩展缓存,直接路径 I/O 完全绕过缓冲区缓存,因此此功能不支持直接路径 I/O。 请注意,系统不会将脏缓冲区放入闪存缓存中,因为它可能必须将缓冲区读入内存才能为它们设置检查点,因为写入闪存缓存不计入检查点。

有关详细信息,请参阅数据库缓冲区缓存

In-Memory Area

In-Memory Area 是一个可选的 SGA 组件,它包含 In-Memory 列存储(IM column store),它使用为快速扫描优化的列格式将表和分区存储在内存中。 IM 列存储使数据能够以传统的行格式(在缓冲区缓存中)和列格式同时填充到 SGA 中。 数据库透明地将联机事务处理 (OLTP) 查询(例如主键查找)发送到缓冲区缓存,并将分析和报告查询发送到 IM 列存储。 获取数据时,Oracle 数据库还可以在同一个查询中从两个内存区域读取数据。 双格式架构不会加倍内存需求。 缓冲区缓存经过优化,可以以比数据库小得多的大小运行。

您应该只填充 IM 列存储中对性能最关键的数据。 要将对象添加到 IM 列存储,请在创建或更改对象时打开对象的 INMEMORY 属性。 您可以在表空间(针对表空间中的所有新表和视图)、表、(子)分区、实体化视图或对象中的列子集上指定此属性。

IM 列存储在优化的存储单元中管理数据和元数据,而不是在传统的 Oracle 数据块中。 内存压缩单元 (IMCU) 是一种压缩的只读存储单元,包含一个或多个列的数据。 快照元数据单元 (SMU) 包含关联 IMCU 的元数据和事务信息。 每个 IMCU 映射到一个单独的 SMU。

表达式统计存储 (ESS) 是一个存储有关表达式评估的统计信息的存储库。 ESS 驻留在 SGA 中,也持久存在于磁盘上。 启用 IM 列存储时,数据库将 ESS 用于其内存中表达式(IM 表达式)功能。 In-Memory Expression Unit (IMEU) 是物化 IM 表达式和用户定义的虚拟列的存储容器。 请注意,ESS 独立于 IM 列存储。 ESS 是数据库的永久组件,无法禁用。

从概念上讲,IMEU 是其父 IMCU 的逻辑扩展。 正如一个 IMCU 可以包含多个列一样,一个 IMEU 可以包含多个虚拟列。 每个 IMEU 映射到一个 IMCU,映射到相同的行集。 IMEU 包含其关联 IMCU 中包含的数据的表达式结果。 当 IMCU 被填充时,相关的 IMEU 也会被填充。

典型的 IM 表达式涉及一个或多个列,可能带有常量,并且与表中的行具有一对一的映射。 例如,EMPLOYEES 表的 IMCU 包含列 weekly_salary 的第 1-1000 行。 对于存储在这个 IMCU 中的行,IMEU 计算自动检测到的 IM 表达式 weekly_salary52,以及定义为 weekly_salary12 的用户定义的虚拟列 quarterly_salary。 IMCU 中的第三行向下映射到 IMEU 中的第三行。

In-Memory 区域被细分为两个池:一个 1MB 的列式数据池,用于存储填充到内存中的实际列格式数据(IMCU 和 IMEU),以及一个 64K 的元数据池,用于存储有关对象的元数据 填充到 IM 列存储中。 两个池的相对大小由内部启发式确定; 大部分 In-Memory 区域内存分配给 1MB 池。 In-Memory 区域的大小由初始化参数 INMEMORY_SIZE(默认为 0)控制,并且最小大小必须为 100MB。 从 Oracle 数据库 12.2 开始,您可以通过 ALTER SYSTEM 命令将 INMEMORY_SIZE 参数增加至少 128MB 来动态增加内存区域的大小。 请注意,不可能即时缩小内存区域的大小。

内存表在首次访问表数据或数据库启动时在 IM 列存储中分配 IMCU。 表的内存中副本是通过从磁盘格式转换为新的内存中列格式来创建的。 每次实例重新启动时都会完成此转换,因为 IM 列存储副本仅驻留在内存中。 完成此转换后,表的内存版本逐渐可供查询使用。 如果一个表被部分转换,查询可以使用部分内存中的版本并将其余部分转到磁盘,而不是等待整个表被转换。

为了响应查询和数据操作语言 (DML),服务器进程扫描列式数据并更新 SMU 元数据。 后台进程将行数据从磁盘填充到 IM 列存储中。 In-Memory Coordinator Process (IMCO) 是一个后台进程,它启动柱状数据的后台填充和重新填充。 空间管理协调器进程 (SMCO) 和空间管理工作进程 (Wnnn) 是代表 IMCO 执行实际填充和重新填充数据的后台进程。 DML 块更改写入缓冲区缓存,然后写入磁盘。 然后,后台进程根据元数据失效和查询请求将行数据从磁盘重新填充到 IM 列存储中。

您可以启用 In-Memory FastStart 功能,以将 IM 列存储中的列式数据以压缩列式格式写回数据库中的表空间。 此功能使数据库启动更快。 请注意,此功能不适用于 IMEU。 它们始终从 IMCU 动态填充。

有关详细信息,请参阅 Oracle Database In-Memory 简介

Database Data Files

数据库是一组存储用户数据和元数据的物理文件。 元数据由有关数据库服务器的结构、配置和控制信息组成。 您可以将数据库设计为多租户容器数据库 (CDB) 或非容器数据库 (non-CDB)。

一个 CDB 由一个 CDB 根容器(也称为根)、一个种子可插拔数据库(种子 PDB)、零个或多个用户创建的可插拔数据库(简称 PDB)和零个或多个应用程序容器组成。 整个 CDB 称为系统容器。 对于用户或应用程序,PDB 在逻辑上表现为独立的数据库。

CDB 根目录,名为 CDB$ROOT,包含多个数据文件、控制文件、重做日志文件、闪回日志和归档重做日志文件。 数据文件存储 Oracle 提供的元数据和公共用户(每个容器中已知的用户),它们与所有 PDB 共享。

名为 PDB$SEED 的种子 PDB 是系统提供的 PDB 模板,其中包含多个数据文件,您可以使用这些文件创建新的 PDB。

常规 PDB 包含多个数据文件,其中包含支持应用程序所需的数据和代码; 例如,人力资源应用程序。 用户仅与 PDB 交互,而不与种子 PDB 或根容器交互。 您可以在 CDB 中创建多个 PDB。 多租户架构的目标之一是每个 PDB 都与应用程序具有一对一的关系。

应用程序容器是 CDB 中 PDB 的可选集合,用于存储应用程序的数据。 创建应用程序容器的目的是拥有一个单一的主应用程序定义。 一个 CDB 中可以有多个应用程序容器。

数据库分为称为表空间的逻辑存储单元,它们共同存储所有数据库数据。 每个表空间代表一个或多个数据文件。 根容器和常规 PDB 具有 SYSTEM、SYSAUX、USERS、TEMP 和 UNDO 表空间(在常规 PDB 中是可选的)。 种子 PDB 具有 SYSTEM、SYSAUX、TEMP 和可选的 UNDO 表空间。

有关更多信息,请参阅多租户架构简介

Database System Files

以下数据库系统文件在 Oracle 数据库运行期间使用并驻留在数据库服务器上。 需要注意的是,数据文件是属于数据库容器的物理文件,这里不做赘述。

  • 控制文件:控制文件是存储有关数据文件和联机重做日志文件的元数据的必需文件; 例如,他们的姓名和状态。 数据库实例需要此信息才能打开数据库。 控制文件还包含在数据库未打开时必须可访问的元数据。 强烈建议您在数据库服务器中制作多个控制文件副本以实现高可用性。
  • 参数文件:这个必需的文件定义了数据库实例在启动时如何配置。 它可以是初始化参数文件 (pfile) 或服务器参数文件 (spfile)。
  • 联机重做日志文件:这些必需的文件在数据库发生更改时存储这些更改,并用于数据恢复。
  • 自动诊断存储库 (ADR):ADR 是一个基于文件的存储库,用于存储数据库诊断数据,例如跟踪、转储、警报日志、运行状况监视器报告等。 它具有跨多个实例和多个产品的统一目录结构。 数据库、Oracle 自动存储管理 (Oracle ASM)、监听器、Oracle 集群件和其他 Oracle 产品或组件将所有诊断数据存储在 ADR 中。 每个产品的每个实例都将诊断数据存储在 ADR 中自己的主目录下。
  • 备份文件:这些可选文件用于数据库恢复。 当介质故障或用户错误损坏或删除了原始文件时,您通常会恢复备份文件。
  • 归档重做日志文件:这些可选文件包含数据库实例生成的数据更改的持续历史记录。 使用这些文件和数据库备份,您可以恢复丢失的数据文件。 也就是说,归档日志可以恢复已恢复的数据文件。
  • 密码文件:此可选文件使使用 SYSDBA、SYSOPER、SYSBACKUP、SYSDG、SYSKM、SYSRAC 和 SYSASM 角色的用户能够远程连接到数据库实例并执行管理任务。
  • 钱包:对于应用程序使用密码凭证连接到数据库的大规模部署,可以将此类凭证存储在客户端 Oracle 钱包中。 Oracle wallet 是一个安全的软件容器,用于存储身份验证和签名凭证。 可能的钱包包括用于用户凭证的 Oracle 钱包、用于透明数据加密 (TDE) 的加密钱包和用于数据库备份云模块的 Oracle 公共云 (OPC) 钱包。 钱包是可选的,但建议使用。
  • 块更改跟踪文件:块更改跟踪通过在块更改跟踪文件中记录更改的块来提高增量备份的性能。 在增量备份期间,Oracle Recovery Manager (RMAN) 不是扫描所有数据块来识别哪些块已更改,而是使用此文件来识别需要备份的已更改块。 块更改跟踪文件是可选的。
  • 闪回日志:闪回数据库在效果上类似于传统的时间点恢复。 它使您能够将数据库恢复到最近某个时间的状态。 闪回数据库使用自己的日志记录机制,创建闪回日志并将它们存储在快速恢复区中。 仅当闪回日志可用时才能使用闪回数据库。 要利用此功能,您必须提前设置数据库以创建闪回日志。 闪回日志是可选的。

控制文件、联机重做日志文件和归档重做日志文件可以多路复用,这意味着可以在不同的位置自动维护两个或多个相同的副本。

数据库启动需要控制文件、参数文件和联机重做日志文件。 有关详细信息,请参阅物理存储结构

Application Containers

应用程序容器是一个可选的、用户创建的 CDB 组件,用于存储应用程序 PDB 的数据和元数据。 CDB 可以包含零个或多个应用程序容器。 一个应用程序容器由一个应用程序根和一个或多个应用程序 PDB 组成,这些 PDB 插入到 CDB 根中。 应用程序根属于 CDB 根,不属于任何其他容器,存储公共元数据和数据。

典型的应用程序安装应用程序公共用户、元数据链接的公共对象和数据链接的公共对象。 您可以在一个应用程序容器中创建多个与销售相关的 PDB,这些 PDB 共享一个由一组通用表和表定义组成的应用程序后端。

应用程序根目录、应用程序种子和应用程序 PDB 各有一个 SYSTEM、SYSAUX、TEMP、USERS 和可选的 UNDO 表空间。 每个表空间代表一个或多个数据文件。

有关详细信息,请参阅关于应用程序容器

Automatic Diagnostic Repository (ADR)

自动诊断存储库 (ADR) 是用于数据库诊断数据的系统范围的跟踪和日志记录中央存储库。 它包括以下项目:

  • 后台跟踪文件:每个数据库后台进程都可以写入关联的跟踪文件。 当进程检测到内部错误时,进程会将有关错误的信息转储到其跟踪文件中。 写入跟踪文件的一些信息供数据库管理员使用,而其他信息则供 Oracle 支持服务使用。 通常,数据库后台进程跟踪文件名包含 Oracle 系统标识符 (SID)、后台进程名称和操作系统进程号。 RECO 过程的跟踪文件示例是 mytest_reco_10355.trc。
  • 前台跟踪文件:每个服务器进程都可以写入关联的跟踪文件。 当进程检测到内部错误时,进程会将有关错误的信息转储到其跟踪文件中。 服务器进程跟踪文件名包含 Oracle SID、字符串 ora 和操作系统进程号。 服务器进程跟踪文件名的示例是 mytest_ora_10304.trc。
  • 转储文件:诊断转储文件是一种特殊类型的跟踪文件,其中包含有关状态或结构的详细时间点信息。 转储文件通常是响应事件的一次性诊断数据输出,而跟踪文件往往是诊断数据的连续输出。
  • 健康监视器报告:Oracle 数据库包括一个称为健康监视器的框架,用于对数据库运行诊断检查。 运行状况检查可检测文件损坏、物理和逻辑块损坏、撤消和重做损坏、数据字典损坏等。 运行状况检查会生成有关其发现的报告,并且在许多情况下会生成解决问题的建议。
  • 事件包:对于将诊断数据上传到 Oracle Support 的自定义方法,您首先将数据收集到称为事件包(package)的中间逻辑结构中。 数据包是存储在 ADR 中的元数据集合,指向 ADR 内外的诊断数据文件和其他文件。 创建包时,您可以选择一个或多个问题添加到包中。 Support Workbench 随后会自动将与所选问题关联的问题信息、事件信息和诊断数据(例如跟踪文件和转储)添加到包中。
  • 事件转储:当事件发生时,数据库将一个或多个转储写入为事件创建的事件目录。 事件转储还在文件名中包含事件编号。
  • 警报日志文件:数据库的警报日志是按时间顺序排列的消息和错误日志。 Oracle 建议您定期查看警报日志。
    有关详细信息,请参阅自动诊断存储库

Backup Files

数据库备份可以是物理的也可以是逻辑的。

  • 物理备份是物理数据库文件的副本。 您可以使用 Recovery Manager (RMAN) 或操作系统实用程序进行物理备份。
  • 逻辑备份包含表、存储过程和其他逻辑数据。 您可以使用 Oracle 数据库实用程序(例如数据泵导出)提取逻辑数据,并将其存储在二进制文件中。 逻辑备份可以补充物理备份。

RMAN 创建的数据库备份存储为映像副本或备份集。

  • 映像副本是数据文件、控制文件或归档重做日志文件的逐位、磁盘副本。 您可以使用操作系统实用程序或 RMAN 创建物理文件的映像副本,并使用任一工具来恢复它们。 映像副本对磁盘很有用,因为您可以增量更新它们并就地恢复它们。
  • 备份集是由 RMAN 创建的一种专有格式,包含来自一个或多个数据文件、归档重做日志文件、控制文件或服务器参数文件的数据。 备份集的最小单位是称为备份片的二进制文件。 备份集是 RMAN 可以将备份写入顺序设备(如磁带机)的唯一形式。 备份集的优点之一是 RMAN 使用未使用的块压缩来节省备份数据文件的空间。 只有数据文件中曾经用于存储数据的块才会包含在备份集中。 备份集也可以被压缩、加密、发送到磁带,并使用数据文件副本无法使用的高级未使用空间压缩。

RMAN 可以与介质管理库 (MML) 或系统备份到磁带 (SBT) 软件连接,后者可以创建备份到磁带、Oracle 数据库备份云服务或零数据丢失恢复设备(通常称为恢复设备)。

有关详细信息,请参阅:

Process Monitor Process (PMON)

Process Monitor Process (PMON) 是一个后台进程,它定期扫描所有进程以发现任何异常死亡的进程。 然后 PMON 负责协调清理主进程 (CLMN) 和清理从属进程从属进程 (CLnn) 执行的清理。

PMON 作为操作系统进程而不是线程运行。 除了数据库实例之外,PMON 还运行在 Oracle 自动存储管理 (ASM) 实例和 Oracle ASM 代理实例上。

有关后台进程的完整列表,请参阅后台进程

Process Manager Process (PMAN)

Process Manager Process (PMAN) 是一个后台进程,它根据需要监视、生成和停止以下操作:

  • 调度程序和共享服务器进程
  • 数据库驻留连接池的连接代理和池化服务器进程
  • 作业队列进程
  • 可重启的后台进程

PMAN 作为操作系统进程而不是线程运行。 除了数据库实例,PMAN 还运行在 Oracle 自动存储管理 (ASM) 实例和 Oracle ASM 代理实例上。

有关后台进程的完整列表,请参阅后台进程

Listener Registration Process (LREG)

侦听器注册进程 (LREG) 是一个后台进程,用于通知侦听器有关实例、服务、处理程序和端点的信息。

LREG 可以作为线程或操作系统进程运行。 除了数据库实例,LREG 还运行在 Oracle 自动存储管理 (ASM) 实例和 Oracle Real Application Clusters (RAC) 上。

有关后台进程的完整列表,请参阅后台进程

System Monitor Process (SMON)

系统监控进程 (SMON) 是一个执行许多数据库维护任务的后台进程,包括以下内容:

  • 创建和管理临时表空间元数据,并回收孤立临时段使用的空间
  • 根据撤消空间使用统计信息,通过上线、下线和收缩撤消段来维护撤消表空间
  • 在数据字典处于瞬态和不一致状态时清理数据字典
  • 维护系统更改号 (SCN) 到用于支持 Oracle 闪回功能的时间映射表

SMON 对后台活动期间出现的内部和外部错误具有弹性。 SMON 可以作为线程或操作系统进程运行。 在Oracle Real Application Clusters (RAC) 数据库中,一个实例的SMON 进程可以对其他失败的实例进行实例恢复。

有关后台进程的完整列表,请参阅后台进程

Database Writer Process (DBWn)

Database Writer Process (DBWn) 是一个后台进程,主要将数据块写入磁盘。 它还处理检查点、文件打开同步和块写入记录的日志记录。 配置闪存时,DBWn 还会写入数据库智能闪存(闪存)。

在许多情况下,DBWn 写入的块分散在整个磁盘中。 因此,写入往往比日志写入进程 (LGWR) 执行的顺序写入要慢。 DBWn 尽可能执行多块写入以提高效率。 多块写入中写入的块数因操作系统而异。

DB_WRITER_PROCESSES 初始化参数指定数据库写入进程的数量。 可以有 1 到 100 个数据库写入进程。 前 36 个数据库写入进程的名称是 DBW0-DBW9 和 DBWa-DBWz。 第 37 到第 100 个数据库写入进程的名称是 BW36-BW99。 数据库为 DB_WRITER_PROCESSES 参数选择适当的默认设置,或根据 CPU 和处理器组的数量调整用户指定的设置。

有关后台进程的完整列表,请参阅后台进程

Checkpoint Process (CKPT)

检查点进程 (CKPT) 是一个后台进程,它在特定时间通过向数据库写入进程 (DBWn) 发送消息以开始写入脏缓冲区来启动检查点请求。 在完成单个检查点请求后,CKPT 更新数据文件头和控制文件以记录最近的检查点。

CKPT 每三秒检查一次内存量是否超过 PGA_AGGREGATE_LIMIT 初始化参数的值,如果是,则采取行动。

CKPT 可以作为线程或操作系统进程运行。 除了数据库实例之外,CKPT 还运行在 Oracle 自动存储管理 (ASM) 实例上。

有关后台进程的完整列表,请参阅后台进程

Manageability Monitor Process (MMON) and Manageability Monitor Lite Process (MMNL)

Manageability Monitor Process (MMON) 和 Manageability Monitor Lite Process (MMNL) 是执行与自动工作负载存储库 (AWR) 相关任务的后台进程。 AWR 是历史性能数据的存储库,其中包括系统、会话、单个 SQL 语句、段和服务的累积统计信息。 它用于问题检测和自调整目的。

MMON 从 SGA 收集各种内存统计信息,过滤它们,然后每 60 分钟在自动工作负载存储库 (AWR) 中创建这些统计信息的快照。 60 分钟是默认值,可以更改。 它还执行自动数据库诊断监视器 (ADDM) 分析并针对超过阈值的指标发出警报。

MMNL 收集会话统计信息(例如用户 ID、状态、机器和它正在执行的 SQL)并将它们存储在活动会话历史记录 (ASH) 缓冲区中。 具体来说,MMNL 在 SGA 中每秒对 VSESSION 和 VSESSION_WAIT 视图进行采样,然后将该数据记录在 V$ACTIVE_SESSION_HISTORY 视图中。 不对非活动会话进行采样。 ASH 被设计为内存中的滚动缓冲区,因此,在需要时会覆盖较早的信息。 当 ASH 缓冲区变满或 MMON 拍摄快照时,MMNL 将 ASH 缓冲区刷新(清空)到 AWR 中的 DBA_HIST_ACTIVE_SESS_HISTORY 视图中。 因为空间很昂贵,每 10 个条目中只有一个被刷新。 MMNL 还计算指标。

MMON 和 MMNL 都可以作为线程或操作系统进程运行。 除了数据库实例之外,MMON 和 MMNL 还运行在自动存储管理 (ASM) 实例上。

有关详细信息,请参阅:

有关后台进程的完整列表,请参阅后台进程

Recoverer Process (RECO)

Recoverer Process (RECO) 是一个后台进程,用于解决由于分布式数据库中的网络或系统故障而挂起的分布式事务。

RECO 可以作为线程或操作系统进程运行。

有关后台进程的完整列表,请参阅后台进程

Log Writer Process (LGWR)

日志写入进程 (LGWR) 是一个后台进程,它按顺序将重做日志条目写入重做日志文件。 重做日志条目在系统全局区 (SGA) 的重做日志缓冲区中生成。 如果数据库有一个多路复用的重做日志,那么 LGWR 会将相同的重做日志条目写入重做日志文件组的所有成员。

LGWR 处理速度非常快或必须协调的操作,并将操作委托给可以从并发操作中受益的日志写入器辅助进程 (LGnn),主要是将重做从日志缓冲区写入重做日志文件并发布 已完成写入正在等待的前台进程。

重做传输从属进程 (TT00-zz) 将重做从当前在线和备用重做日志发送到为异步 (ASYNC) 重做传输配置的远程备用目的地。

LGWR 可以作为线程或操作系统进程运行。 除了数据库实例,LGWR 还运行在 Oracle ASM 实例上。 Oracle Real Application Clusters (RAC) 配置中的每个数据库实例都有自己的一组重做日志文件。

有关后台进程的完整列表,请参阅后台进程

Archiver Process (ARCn)

Archiver Processes (ARCn) 是仅当数据库处于 ARCHIVELOG 模式并启用自动归档时才存在的后台进程,在这种情况下,ARCn 会自动归档联机重做日志文件。 日志写入进程 (LGWR) 在归档之前无法重用和覆盖联机重做日志组。

数据库根据需要启动多个归档进程,以确保已满联机重做日志的归档不落后。 可能的进程包括 ARC0-ARC9 和 ARCa-ARCt(31 个可能的目的地)。

LOG_ARCHIVE_MAX_PROCESSES 初始化参数指定数据库最初调用的 ARCn 进程数。 如果您预计归档工作量很大,例如在批量加载数据期间,您可以增加归档进程的最大数量。 也可以有多个归档日志目的地。 建议每个目的地至少有一个归档进程。

ARCn 可以作为线程或操作系统进程运行。

有关后台进程的完整列表,请参阅后台进程

Job Queue Coordinator Process (CJQ0)

作业队列协调器进程 (CJQ0) 是一个后台进程,它从数据字典中选择需要运行的作业并生成作业队列从属进程 (Jnnn) 来运行这些作业。 CJQ0 由 Oracle 调度程序根据需要自动启动和停止。 JOB_QUEUE_PROCESSES 初始化参数指定可以为执行作业创建的最大进程数。 CJQ0 仅根据要运行的作业数和可用资源的数量启动作业队列进程。

作业队列从属进程 (Jnnn) 执行作业协调器分配的作业。 当选择一个作业进行处理时,作业从机执行以下操作:

  • 收集运行作业所需的所有元数据,例如程序参数和权限信息。
  • 作为作业的所有者启动数据库会话,启动事务,然后开始执行作业。
  • 作业完成后,从服务器提交并结束事务。
  • 关闭会话。

工作完成后,奴隶会执行以下操作:

  • 如果需要,重新安排工作
  • 更新作业表中的状态以反映作业是否已完成或计划再次运行
  • 在作业日志表中插入一个条目
  • 更新运行计数,如有必要,更新失败和重试计数
  • 清理
  • 寻找新工作(如果没有,他们就去睡觉)

CJQ0 和 Jnnn 都可以作为线程或操作系统进程运行。

有关后台进程的完整列表,请参阅后台进程

Recovery Writer Process (RVWR)

Recovery Writer Process (RVWR) 是一个后台进程,用于闪回整个数据库。 也就是说,如果您有所需的闪回日志,它会撤消从数据库当前状态到过去某个时间的事务。 当启用闪回或有保证的还原点时,RVWR 将闪回数据写入快速恢复区中的闪回数据库日志。

RVWR 可以作为线程或操作系统进程运行。

有关后台进程的完整列表,请参阅后台进程

Flashback Data Archiver Process (FBDA)

闪回数据归档进程 (FBDA) 是一个后台进程,它提供了在表的生命周期内跟踪和存储事务更改的能力。 这样,您可以及时闪回表以恢复它们原来的样子。

当修改跟踪表的事务提交时,FBDA 检查正在生成的新撤消,过滤与标记为存档的对象相关的内容,并将撤消信息复制到闪回数据存档表空间中。 FBDA 维护当前行的元数据并跟踪已归档的数据量。

FBDA 还负责自动管理空间、组织(分区表空间)和保留的闪回数据存档。 FBDA 还跟踪跟踪交易的归档进度。

FBDA 可以作为线程或操作系统进程运行。

有关后台进程的完整列表,请参阅后台进程

Space Management Coordinator Process (SMCO)

空间管理协调进程 (SMCO) 是一个后台进程,用于调度各种空间管理任务的执行,包括主动空间分配和空间回收。 SMCO 动态生成空间管理从属进程 (Wnnn) 来执行这些任务。 请注意,内存中协调器进程 (IMCO) 是一个后台进程,它启动后台填充和柱状数据的重新填充。

Wnnn 从属进程代表空间管理和 Oracle In-Memory 选项执行工作。

  • Wnnn 进程是由 SMCO 动态生成的从属进程,用于在后台执行空间管理任务。 这些任务包括根据空间使用增长分析将空间预分配到本地管理的表空间和 SecureFiles 段,以及从删除的段中回收空间。 这些任务还包括快速摄取延迟插入。 启动后,从站充当自治代理。 完成任务执行后,它会自动从队列中选取另一个任务。 该进程在长时间空闲后自行终止。
  • Wnnn 进程填充和重新填充内存中启用的对象。 In-Memory Coordinator Process (IMCO) 启动背景填充和柱状数据的重新填充。 IMCO 后台进程和前台进程将利用 Wnnn slaves 进行填充和重新填充。 IMCO 使用 Wnnn 进程来预填充内存中启用的优先级为低/中/高/关键的对象,并重新填充内存中的对象。 在 Wnnn 从站上运行的内存中填充和重新填充任务也从前台进程启动,以响应引用内存中启用对象的查询和 DML。

SMCO 和 Wnnn 都可以作为线程或操作系统进程运行。

有关后台进程的完整列表,请参阅后台进程

Dispatcher Process (Dnnn) and Shared Server Process (Snnn)

在共享服务器架构中,客户端连接到 Dispatcher Process (Dnnn),它为每个连接创建一个虚拟电路。 当客户端向服务器发送数据时,调度程序将数据接收到虚拟电路中,并将活动电路放在公共队列中,以供空闲的共享服务器进程 (Snnn) 拾取。 然后 Snnn 从虚拟电路中读取数据并执行完成请求所需的数据库工作。 当Snnn 必须向客户端发送数据时,Snnn 将数据写回虚电路,Dnnn 将数据发送给客户端。 Snnn 完成客户端请求后,将虚电路释放回 Dnnn,可以自由处理其他客户端。

Snnn 和 Dnnn 都可以作为线程或操作系统进程运行。 除了数据库实例,Dnnn 还运行在共享服务器上。

有关 Dnnn 和 Snnn 如何与 Large Pool 交互的信息,请参阅 Large Pool 幻灯片。 有关后台进程的完整列表,请参阅后台进程

相关推荐
java_python源码4 小时前
springboot+vue智慧小区管理系统(源码+文档+调试+基础修改+答疑)
数据库·oracle
dingdingfish8 小时前
Oracle数据库21c技术架构
oracle·database·architecture·21c·technical
liux35288 小时前
从零开始学MySQL:入门基础篇(一)
数据库·mysql·oracle
知识分享小能手9 小时前
Oracle 19c入门学习教程,从入门到精通,PL/SQL 编程详解:语法、使用方法与综合案例(6)
sql·学习·oracle
一个响当当的名号10 小时前
lectrue2 高级SQL
数据库·oracle
一步一个脚印11 小时前
Oracle LONG类型与CLOB类型的比较与转换
数据库·oracle
WilliamHu.11 小时前
智能体项目实战
数据库·oracle
霍格沃兹测试学院-小舟畅学12 小时前
Playwright数据库断言:测试前后数据验证
数据库·oracle
亲爱的非洲野猪12 小时前
Apache Cassandra完全指南:架构、原理与生产实践深度解析
架构·apache·database·cassandra