Oracle 数据库是以单进程还是多进程方式运行的?

在Windows 平台下, Oracle 数据库是以单进程 (oracle.exe) 多线程方式运行。
在Linux/Unix 平台下, Oracle 数据库通常是以多进程方式运行。
到了12c 这个版本, Oracle 在 Unix/Linux 平台上做出了一些改变,引入了多线程的模式。
这个特性由threaded_execution 参数来控制,通过这个参数,可以控制数据库以多进程方式运行或者以多线程方式运行,该参数默认是 false 。数据库以多进程方式运行。

怎么理解进程和线程?

进程是表示资源分配的基本单位,又是调度运行的基本单位。线程是进程中执行运算的最小单位,亦即执行处理机调度的基本单位。如果把进程理解为在逻辑上操作系统所完成的任务,那么线程表示完成该任务的许多可能的子任务之一。一个线程只能属于一个进程,而一个进程可以有多个线程,但至少有一个线程。线程是操作系统可识别的最小执行和调度单位。
看到知乎上,一位名为南理汉子的作者回答特别新颖:
开个QQ ,开了一个进程;开了迅雷,开了一个进程。在 QQ 的这个进程里,传输文字开一个线程、传输语音开了一个线程、弹出对话框又开了一个线程。所以运行某个软件,相当于开了一个进程。在这个软件运行的过程里(在这个进程里),多个工作支撑的完成 QQ 的运行,那么这“多个工作”分别有一个线程。所以一个进程管着多个线程。通俗的讲:“进程是爹妈,管着众多的线程儿子” ...

Oracle 数据库中有哪几类进程?

1 客户 进程
2 服务 进程
3 后台进

请分别介绍下 客户 进程、 服务器 进程、后台进

1 客户 进程

当用户运行一个应用程序( 如 ProC 程序或 SQLPlus) 时,操作系统创建一个客户端进程 ( 有时称为用户进程 ) 来运行用户应用程序。客户端应用程序将 和 Oracle 数据库 相连 ,以提供与数据库通信所需的api 。
客户 进 程与直接与实例交互的Oracle 进 程在重要方面有所不同。
服务于客户进程的Oracle 进程可以读写 SGA ,而客户进程不能。客户进程可以在数据库主机之外的主机上运行,而 Oracle 进程不能。
例如,假设客户端主机上的用户启动了SQL*Plus ,然后在数据库实例没有启动时通过网络连接到另一台主机上的数据库 sample:
SQL> CONNECT SYS@ cjc AS SYSDBA
Enter password: *
Connected to an idle instance.
在客户端主机上,对sqlplus 或 sample 进程的搜索只显示 sqlplus 客户端进程 :

在数据库主机上,对sqlplus 或 sample 进程的搜索显示一个具有非本地连接的服务器进程,但是没有客户机进程 :

2 服务 进程

Oracle 服务进程 用于处理 连接到实例的客户进程的请求。
专用服务器进程(dedicated server ),每个进程服务一个客户进程。
共享服务器进程(shared server ),每个进程服务多个客户进程。
在共享服务器连接中,客户机应用程序通过网络连接到dispatcher 进程,而不是服务器进程。例如, 20 个客户端进程可以连接到单个 dispatcher 进程。
dispatcher 进程接收来自连接的客户机的请求,并将它们放入大池中的请求队列中。第一个可用的共享服务器进程从队列获取请求并处理它。然后,共享服务器将结果放入 dispatcher 响应队列。 dispatcher 进程监视此队列并将结果传输到客户机。

3 后台进程

后台进程执行操作数据库所需的维护任务,并为多个用户实现性能最大化。
每个后台进程有一个单独的任务,但是可以与其他进程一起工作。例如,LGWR 进程将 重做 数据从重做日志缓冲区写入在线重做日志。当一个已填满的重做日志文件准备归档时,LGWR 向另一个进程 归档进程 发出信号,让它归档重做日志文件。
Oracle 数据库在数据库实例启动时自动创建后台进程。一个实例可以有许多后台进程,但并不是所有后台进程都始终存在于每个数据库配置中。下面的查询 会 列出数据库上运行的后台进程:
SELECT PNAME FROM V$PROCESS WHERE PNAME IS NOT NULL ORDER BY PNAME;
后台进程包括三类:
3.1 强制后台进程
3.2 可选的后台进程
3.3 Slave 后台进
强制后台 程:
3.1.1 进程监控进程(PMON)
3.1.2 进 程管理器(PMAN)
3.1.3 监听器注册流程(LREG)
3.1.4 系统监控流程(SMON)
3.1.5 数据库写入过程(DBW)
3.1.6 日志写入过程(LGWR)
3.1.7 检查点过程(CKPT)
3.1.8 可管理性监控流程(MMON 和 MMNL)
3.1.9 回收器 程( RECO )

