跳转到内容

Oracle 和 DB2,比较和兼容性/架构/Oracle

来自 Wikibooks,开放世界中的开放书籍

Oracle 存储模型

[编辑 | 编辑源代码]

构成磁盘上物理数据库的主要结构是


• 数据文件

• 控制文件

• 撤销日志

• 临时文件

Oracle 数据库磁盘结构


数据文件保存数据、索引、撤销段和临时数据。数据和索引可以存储在不同的文件或同一个数据文件中。

控制文件包含数据库的结构。控制文件是一个二进制文件,每个数据库至少应有 3 个(出于冗余目的)。控制文件看起来完全相同,它们应该位于不同的驱动器和控制器上。控制文件的内容包括数据库名称、创建日期以及所有数据文件和每个数据库的检查点信息的规范路径。它们用于挂载数据库、打开数据库以及访问数据库。它们在数据库需要恢复时存储同步数据。

撤销/重做日志有 3 个主要组件。


• 所有 DML(插入、选择、更新和删除)。对索引和表所做的所有更改都存储在此处。

• 所有 DDL(即创建、删除、修改)

• 所有提交


联机撤销日志是数据库中所有更改的记录。因为这些文件对于在恢复时维护数据库完整性至关重要,所以每个撤销日志文件都被复制,并且信息被写入两个成员(多路复用)。然后,日志文件被组织成组,因此,当一组日志文件填满时,Oracle 会执行检查点和日志切换,之后,组中的下一组文件将被写入。每个数据库至少会有两组日志文件组,但可能会有更多(最多 255 组)。日志文件循环写入,当一组日志文件填满时,将写入系列中的下一组文件。这些文件应该位于不同的驱动器和控制器上(同样,为了冗余)。当写入系列中的最后一组文件时,该过程将从系列中的第一组文件重新开始。通过在日志文件填满时对其进行归档可以获得额外的安全级别,以便在再次写入它们时不会覆盖任何数据 - 这称为在归档日志 (ARCHIVELOG) 模式下运行。您需要确保有足够的存储空间来保存已归档的日志文件,因为如果数据库尝试归档到已满的目录,则会挂起。

上面提到的 3 种结构,重做/撤销日志文件、控制文件和数据文件,以及在数据库操作期间创建的临时文件共同定义了数据库。

在数据库本身之外是服务器参数文件 (SP 文件)。这是一个使用 ALTER SYSTEM 命令维护的二进制文件。此文件中大约有 300 个参数。还有由 ORAPWD 维护的 Oracle 密码文件。

Oracle 内存模型

[编辑 | 编辑源代码]

Oracle 以三种不同的块管理内存。如果我们认为内存是从“顶向下”组织的,那么在最上面是为数据库实例和后台进程分配的内存 - 共享全局区域 (SGA)。SGA 是一个包含一个 Oracle 数据库实例的数据和控制信息的共享内存结构集合。每个数据库实例都有一个 SGA,当实例启动时,缓冲区将在其中分配。SGA 应适合真实内存,以避免内存分页。它在 DBMS 启动时分配(启动),并在停止时释放(关闭)。它是 SGA 和针对这些结构运行的进程,被称为数据库实例。

在它下面,为每个服务器和后台进程分配了内存,即程序全局区域 (PGA)。每个 PGA 在服务器进程启动时在非共享内存中分配,它包含服务器进程的数据和控制信息。这意味着对 PGA 的访问仅限于该服务器进程。当使用术语实例 PGA 时,它指的是所有正在使用的单个内存段,即使它们不可共享。

对于每段代码,无论是 Oracle 数据库代码还是用户代码,都有一个软件代码区域 (SCA)。Oracle 数据库代码和用户代码存储在不同的内存位置,Oracle 代码隔离在一个更安全的位置。

因此,从上到下,我们有


• 共享全局区域(每个 DBMS 实例一个)

• 程序全局区域(每个服务器和后台进程一个)

