PARTV-Oracle实例架构-进程架构
15. 进程架构
15.1. 进程简介
进程是操作系统中可以运行一系列步骤的机制。这个机制取决于操作系统。例如,在 Linux 上,Oracle 后台进程是一个 Linux 进程。在 Windows 上,Oracle 后台进程是进程内的执行线程。代码模块由进程运行。所有连接到 Oracle 数据库的用户都必须运行以下模块才能访问数据库实例:
■ 应用程序或 Oracle 数据库实用程序
数据库用户运行数据库应用程序,例如预编译程序或数据库工具(如 SQL*Plus),它向数据库发出 SQL 语句。
■ Oracle 数据库代码
每个用户都有代表他们执行的 Oracle 数据库代码,解释和处理应用程序的 SQL 语句。
进程通常在其自己的私有内存区域中运行。大多数进程可以定期写入关联的跟踪文件(见第 13-21 页的“跟踪文件”)。
15.1.1. 多进程Oracle数据库系统
多进程 Oracle(也称为多用户 Oracle)使用多个进程来运行 Oracle 数据库代码的不同部分,以及为用户额外提供的进程——每个连接用户一个进程,或者多个用户共享一个或多个进程。大多数数据库都是多用户的,因为数据库的一个主要优势是同时管理多个用户所需的数据。
数据库实例中的每个进程执行一个特定任务。通过将数据库和应用程序的工作分成几个进程,多个用户和应用程序可以同时连接到一个实例,同时系统提供良好的性能。
15.1.2. 进程类型
数据库实例包含或与以下类型的进程交互:
■ 客户端进程运行应用程序或 Oracle 工具代码。
■ Oracle 进程运行 Oracle 数据库代码。Oracle 进程包括以下子类型:
– 后台进程与数据库实例一起启动,并执行维护任务,如执行实例恢复、清理进程、将重做缓冲区写入磁盘等。
– 服务器进程根据客户端请求执行工作。 例如,这些进程解析 SQL 查询,将它们放置在共享池中,为每个查询创建并执行查询计划,并从数据库缓冲区缓存或磁盘读取缓冲区。
注意:服务器进程及其在这些进程中分配的进程内存在实例中运行。当服务器进程终止时,实例继续运行。
– 从属进程为后台进程或服务器进程执行额外的任务。
进程结构根据操作系统和选择的 Oracle 数据库选项而有所不同。例如,可以为连接的用户配置专用服务器或共享服务器连接的代码。在共享服务器架构中,每个运行数据库代码的服务器进程可以为多个客户端进程提供服务。
图 15-1 显示了一个使用专用服务器连接的系统全局区域(SGA)和后台进程。对于每个用户连接,应用程序由一个客户端进程运行,该进程与运行数据库代码的专用服务器进程不同。每个客户端进程都与其自己的服务器进程相关联,每个服务器进程都有自己的程序全局区域(PGA)。
15.2. 客户端进程概述
当用户运行诸如 ProC 程序或 SQLPlus 之类的应用程序时,操作系统会创建一个客户端进程(有时称为用户进程)来运行用户应用程序。客户端应用程序中链接了 Oracle 数据库库,这些库提供了与数据库通信所需的 API。
15.2.1. 客户端和服务端进程
客户端进程与直接与实例交互的 Oracle 进程在重要方面有所不同。为客户端进程服务的 Oracle 进程可以读取和写入 SGA,而客户端进程则不能。客户端进程可以在数据库主机以外的主机上运行,而 Oracle 进程则不能。
例如,假设客户端主机上的一个用户启动 SQL*Plus 并通过网络连接到不同主机上的数据库 sample(数据库实例尚未启动):
SQL> CONNECT SYS@inst1 AS SYSDBA
Enter password: ***********
Connected to an idle instance.
在客户端主机上,搜索 sqlplus 或 sample 的进程只显示 sqlplus 客户端进程:
% ps -ef | grep -e sample -e sqlplus | grep -v grep
clientuser 29437 29436 0 15:40 pts/1 00:00:00 sqlplus
as sysdba
在数据库主机上,搜索 sqlplus 或 sample 的进程显示有一个非本地连接的服务器进程,但没有客户端进程:
% ps -ef | grep -e sample -e sqlplus | grep -v grep
serveruser 29441 1 0 15:40 ?
00:00:00 oraclesample (LOCAL=NO)
15.2.2. 连接与会话
连接是客户端进程和数据库实例之间的物理通信路径。通信路径是使用可用的进程间通信机制或网络软件建立的。通常,连接发生在客户端进程和服务器进程或调度器之间,也可以发生在客户端进程和 Oracle 连接管理器(CMAN)之间。会话是数据库实例内存中的一个逻辑实体,代表当前用户登录到数据库的状态。例如,当用户通过密码被数据库认证时,就会为这个用户建立一个会话。会话从用户被数据库认证的时间持续到用户断开连接或退出数据库应用程序的时间。
单个连接上可以建立 0 个、1 个或多个会话。这些会话是独立的:一个会话中的提交不会影响其他会话中的事务。
注意:如果配置了 Oracle Net 连接池,那么连接可能会断开,但会话保持不变。
单个数据库用户可以同时存在多个会话。如图15-2 所示,用户hr可以有多个数据库连接。在专用服务器连接中,数据库会为每个连接创建一个服务器进程。只有导致创建专用服务器的客户端进程才会使用它。在共享服务器连接中,多个客户端进程访问单一的共享服务器进程。
图 15-3 展示了一个情况,用户hr只有一个数据库连接,但这个连接有两个会话。
生成 SQL 语句执行统计信息的自动跟踪报告重现了图 15-3 中的场景。示例 15-2 将 SQL*Plus 连接到数据库作为 SYSTEM 用户,并启用跟踪,从而创建了一个新的会话(包括示例输出)。
示例 15-1中的DISCONNECT命令实际上结束的是会话,而不是连接。打开一个新的终端并以不同的用户身份连接到实例,示例15-2中的查询显示示例 15-1中的连接仍然是活跃的。
15.3. 服务端进程概述
Oracle 数据库创建服务器进程来处理连接到实例的客户端进程的请求。客户端进程总是通过单独的服务器进程与数据库通信。
代表数据库应用程序创建的服务器进程可以执行以下一项或多项任务:
■ 解析和运行应用程序发出的 SQL 语句,包括创建和执行查询计划(见第 7-15 页的“SQL 处理阶段”)
■ 执行 PL/SQL 代码
■ 将数据块从数据文件读入数据库缓冲区缓存(DBWn 后台进程的任务是将修改后的块写回磁盘)
■ 以应用程序可以处理信息的方式返回结果
15.3.1. 专有服务器进程
在专用服务器连接中,客户端连接与一个且仅一个服务器进程相关联(见第 16-9 页的“专用服务器架构”)。在 Linux 上,20 个客户端进程连接到数据库实例由 20 个服务器进程提供服务。每个客户端进程直接与其服务器进程通信。这个服务器进程在会话期间专门用于其客户端进程。服务器进程在其 PGA 中存储进程特定信息和 UGA(见第 14-7 页的“专用和共享服务器模式下的 PGA 使用情况”)。
15.3.2. 共享服务器进程
在共享服务器连接中,客户端应用程序通过网络连接到一个调度进程,而不是服务器进程(见第 16-11 页的“共享服务器架构”)。例如,20 个客户端进程可以连接到一个单独的调度进程。
调度进程接收来自客户端的请求,并将它们放入大池中的请求队列(见第 14-21 页的“大池”)。第一个可用的共享服务器进程从队列中取出请求并处理它。之后,共享服务器将结果放入调度响应队列。调度进程监控这个队列,并将结果传输给客户端。
像专用服务器进程一样,共享服务器进程有自己的 PGA。然而,会话的 UGA 位于 SGA 中,以便任何共享服务器都可以访问会话数据。
15.4. 后台进程概述
多进程 Oracle 数据库使用一些额外的进程,称为后台进程。后台进程执行操作数据库和为多个用户最大化性能所需的维护任务。每个后台进程都有一个单独的任务,但与其他进程协作。例如,LGWR 进程将数据从重做日志缓冲区写入在线重做日志。当一个充满的日志文件准备归档时,LGWR 会发出信号让另一个进程来归档该文件。
Oracle 数据库在数据库实例启动时自动创建后台进程。一个实例可以有很多后台进程,但并非所有配置中的数据库都始终存在。以下查询列出了您的数据库上正在运行的后台进程:
SELECT PNAME FROM V$PROCESS WHERE PNAME IS NOT NULL ORDER BY PNAME;
本节包括以下主题:
■ 必要后台进程
■ 可选后台进程
■ 从属进程
15.4.1. 必要后台进程
强制后台进程在所有典型的数据库配置中都存在。这些进程默认在用最少配置的初始化参数文件启动的数据库实例中运行(见第 13-20 页的示例 13-1)。本节描述了以下强制后台进程:
■ 进程监控进程(PMON)
■ 系统监控进程(SMON)
■ 数据库写入进程(DBWn)
■ 日志写入进程(LGWR)
■ 检查点进程(CKPT)
■ 可管理性监控进程(MMON 和 MMNL)
■ 恢复进程(RECO)
15.4.1.1. 进程监控进程(PMON)
进程监控(PMON)监控其他后台进程,并在服务器或调度器进程异常终止时执行进程恢复。PMON 负责清理数据库缓冲区缓存和释放客户端进程使用的资源。例如,PMON 重置活动事务表的状态,释放不再需要的锁,并从活动进程列表中移除进程 ID。PMON 还向 Oracle Net 监听器注册实例和调度器进程的信息(见第 16-6 页的“Oracle Net 监听器”)。当实例启动时,PMON 轮询监听器以确定其是否正在运行。如果监听器正在运行,那么 PMON 会传递给它相关参数。如果它没有运行,那么 PMON 会定期尝试联系它。
15.4.1.2. 系统监控进程(SMON)
系统监控进程(SMON)负责多种系统级别的清理工作。分配给SMON的职责包括:
■ 在实例启动时执行实例恢复(如果需要)。在Oracle RAC数据库中,一个数据库实例的SMON进程可以为失败的实例执行实例恢复。
■ 恢复在实例恢复期间由于文件读取或表空间离线错误而被跳过的已终止事务。当表空间或文件重新联机时,SMON会恢复这些事务。
■ 清理未使用的临时段。例如,Oracle数据库在创建索引时分配区段。如果操作失败,则SMON会清理临时空间。
■ 在字典管理的表空间内合并连续的空闲区段。
SMON定期检查是否需要执行。其他进程如果检测到需要,可以调用SMON。
15.4.1.3. 数据库写入进程(DBWn)
数据库写入进程(DBWn)将数据库缓冲区的内容写入数据文件。DBWn进程将数据库缓冲区高速缓存中修改过的缓冲区写入磁盘(参见第14-9页的“数据库缓冲区高速缓存”)。
尽管一个数据库写入进程(DBW0)对于大多数系统来说是足够的,但如果你的系统大量修改数据,你可以配置额外的进程——DBW1到DBW9和DBWa到DBWj——以提高写入性能。这些额外的DBWn进程在单处理器系统上没有用处。DBWn进程在以下条件下将脏缓冲区写入磁盘:
■ 当服务器进程在扫描了一定数量的缓冲区后找不到可重用的干净缓冲区时,它会发出信号让DBWn写入。DBWn尽可能异步地将脏缓冲区写入磁盘,同时进行其他处理。
■ DBWn定期写入缓冲区以推进检查点,检查点是实例恢复开始的重做线程中的位置(参见第13-11页的“检查点概述”)。检查点的日志位置由缓冲区高速缓存中最老的脏缓冲区决定。
在许多情况下,DBWn写入的块分散在整个磁盘上。因此,这些写入往往比LGWR执行的顺序写入要慢。DBWn在可能的情况下执行多块写入以提高效率。多块写入中写入的块数因操作系统而异。
15.4.1.4. 日志写入进程(LGWR)
日志写入进程(LGWR)管理重做日志缓冲区。LGWR将缓冲区的一个连续部分写入在线重做日志。通过分离修改数据库缓冲区、将脏缓冲区分散写入磁盘和快速顺序写入重做日志到磁盘的任务,数据库提高了性能。在以下情况下,LGWR会写入自上次写入以来已复制到缓冲区的所有重做条目:
■ 用户提交事务(参见第10-10页的“提交事务”)。
■ 发生在线重做日志切换。
■ 自LGWR上次写入以来已过去三秒钟。
■ 重做日志缓冲区已满三分之一或包含1MB的缓冲数据。
■ DBWn必须将修改过的缓冲区写入磁盘。
在DBWn可以写入脏缓冲区之前,必须将与缓冲区更改相关的重做记录写入磁盘(先行写入协议)。如果DBWn发现某些重做记录尚未写入,它会发出信号让LGWR将记录写入磁盘,并等待LGWR完成后再将数据缓冲区写入磁盘。
LGWR和提交 Oracle数据库使用快速提交机制来提高已提交事务的性能。当用户发出COMMIT语句时,事务会被分配一个系统更改号(SCN)。LGWR将提交记录放入重做日志缓冲区,并立即将其连同提交SCN和事务的重做条目一起写入磁盘。
重做日志缓冲区是循环的。当LGWR将重做日志缓冲区中的重做条目写入在线重做日志文件时,服务器进程可以将新条目复制到已写入磁盘的重做日志缓冲区中的条目上。LGWR通常写得足够快,以确保即使在对在线重做日志的访问量很大时,缓冲区中始终有空间供新条目使用。
包含事务提交记录的重做条目的原子写入是确定事务已提交的单一事件。尽管数据缓冲区尚未写入磁盘,Oracle数据库还是会向提交事务返回成功代码。对数据块的相应更改将推迟,直到对DBWn将它们写入数据文件是高效的时候。
注意:LGWR可以在事务提交之前将重做日志条目写入磁盘。只有当事务后来提交时,由重做条目保护的更改才会变得永久。
当活动量高时,LGWR可以使用组提交。例如,一个用户提交事务,导致LGWR将该事务的重做条目写入磁盘。在这次写入过程中,其他用户也提交了事务。LGWR必须等到前一次写入完成,才能将这些事务的重做条目写入磁盘以提交它们。完成前一次写入后,LGWR可以在一次操作中写入等待事务(尚未提交)的重做条目列表。通过这种方式,数据库最小化了磁盘I/O,并最大化了性能。如果提交请求持续高速进行,那么LGWR的每次写入都可能包含多个提交记录。
LGWR和无法访问的文件LGWR同步写入活动镜像组中的在线重做日志文件。如果一个日志文件无法访问,那么LGWR会继续向组中的其他文件写入,并在LGWR跟踪文件和警告日志中写入错误。如果组中的所有文件都损坏了,或者该组因为未被归档而不可用,那么LGWR无法继续工作。
15.4.1.5. 检查点进程(CKPT)
检查点进程(CKPT)使用检查点信息更新控制文件和数据文件头,并发出信号让DBWn将块写入磁盘。检查点信息包括检查点位置、SCN、开始恢复的在线重做日志位置等。如图15-4所示,CKPT不将数据块写入数据文件,也不将重做块写入在线重做日志文件。
可管理性监控进程(MMON和MMNL) 可管理性监控进程(MMON)执行许多与自动工作负载仓库(AWR)相关的任务。例如,当一个指标超过其阈值时,MMON会写入,拍摄快照,并捕获最近修改的SQL对象的统计值。
可管理性监控轻量级进程(MMNL)将SGA中的活动会话历史(ASH)缓冲区的统计信息写入磁盘。当ASH缓冲区满时,MMNL会将数据写入磁盘。
恢复进程(RECO)在分布式数据库中,恢复进程(RECO)自动解决分布式事务中的故障。一个节点的RECO进程会自动连接到参与不确定分布式事务的其他数据库。当RECO在数据库之间重新建立连接时,它会自动解决所有不确定的事务,从每个数据库的挂起事务表中移除与已解决事务对应的所有行。
15.4.2. 可选后台进程
可选后台进程是任何未定义为必须的后台进程。大多数可选后台进程是特定于任务或功能的。例如,支持Oracle Streams高级队列(AQ)或Oracle自动存储管理(Oracle ASM)的后台进程只有在启用这些功能时才可用。本节描述了一些常见的可选进程:
■ 归档进程(ARCn)
■ 作业队列进程(CJQ0和Jnnn)
■ 闪回数据归档进程(FBDA)
■ 空间管理协调进程(SMCO)
15.4.2.1. 归档进程(ARCn)
归档进程(ARCn)在重做日志切换发生后,将在线重做日志文件复制到离线存储。这些进程还可以收集事务重做数据并将其传输到备用数据库目的地。ARCn进程仅在数据库处于ARCHIVELOG模式且启用了自动归档时才存在。
另请参阅:
■ 第11-15页的“归档重做日志文件”
■ 《Oracle数据库管理员指南》,了解如何调整归档进程的数量
■ 《Oracle数据库性能调整指南》,了解如何调整归档性能
15.4.2.2. 作业队列进程(CJQ0和Jnnn)
Oracle数据库使用作业队列进程来运行用户作业,通常以批处理模式运行。作业是用户定义的任务,计划运行一次或多次。例如,您可以使用作业队列在后台安排长时间运行的更新。给定一个开始日期和时间间隔,作业队列进程尝试在下一个间隔发生时运行作业。
Oracle数据库动态管理作业队列进程,从而允许作业队列客户端在需要时使用更多的作业队列进程。数据库在新进程空闲时释放它们使用的资源。
动态作业队列进程可以在给定间隔内同时运行大量作业。事件的顺序如下:
- 作业协调进程(CJQ0)根据Oracle调度器(见第18-19页的“Oracle调度器”)的需要自动启动和停止。协调进程定期从系统JOB$表中选择需要运行的作业。新选择的作业按时间顺序排列。
- 协调进程动态生成作业队列从属进程(Jnnn)来运行作业。
- 作业队列进程运行CJQ0进程选择的一个作业进行执行。每个作业队列进程一次运行一个作业直到完成。
- 进程完成单个作业的执行后,它会轮询更多作业。如果没有作业计划执行,那么它进入睡眠状态,从睡眠状态中定期唤醒并轮询更多作业。如果进程没有找到新作业,那么它在预设的时间间隔后终止。
初始化参数JOB_QUEUE_PROCESSES表示一个实例上可以同时运行的最大作业队列进程数。然而,客户端不应假设所有作业队列进程都可用于作业执行。
注意:如果初始化参数JOB_QUEUE_PROCESSES设置为0,则不启动协调进程。
15.4.2.3. 闪回数据归档进程(FBDA)
闪回数据归档进程(FBDA)将跟踪表的历史行归档到闪回数据档案中。当包含对跟踪表的DML操作的事务提交时,该进程将行的预镜像存储到闪回数据档案中。它还保留当前行的元数据。FBDA自动管理闪回数据档案的空间、组织和保留。此外,该进程还跟踪跟踪事务的归档进度。
15.4.2.4. 空间管理协调进程(SMCO)
SMCO进程协调执行各种与空间管理相关的任务,例如主动空间分配和空间回收。SMCO动态生成从属进程(Wnnn)来执行任务。
15.4.3. 从属进程
奴隶进程是代表其他进程执行工作的后台进程。本节描述了Oracle数据库使用的某些奴隶进程。
15.4.3.1. I/O 从属进程(Innn)
I/O 从属进程(Innn)为不支持异步I/O的系统和设备模拟异步I/O。在异步I/O中,传输没有时间要求,使得其他进程可以在传输完成之前开始。
例如,假设一个应用程序在不支持异步I/O的操作系统上向磁盘写入1000个块。每次写入都是顺序发生的,并等待确认写入成功。使用异步磁盘时,应用程序可以批量写入块,并在等待操作系统确认所有块都已写入的同时执行其他工作。
为了模拟异步I/O,一个进程监督着几个奴隶进程。调用进程为每个奴隶进程分配工作,它们等待每次写入完成并向调用进程报告完成情况。在真正的异步I/O中,操作系统等待I/O完成并向进程报告,而在模拟的异步I/O中,奴隶进程等待并向调用进程报告。
数据库支持不同类型的I/O奴隶,包括以下类型:
■恢复管理器(RMAN)的I/O奴隶
当使用RMAN备份或恢复数据时,你可以利用I/O奴隶来处理磁盘和磁带设备。
■ 数据库写入奴隶
如果使用多个数据库写入进程不实际,例如当计算机有一个CPU时,数据库可以将I/O分布在多个奴隶进程上。DBWR是唯一扫描缓冲区高速缓存LRU列表以确定要写入磁盘的块的过程。然而,I/O奴隶执行这些块的I/O操作。
15.4.3.2. 并行查询Slaves
并行查询Slaves在并行执行或并行处理中,多个进程同时协作运行单个SQL语句。通过将工作分配给多个进程,Oracle数据库可以更快地运行该语句。例如,四个进程分别处理一年的四个不同季度,而不是一个进程单独处理全部四个季度。并行执行减少了大型数据库(如数据仓库)上的数据密集型操作的响应时间。对称多处理(SMP)和集群系统从并行执行中获得最大的性能提升,因为语句处理可以在多个CPU之间分割。并行执行对某些类型的OLTP和混合系统也有益。在Oracle RAC系统中,特定服务的服务放置控制并行执行。具体来说,平行进程在您配置服务的节点上运行。默认情况下,Oracle数据库仅在提供用于连接数据库的服务的实例上运行并行进程。这不会影响其他并行操作,如并行恢复或GV$查询的处理。
串行执行在串行执行中,单个服务器进程执行SQL语句顺序执行所需的所有处理。例如,要执行如SELECT * FROM employees这样的全表扫描,一个服务器进程执行全部工作,如图15-5所示。
并行执行 在并行执行中,服务器进程充当并行执行协调器,负责解析查询、分配和控制奴隶进程,以及向用户发送输出。给定SQL查询的查询计划,协调器将SQL查询中的每个操作符分解成并行片段,按照查询中指定的顺序运行它们,并将由执行操作的奴隶进程产生的部分结果进行整合。
图15-6显示了对employees表的并行扫描。表被动态地(动态分区)划分为称为块的负载单元。每个块是表的一组数据块的范围,由单个奴隶进程读取,称为并行执行服务器,它使用Pnnn作为名称格式。
数据库在执行时将块映射给执行服务器。当一个执行服务器完成读取对应块的行,并且还有块剩余时,它会从协调器那里获取另一个块。这个操作会持续进行,直到表被读取完毕。执行服务器将结果发送回协调器,协调器将这些片段组装成所需的全表扫描。
分配给单个操作的并行执行服务器的数量就是操作的并行度。同一SQL语句内的多个操作都具有相同的并行度。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 【杭电多校比赛记录】2025“钉耙编程”中国大学生算法设计春季联赛(1)