3.1.1 进程监 进程(PMON) 组

PMON 组包括 PMON 、清理主进程 (CLMN) 和清理辅助进程 (CLnn) 。这些进程负责监视和清理其他进程。
PMON 组监视缓冲区缓存的清理和客户机进程使用的资源的释放。例如, PMON 组负责重置活动事务表的状态,释放不再需要的锁,并从活动进程列表中删除终止进程的进程 ID 。
数据库必须确保已终止进程持有的资源被释放,以便其他进程可以使用它们。否则,进程可能会被阻塞或卡在争用中。
进程监视器进程(PMON)
进程监视器(PMON) 检测其他后台进程的终止。如果服务器或调度程序进程非正常终止,则 PMON 组负责执行进程恢复。进程终止可能有多个原因,包括操作系统终止命令或更改系统终止会话语句。
作用:
1 、在其他进程失败后执行清理工作:回滚事物、释放锁、释放其他资源。
2 、 12C 版本之前, PMON 负责数据库实例监听注册的相关任务 。
3 、检查会话的空闲连接时间。
触发条件: 定时被唤醒,其他进程也会主动唤醒它。
清理主进程(CLMN)
PMON 将清理工作委托给清理主进程 (CLMN) 。检测异常终止的任务仍然由 PMON 完成。
CLMN 定期执行已终止进程、已终止的会话、事务、网络连接、空闲会话、分离事务和已超出其空闲超时的分离网络连接的清理。
清理辅助进程(CLnn)
CLMN 将清理工作委托给 CLnn 辅助进程。
CLnn 进程帮助清除终止的进程和会话。辅助进程的数量与要完成的清理工作量和当前清理效率成正比。
清理进程可能被阻塞,从而阻止它继续清理其他进程。此外,如果多个进程需要清理,那么清理时间可能很长。由于这些原因,Oracle 数据库可以并行地使用多个辅助进程来执行清理,从而缓解了缓慢的性能。
V$CLEANUP_PROCESS 和 V$DEAD_CLEANUP 视图包含关于 CLMN 清理的元数据。 V$CLEANUP_PROCESS 视图包含每个清理进程的一行。例如,如果 V$CLEANUP_PROCESS 。状态繁忙,则进程当前正在进行清理。
数据库资源隔离
如果进程或会话终止,则PMON 组将所持有的资源释放到数据库。在某些情况下, PMON 组可以自动隔离损坏的、不可恢复的资源,这样就不会立即强制终止数据库实例。
PMON 组将继续对持有隔离资源的进程或会话执行尽可能多的清理工作。 V$QUARANTINE 视图包含元数据,比如资源类型、消耗的内存数量、导致隔离的 Oracle 错误等等。

3.1.2 进程管理器(PMAN)

Process Manager (PMAN) 监视多个后台进程,包括共享服务器、池服务器和作业队列进程。
PMAN 监视、 启动 和停止以下类型的进程:
1 调度程序和共享服务器进程
2 用于数据库常驻连接池的连接代理和池服务器进程pooled server process
3 工作队列的 程Job queue processes
4 重启的 后台进程

3.1.3 监听器注册 程(LREG)

12C 开始引入 LREG 进程, 负责数据库实例监听注册的相关任务。 在12c 之前的版本,该部分工作由 PMON 进程负责。侦听器注册进程 (LREG) 向 Oracle Net 侦听器注册关于数据库实例和调度程序进程的信息。当实例启动时, LREG 轮询侦听器以确定它是否正在运行。如果监听器正在运行,那么 LREG 将传递相关参数。如果它没有运行,那么 LREG 会定期尝试与它联系。

3.1.4 系统监控 程(SMON)

系统监控进程(SMON) 负责各种系统级的清理任务。
分配给SMON 的职责包括 :
1 执行实例恢复,前滚(Roll Forward) 恢复到实例关闭的状态,使用最后一次检查点后的日志进程重做。在 Oracle RAC 数据库中,一个数据库实例的 SMON 进程可以对失败的实例执行实例恢复。
2 恢复在实例恢复期间由于文 数据文件 或表空间离线错误而跳过的已终止事务。当表空间或文件恢复联机时,SMON 将恢复事务。
3 清理未使用的临时段 ,释放空间 。例如,Oracle 数据库在创建索引时分配区段。如果操作失败,那么 SMON 将清理临时空间。
4 合并空间, 在字典管理的表空间中合并连续的空闲区。

3.1.5 数据库写进程(DBW)