• 软件代码区域(每个 Oracle 或用户程序一个)

Oracle 内存模型的主要区域


Oracle 系统全局区域

[编辑 | 编辑源代码]
Oracle 系统全局区域


系统全局区域中的主要内存池是


• 缓冲区缓存

• 共享池

• 重做缓冲区

• 大型池

• Java 池

• 流池


缓冲区缓存

[编辑 | 编辑源代码]

缓冲区缓存对连接到 Oracle 实例的所有用户可见。数据库缓冲区缓存包含四个主要段 - 数据、索引(以及带有索引的数据)、撤销日志和临时文件。临时文件是在内存中构建的用于保存瞬态数据的结构,例如排序的中间结果。因为缓冲池保存从磁盘读取的块,所以如果缓冲池块大小是操作系统块大小的倍数,则效率最高。对于执行大量磁盘 I/O 的应用程序,例如联机事务处理 (OLTP) 应用程序,数据库缓冲池也必须足够大。

Oracle 使用缓冲区缓存的方式是,当它需要一个数据块时,它首先查找缓冲区缓存,因为 a) 内存读取比磁盘读取更快,并且 b) Oracle 努力将最常用的数据和最有可能使用的数据保存在内存中。如果数据不存在于缓冲区缓存中,那么 Oracle 将从稳定存储(磁盘)读取所需数据。读取数据后,它会被放置到缓冲区缓存中,以便对相同数据的任何后续访问都能利用缓存的数据。

缓冲区缓存被组织成两个区域,写入列表和最近最少使用 (LRU) 列表。写入列表保存等待写入磁盘的已修改块。由于磁盘 I/O 代价很高,因此块不会在修改后立即刷新到磁盘,而是收集在写入列表中,作为一次更便宜的写入的候选,该写入可以一次移动多个块(延迟写入)。

LRU 列表保存空缓冲区(空闲缓冲区)、正在使用的缓冲区(称为“固定缓冲区”,因为它们固定在内存中以防止在使用期间被驱逐),以及等待移至写入列表的脏(修改)缓冲区。当进程访问缓冲区时,缓冲区将被移至 LRU 列表的末尾,该末尾恰如其分地称为最近使用端。这个将缓冲区通过 LRU 列表迁移以供访问的过程意味着那些不常访问的缓冲区将移动到最不常用端,并成为 LRU 算法从缓存中驱逐的候选者。由于希望将最常访问的数据保留在共享内存中(即数据、索引、SQL 语句和查询计划),因此当存在一组持续访问且将被固定在内存中且不会写入磁盘的数据集时,会出现一种情况。为了确保此数据被写入磁盘(以保持持久性)并在撤销日志中保存,有一个定期运行的检查点进程 (CKPT) 来执行此操作,方法是向数据库写入进程 (DBW0、DBW1 等...) 发出信号(为了效率,可以有多个数据库写入程序,我们将在后面看到)。


了解了缓冲区的组织方式后,进程使用缓冲区缓存的方式是,首先在缓冲区缓存中搜索数据。当在缓冲区缓存中找到所需数据时,这称为“缓存命中”。在“缓存未命中”情况下,必须从磁盘读取所需数据。在缓存未命中时,Oracle 将从 LRU 列表的最不常用端开始搜索空闲缓冲区,并将其遇到的任何脏缓冲区移至写入列表。该进程将继续搜索,直到找到空闲缓冲区或到达列表的 MRU 端。如果该进程找到了空闲缓冲区,它将从磁盘将所需的数据块读取到缓冲区中,然后将缓冲区移至列表的 MRU 端。如果没有可用的空闲缓冲区,该进程将向数据库写入进程发出信号以将修改后的缓冲区写入磁盘。

共享池

[edit | edit source]

共享池是 SGA 的主要组成部分,它包含许多结构,主要结构如下所示。这些结构的一个示例是用于保存已解析 SQL 语句的区域。这些语句定期加载和卸载到内存中,因此需要内存分配和释放。为了管理共享池内存,使用类似于缓冲池中的 LRU 算法。

此算法即使在创建它们的进程终止后也会在共享池中维护经常访问的项。与缓冲池 LRU 算法类似,数据库服务器将检查共享池以查找提交执行的任何 SQL 语句的现有已解析实例。如果找到,它将被使用。如果没有,将在共享池中分配一个新的 SQL 区域,并且一旦 SQL 被解析并构建执行计划,它将被使用。如果 SQL 区域中的结构引用的数据库对象被修改,则 SQL 区域将被失效,这将导致该语句在下次运行时被重新解析和加载。

共享池由以下部分组成:


• 库缓存

• 结果缓存

• 字典缓存


库缓存
[edit | edit source]

库缓存是所有并发用户都可以使用的实例级内存结构。它保存共享和私有 SQL 区域、PL/SQL 过程和包。

共享 SQL 区域和私有 SQL 区域
[edit | edit source]

共享 SQL 区域用于用户进程 SQL 语句,并且根据定义,许多用户进程可以共享此代码。在某些情况下,例如共享服务器配置(下面提到)和 PL/SQL 代码块,其中有关正在执行的 SQL 单元的的信息需要隔离以防止并发用户踩到彼此的包变量,这些单元使用私有 SQL 区域。每个在实例中运行的 SQL 语句都有一个共享 SQL 区域和一个私有 SQL 区域。SQL 区域包含 SQL 语句的解析树和执行计划。每次解析 SQL 语句时,数据库服务器都会分配内存,这种分配是动态的,基于 SQL 语句的大小和复杂性。如果 SQL 区域被释放,则 SQL 语句将在下次执行时被重新解析。这样,数据库可以减少频繁执行的 SQL 的解析开销。这是可能的,因为 SQL 往往很少更改。由于所有实例用户都可以使用单个共享 SQL 语句,因此这也可以节省内存。

在共享服务器配置中,许多用户进程可以共享少量服务器进程,有效地增加了实例的并发用户数量。实现这一点的方法是,用户进程连接到调度程序,调度程序通过公共队列在共享的空闲服务器进程池中为用户进程请求进行代理。但是,在这种情况下,每个用户都必须拥有语句的私有 SQL 区域的单独副本。

PL/SQL 程序单元和共享池
[edit | edit source]

PL/SQL 语句(函数、触发器、过程、包和匿名块)的处理方式类似于单个 SQL 语句。共享 SQL 区域保存已解析的语句,私有 SQL 区域保存特定于执行 PL/SQL 块的用户进程的信息,例如局部和全局变量、包变量和 SQL 缓冲区。这样,每个运行 PL/SQL 程序单元的用户都会使用相同的共享 SQL 区域,但在私有 SQL 区域中保留特定于其会话的值。

结果缓存
[edit | edit source]

结果缓存由两个区域组成:SQL 查询结果缓存和 PL/SQL 函数结果缓存。

SQL 查询结果缓存和 PL/SQL 函数结果缓存

这些区域用于保存已执行的 SQL 语句和 PL/SQL 函数的结果以供后续重复使用。可以使用参数设置来控制它们的使用,该参数设置可以打开此功能,或者可以使用 SQL 中的提示。如果结果缓存引用了被更改的对象,则数据库将使结果集失效,以使后续查询或函数不会返回过时信息 - 它们将再次运行以刷新缓存。

字典缓存
[edit | edit source]

数据字典是包含有关数据库、其结构及其用户的参考信息的数据库表和视图的集合。Oracle 数据库在解析 SQL 语句期间经常访问数据字典。此访问对于 Oracle 数据库的持续运行至关重要。Oracle 数据库如此频繁地访问数据字典,以至于内存中被指定了两个特殊位置来保存字典数据。一个区域称为数据字典缓存,也称为行缓存,因为它以行的形式保存数据,而不是缓冲区(缓冲区保存完整的数据块)。内存中用于保存字典数据的另一个区域是库缓存。所有 Oracle 数据库用户进程都共享这两个缓存以访问数据字典信息。