该进程负责将buffer cache 的脏数据写入到磁盘。 DBW 进程根据 LRU 算法,将最近最少被使用的 buffer 写入磁盘 。
尽管一个数据库写入进程(DBW0) 对于大多数系统来说已经足够了,但是如果系统大量修改数据可以配置其他进程 dbw1 到 DBW9, DBWa 到 DBWz, BW36 到 bw99 来 提高写入性能。这些附加的DBW 进程在单处理器系统上没有用处。
DBW 进程在下列条件下将脏缓冲区写入磁盘 :
1 当服务器进程在扫描缓冲区的阈值数目后找不到干净的可重用缓冲区时,它向DBW 发出写的信号。 DBW 在执行其他处理时,尽可能异步地将脏缓冲区写入磁盘。
2 数据库执行检查点操作时。 DBW 定期写缓冲区来推进检查点,检查点是重做线程中实例恢复开始的位置。检查点的日志位置由缓冲区缓存中最老的脏缓冲区决定。
3 修改表空间或数据文件离线时。
4 每三秒唤醒一次查看脏块数量,决定是否执行写入操作。
在许多情况下,DBW 写的块分散在整个磁盘中。因此,写操作往往比 LGWR 执行的顺序写操作慢。 DBW 在可能的情况下执行多块写操作以提高效率。在多块写入中写入的块的数量因操作系统而异。

3.1.6 日志写 进程 (LGWR)

负责将redo log buffer 的数据写入到在线重做日志,其会记录所有的 DML 和 DDL 操作,用于实例 、介质 恢复。
触发条件:
1 用户提交事务。
2 发生在线重做日志切换。
3 LGWR 上次写已经过去三秒钟了。
4 重做日志缓冲区已满三分之一,或包含1 MB 的缓冲数据。
5 DBWR 进程触发 :DBWn 视图将脏数据块写入磁盘先检测他的相关 redo 记录是否写入联机日志文件,如果没有就通知 LGWR 进程。在 oracle 中成为提前写机制 (write ahead):redo 记录先于数据记录被写入磁盘

3.1.7 检查点 程(CKPT)

负责更新控制文件和数据文件头的检查点信息,其中包括检查点位置,SCN 号, online redo log 开始恢复的位置。检查点在以下情况可能发起:
(1) 在日志切换 alter system switch logfile 的时候。
(2) 直接使用 alter system checkpoint 命令实现。
(3) 数据库用 immediate Transaction Normal 或选项 Shutdown 数据库的时候。
(4) 开始、结束备份表空间等 (ALTER TABLESPACE BEGIN BACKUP)
(5) 将表空间或者数据文件切换为只读或者离线。
(6)DBW 进程写的时候,但是此时只将检查点信息写入控制文件,而不会写到数据文件头。
(7) 达到 LOG_CHECKPOINT_TIMEOUT 的延迟时。
(8) 根据参数 FAST_START_MTTR_TARGT 的设置来确定。
如果当内存中产生的Dirty Buffer 所需的恢复时间 (estimated_mttr) 到达 FAST_START_MTTR_TARGET 指定时间,那么检查点进程被触发。
通知DBWR 进程将按检查点队列顺序将脏数据写入到数据文件,从而缩短了最后检查点位置与 Redo 日志间的距离,减少实例恢复所需的时间。