重做缓冲区

[edit | edit source]

重做日志缓冲区存储有关通过 INSERT、UPDATE、DELETE、CREATE、ALTER 或 DROP 操作对数据库进行的更改的信息,作为重做条目。条目是从用户的内存副本中添加到重做日志缓冲区的。这些条目用于在发生恢复时重建数据库。由于条目对于维护数据库的一致性非常重要,因此它们也会由日志写入程序 (LGWR) 进程写入磁盘上的活动重做日志组。由于重做缓冲区被写入磁盘,因此重做日志缓冲区会循环覆盖 - 当进程到达重做日志缓冲区的末尾时,它会从开头继续写入。因此,重做日志缓冲区在内存中分配为一个连续空间。

大池

[edit | edit source]

大池是可选区域,可以在 SGA 中为需要大量内存的进程和操作分配。例如,在前面提到的共享服务器配置中,跨多个数据库的事务可以使用大池来保存这些事务的共享 SQL,而不是共享 SQL 区域。大池更适合用于需要大量内存的定期数据库维护实用程序(例如备份和恢复)、服务器 I/O 进程和并行操作的缓冲区(其中查询被分解为单独的单元并同时执行)。在这些情况下,大池可以防止这些内存密集型进程影响共享池。

Java 池

[edit | edit source]

Java 池保存 Java 代码和数据以用于 Java 虚拟机 - 本质上是用户编写的 Java 程序和数据。

流池

[edit | edit source]

Oracle Streams 是一个内置的数据库复制功能,用于在数据库之间或单个数据库内传播数据、事务和事件流。Streams 通过“捕获”信息、将其排队为消息,然后在其他地方“应用”该信息来工作。Streams 在复制中用于捕获数据库更改并在其他地方应用它们,但 Streams 可用于传播数据库中的任何其他信息。Streams 池保存缓冲的队列消息,并为 Streams 捕获和应用进程分配内存。

Oracle 程序全局区

[编辑 | 编辑源代码]
Oracle 程序全局区


程序全局区 (PGA) 是为每个服务器进程分配的内存,它包含两个区域:会话内存和私有 SQL 区域。PGA 的内容会有所不同,具体取决于共享服务器的运行位置。持久区域用于存储有关绑定变量的信息,在共享服务器操作中保存在 SGA 中。对于专用服务器操作,持久区域保存在 PGA 中。

会话内存是保存会话相关变量(如登录信息)的位置。如果服务器是专用服务器,会话内存是私有的,如果服务器是共享的,会话内存也是共享的。

私有 SQL 区域

私有 SQL 区域在 SGA 和 PGA 之间存在使用重叠。私有 SQL 区域在 PGA 中的操作方式与在 SGA 中的操作方式相同,唯一的区别在于服务器的配置方式。如果服务器是专用的,私有 SQL 区域保存在 PGA 中,如果服务器是共享的,则保存在 SGA 中。

每个发出 SQL 语句的会话都有自己的私有 SQL 区域,其中包含绑定变量、查询执行状态变量和查询执行工作区。如果多个用户提交相同的 SQL 语句,他们都会使用一个共享 SQL 区域。共享 SQL 区域和私有 SQL 区域之间存在 1:n 关系。

私有 SQL 区域有 3 个独立的区域,一个用于游标和 SQL,私有 SQL 区域本身以及 SQL 工作区。


• 游标和 SQL 区域

• 私有 SQL 区域组件

• SQL 工作区


游标和 SQL 区域

[编辑 | 编辑源代码]