3.1.8 可管理性监控 程(M M ON 和 MMNL

可管理性监视进程(m m on )执行许多与自动工作负载存储库( AWR )相关的任务。
例如,当某个度量值违反其阈值时, m mon 会进行写入,为最近修改的 SQL 对象获取快照和统计值。
可管理性监视器精简进程(MMNL )将统计信息从 SGA 中的活动会话历史( ASH )缓冲区写入磁盘。 MMNL 在 ASH 缓冲区已满时写入磁盘。

3.1.9 回收器 程(RECO)

RECO 是分布式事务中处理 进程 故障的 进程 .
节点的RECO 进程自动连接到其他涉及到可疑分布式事务的数据库。当 RECO 重新建立数据库之间的连接时,它将自动解析所有可疑事务,从每个数据库的挂起事务表中删除与已解析事务对应的任何行。

可选的后台进程

可选的后台进程是指任何没有被定义为强制的后台进程。
大多数可选的后台进程都是特定于任务或特性的。例如,支持Oracle ASM 的后台进程只有在启用该特性时才可用。
本节介绍一些常见的可选流程:
3.2.1 归档 进程(ARCn)
3.2.2 作业队列处理 进程 (CJQ0 和 Jnnn)
3.2.3 闪回归档 (FBDA)
3.2.4 空间管理协调程序(SMCO)

3.2.1 归档进 程(ARCn)

在发生重做日志切换后,归档进程(ARCn) 将联机重做日志文件复制到 归档日志中 。
在DG 中, 这些进程还可以收集事务重做数据并将其传输到备用数据库目的地。ARCn 进程仅在数据库处于 ARCHIVELOG 模式并启用自动归档时才存在。

3.2.2 作业队列进程(CJQ0 和 Jnnn)

队列进程运行用户作业,通常是批处理模式。作业是计划运行一次或多次的用户定义任务。
例如,可以使用作业队列在后台调度长时间运行更新。给定一个开始日期和时间间隔,作业队列进程尝试在下一次出现该间隔时运行作业。
Oracle 数据库动态管理作业队列进程,从而允许作业队列客户机在需要时使用更多的作业队列进程。当新进程空闲时,数据库释放它们所使用的资源。
动态作业队列进程可以在给定的时间间隔内并发地运行许多作业。事件的顺序如下:

3.2.3 闪回归档进 程(FBDA)

闪回数据归档是Oracle Database 11g 强大的新特性之一。它可以用安全有效的方式透明地跟踪在数据库中存储的所有数据,并且没有保留期限的限制。这个特性很容易配置,而且拥有高效的存储以及性能。闪回数据归档不依赖于 UNDO ,通过 “AS OF” 闪回 SQL 语句来查看之前在某个时间点的数据,防止意外的数据更新和删除 ( 例如用户的错误操作 ) 或恶意的数据破坏 。
闪回数据归档进程,归档被追踪的表的历史行到闪回数据归档文件里面。当在被追踪的表上面发生了dml 事务的时候,这个进程存储行的前镜像到闪回数据归档里面。它同样保存当前行的元数据。

3.2.4 空间管理协调程序(SMCO)

11g 引入 extent pre-allocation 特性,由 SMCO(space management coordinator) 负责,其动态 spawn 子进程 Wnnn 用于空间分配和回收
SMCO 进程协调各种空间管理相关任务的执行。
1Extent 预分配
数据文件须开启autoextend , SMCO 依据历史信息,在表空间里所有尚未达到 maxsize 的数据文件间均匀的分配扩展;
2 回收临时段
3Securefile lob 预扩展 / 回收
此特性有时会产生意料之外的结果,譬如数据文件扩展到maxsize( 但实际数据没有这么大 )
AUTOEXTEND Grows To Full Size Without Reason [ID 1459097.1]
Why The Data Files Got Extended Up Over The Weekend [ID 1538442.1]
Slave
Slave 进程是代表其他进程执行工作的后台进程。
本节描述Oracle 数据库使用的一些从进程。
I / O slave 的过程
I/O slave 进程(Innn) 模拟不支持异步 I/O 的系统和设备。
在异步I/O 中,对传输没有时间要求,这使得其他进程可以在传输完成之前启动。
例如,假设一个应用程序向一个不支持异步I/O 的操作系统的磁盘写入了 1000 个块。每次写操作都是按顺序发生的,并等待写操作成功的确认。使用异步磁盘,应用程序可以批量写入块并执行其他工作,同时等待已写入所有块的操作系统的响应。
为了模拟异步I/O ,一个进程监视多个从属进程。 调用程序进程将工作分配给每个从属进程,它们等待每次写入完成并在完成后向调用程序报告。
在真正的异步I/O 中,操作系统等待 I/O 完成并向 进 程报告,而在模拟异步I/O 中,从操作系统等待并向调用者报告。
数据库支持不同类型的I/O slave ,包括 :
恢复管理器 (RMAN) I/O slave
在使用RMAN 备份或恢复数据时,可以对磁盘和磁带设备使用 I/O 从设备。
Database writer slaves
当计算机有一个CPU 时, 无法 使用多个数据库写进程 , 那么数据库可以将I/O 分布在多个从进程上。 DBW 是惟一一个扫描缓冲区缓存 LRU 列表以查找要写到磁盘上的块的进程。但是,从 I/O 执行这些块的 I/O 。
并行执行(PX) 服务器进程
在并行执行中,多个进程同时运行一条SQL 语句。
通过将工作分配给多个进程,Oracle 数据库可以更快地运行语句。例如,四个流程 处理 一年 中 四个不同的季度,而不是一个流程独自处理所有四个季度。
并行执行与串行执行形成对比,在串行执行中,单个服务器进程执行SQL 语句的顺序执行所需的所有处理。例如,为了执行完整的表扫描,例如 SELECT * FROM employees ,一个服务器进程执行所有的工作 。
转载自chenoracle

最后修改:2022 年 02 月 27 日
如果觉得我的文章对你有用,请随意赞赏