游标是用于操作多个获取数据的行的强大构造。游标保存这些行,并允许以串行或分层方式导航它们。需要存储有关游标的信息,例如您在获取的行块中的位置,Oracle 允许您命名游标并在程序执行期间使用此引用。同样,特定私有 SQL 区域部分的句柄可以用作命名资源。保存游标和 SQL 区域命名资源的内存结构是游标和 SQL 区域。

各个用户进程负责管理私有 SQL。私有 SQL 区域保留在内存中,直到 SQL 语句句柄被释放或游标被关闭,此时分配给运行时区域的内存将被释放,但持久区域保留在内存中。持久区域包含查询执行状态信息(即用于跟踪表扫描的进度),以及 SQL 工作区。

SQL 工作区用于内存密集型操作,例如

• 基于排序的操作符(按顺序排序、分组、汇总、窗口函数)

• 哈希连接

• 位图合并

• 位图创建

排序将使用一个工作区(称为排序区域)来执行内存中的排序。哈希连接使用一个工作区(称为哈希区域)来构建哈希表。如果要由这两个操作符处理的数据量不适合工作区,它将被拆分,溢出部分将写入磁盘上的临时存储。一般来说,较大的 SQL 工作区可以提高性能,但会占用更多内存,较小的工作区存在溢出到磁盘并影响性能的风险。因此,工作区的尺寸可以控制,如果启用了自动 PGA 内存管理,数据库将自动为您执行此操作。

Oracle 软件代码区域

[编辑 | 编辑源代码]

软件代码区域是存储 Oracle 数据库代码(用于运行实际数据库的代码)和用户代码(用户编写的应用程序代码)的位置。这些区域是只读的,可以是共享的也可以是非共享的。由于代码本身通常不会在时间推移过程中发生变化,因此这些区域通常是静态的,只有在软件更新时才会发生变化。Oracle 数据库特定代码通常存储在比用户代码更排他性和更受保护的内存部分。只有 Oracle 可以更改其代码,但用户可以根据需要更新自己的代码。在尽可能的情况下,Oracle 努力实现共享代码以提高性能,但不可能以这种方式实现整个数据库代码集,因此其中一部分必须是非共享的,但是多个 Oracle 实例可以共享相同的 Oracle 代码区域,如果它运行在同一台机器上(如 图 2.3 中 Oracle 内存模型的 3 个主要区域所示)

内存中的其他结构是系统视图,它们是有用信息的虚拟表,例如 dba_datafiles,它将为您提供有关物理数据文件以及它们如何映射到表空间的信息。还有您可以编写查询的动态性能视图(以 V$ 为前缀)。(以及 dba_datafiles)查看共享池中的结构。V$_SQLAREA 和 V$_SQL 将为您提供对 SGA 的动态视图,而 V$_Controlfile 将提供控制文件的完整路径名

Oracle 进程模型

[编辑 | 编辑源代码]
主要的 Oracle 进程


图例

• D000 - 调度器

• DBWn - 数据库写入器(可能有多个,指定为 DBW1 → DBW9 和 DBWa → DBWj)

• LGWR – 日志写入器进程

• CKPT – 检查点进程

• ARCn – 归档进程(可能有多个,指定为 ARC0 → ARCn)

• RECO – 恢复进程

• PMON – 进程监视器

• SMON – 系统监视器

Oracle 使用进程来运行其核心数据库组件以及针对数据库及其数据工作的用户程序和工具。每个连接的用户都会运行两个进程,即用户进程(应用程序和数据库工具和实用程序)和数据库进程。Oracle 可以作为专用服务器运行,其中每个用户进程都有一个专门的服务器进程为其提供服务,或者作为共享服务器运行,其中多个用户进程连接到调度器,共享服务器进程使用请求和响应队列为用户进程请求提供服务。在这两种情况下,多个用户都可以同时使用数据库,但在专用模式下,每个用户进程都有一个专用服务器进程。在多进程模式下,多个 Oracle 服务器进程运行 Oracle 数据库代码。


用户进程

没有连接用户的数据库只是学术上的兴趣,拥有数据库的目的是为了为用户请求提供服务,因此从用户的角度出发,我们将看一下 Oracle 如何处理并发用户。如前所述,Oracle 可以配置为运行为专用服务器或共享服务器。共享用户进程和专用用户进程执行相同的函数,主要区别在于处理用户进程的方式。运行数据库的 Oracle 数据库进程保持不变(例如,无论用户进程如何连接到数据库,相同的数据库进程,如日志写入和检查点,都会运行实际的数据库本身)。根据配置,可以有多个 Oracle 进程运行以执行数据库操作(如将数据从缓冲区高速缓存写入磁盘),但同样,这些是同一进程的多个实例,它们在每种情况下都不是不同的进程。

从用户的角度来看,他们的进程连接到一个 Oracle 实例。如果用户在同一个物理服务器上,连接由进程间通信 (IPC) 处理。如果用户在远程机器上,连接由网络软件(如 TCP/IP)处理。连接是无状态的,可以认为是用户进程和数据库实例之间的管道。当用户开始通过此连接工作时,他们会建立一个会话,并且会话是有状态的。如果用户使用客户端程序来管理数据库,会话将以登录开始,并将持续到注销或用户断开与数据库的连接。连接和会话由进程处理,因此它们都会消耗资源。连接处理用户到数据库的连接,并且它们的操作与维护此路径相关,无论是否正在发生任何事情。会话是用户进程用来执行工作的,并且会话进程的维护和操作不需要考虑连接(这由连接进程处理),会话进程确保维护会话的状态。单个用户可以对一个数据库实例运行多个会话 - 同一个用户可能在多个会话中登录多次并执行不同的操作。

为了支持共享服务器连接,使用以下流程: - 网络监听器会将用户进程连接到调度程序或专用服务器进程 - 调度程序会将用户会话引导到共享服务器进程池 - 共享服务器进程 对于数据库支持的每种网络协议,至少需要运行一个调度程序进程。监听器会确定用户进程是否可以使用共享用户进程,并将其引导到调度程序。如果用户进程无法使用共享连接,监听器会创建专用服务器进程并将用户进程连接到该进程。共享服务器连接是 Oracle 数据库中的可扩展性功能,不需要对连接到实例的用户应用程序进行任何更改。

如果用户进程使用调度程序,调度程序会将用户请求放入请求队列,等待下一个可用的服务器进程进行处理。此队列位于 SGA 中,由单个共享用户进程按照“先进先出”原则进行处理。当服务器进程完成时,它会将响应放入响应队列,供处理此请求的调度程序处理,调度程序会将其返回给关联的用户进程。请求队列和响应队列都专用于调度程序实例,并且是共享全局区 (SGA) 中的内存结构。


Oracle 进程

Oracle 使用两类进程来运行数据库服务器:服务器进程(处理用户请求)和后台进程(运行数据库本身)。

代表用户应用程序运行的服务器进程用于解析和执行 SQL 语句,并将数据从磁盘检索到 SGA 中。

与用户进程协同工作的是许多后台进程。Oracle 数据库实例中可以运行大量后台进程,但并非所有进程都是必需的。以下是图 n(主要 Oracle 进程)中标识的与 Oracle 实例相关的主要进程概述。


• 数据库写入进程 (DBWn)

数据库写入进程从数据库缓冲区缓存中获取数据,并将其写入数据库数据文件。可以运行多个此类后台写入任务 (DBW1 到 DBW9,以及 DBWa 到 DBWj)。通常一个写入进程就足够了,但在大量修改数据的系统中,可以通过参数文件配置要启动的写入进程的数量。如果未设置写入进程数量的值,Oracle 会根据可用 CPU 的数量确定要启动的写入进程数量。数据库写入进程执行异步写入以提高性能。写入也会延迟。数据不会在使用插入、更新或删除进行数据更改后提交时从缓冲区写入。这可以防止频繁访问的数据从缓冲区缓存中弹出,并且还允许写入进程不频繁地将较大块的数据写入磁盘,而不是在更改发生后立即写入少量更改。这就是所谓的“批处理多块”写入。如果需要一组不在数据库缓冲区池中的块,则会将最近未访问的修改过的缓冲区(称为冷脏缓冲区)从内存写入磁盘以释放空间。这会释放用于从磁盘读取数据到内存的冷干净缓冲区。LRU 算法将最近访问的缓冲区保存在内存中,以最大限度地提高缓存命中的可能性。


• 日志写入进程 (LGWR)

日志写入进程负责将信息从撤消日志缓冲区池中获取并写入当前的一组联机撤消日志。当事务提交时,日志写入进程会写入重做日志条目提交记录,并将提交以及与该提交关联的所有更改写入磁盘。当重做日志条目写入磁盘时,只会写入自上次 LGWR 写入以来添加到缓冲区的条目(这样就不会将重复条目记录到磁盘)。LGWR 每 3 秒写入一次磁盘,以及当撤消日志已满三分之一时。如果数据库写入进程 (DBWn) 将脏缓冲区写入磁盘,LGWR 也会写入磁盘。在 DBWn 写入磁盘之前,LGWR 会写入与已更改数据关联的所有重做条目。


• 检查点进程 (CKPT)

频繁更新的块有可能长时间保留在内存中,它们永远不会被 LRU 选择。检查点进程会发出信号,指示后台写入 (DBWn) 将更新的已提交块写入磁盘数据文件。可以安排检查点进程的频率(通过服务器参数 (SP) 文件),也可以强制执行检查点。


• 系统监视器进程 (SMON)

系统监视器与所有后台进程通信。系统监视器管理数据库,并在发生崩溃时执行实例和崩溃恢复。它执行其他维护工作,例如回收未使用临时段中的空间,以及合并数据文件中的空闲空间。


• 进程监视器进程 (PMON)

PMON - 进程监视器监视其他进程,并处理死锁以及清理已中止的进程。进程监视器会将有关实例和调度程序进程的信息存储在网络监听器中。它会检查任何调度程序和共享服务器进程的状态,并重新启动任何已停止的进程。

PMON 和 SMON 都会定期检查自己是否需要,如果需要,其他进程也可以调用它们。


• 恢复进程 (RECO)

恢复进程仅存在于具有分布式数据库配置的实例中。RECO 解决分布式事务失败。如果分布式事务的状态为“不确定”,则节点的恢复进程会自动连接到参与该事务的其他数据库。RECO 然后通过从每个数据库的挂起事务表中删除与解决不确定事务相关的任何行来解决所有不确定事务。如果 RECO 无法连接到远程服务器,它会超时并在以后重试。


• 归档进程 (ARCn)

归档进程 (ARCn) 在每次日志切换时将重做日志文件复制到脱机存储。归档进程 (ARCn) 仅存在于启用了日志归档的实例中。实例上最多可以运行 10 个 ARCn 进程,这些进程由 LGWR 根据系统负载启动。


• 调度程序进程 (Dnnn)

数据库实例中可以存在多个调度程序进程。每个支持的网络协议(例如 TCP/IP)至少需要一个调度程序。由于调度程序用于处理多个用户进程,因此 DBA 可以最初启动多个调度程序,并在数据库运行时根据需要增加或减少此数量。


• 共享服务器进程 (Snnn)

在共享服务器配置中,每个共享服务器进程都会处理多个客户端请求。

共享服务器进程的程序全局区不包含用户数据,因为它需要供所有共享服务器进程访问,它只包含堆栈空间和进程特定的变量。与会话相关的數據(以及用户數據)存储在 SGA 中。Oracle 会根据请求队列的长度动态调整共享服务器进程的数量。

华夏公益教科书