进程简介
进程是在操作系统中可以运行一系列步骤的机制。
该机制取决于操作系统。例如,Windows 上的一个 Oracle 后台进程是在某个进程内执行的一个线程。在 Linux 和 UNIX 上,Oracle进程要么是操作系统进程,要么是操作系统进程中的线程。
进程运行代码模块。所有已连接的 Oracle 数据库用户必须运行以下模块来访问数据库实例:
-
应用程序或 Oracle 数据库实用程序
数据库用户运行一个数据库应用程序, 如预编译器程序或数据库工具(如 SQL*Plus) , 来向数据库发出 SQL 语句。 -
Oracle 数据库代码
每个用户都具有为其运行的 Oracle 数据库代码,以解释和处理应用程序的 SQL 语句。
另见:
-
"Trace Files"
-
"Tools for Database Administrators"
-
"Tools for Database Developers"
进程类型
数据库实例包含或与多个进程交互。
进程可分为以下类别:
-
客户端进程,运行应用程序或 Oracle 工具代码。
-
Oracle 进程是运行 Oracle 数据库代码的执行单元。在多线程体系结构中,Oracle进程可以是操作系统进程,也可以是操作系统进程中的线程。Oracle进程包括以下子类型:
- 后台进程,与数据库实例同时启动,并执行一些维护任务,如执行实例恢复、清理进程、将重做缓冲区写入磁盘等。
-
服务器进程,基于客户端请求, 执行相应的工作。
例如,这些进程解析 SQL 查询、将查询放入共享池、为查询创建并执行查询计划和将数据从数据库缓冲区高速缓存(或从磁盘) 读入缓冲区。 -
从属进程,为后台进程或服务器进程执行额外任务。
-
图 15-1 显示了使用专用服务器连接时的系统全局区(SGA)和后台进程。对每个用户连接, 应用程序由一个客户端进程来运行,而由其专用服务器进程来运行数据库代码。每个客户端进程都与其自己的服务器进程相关联,而每个服务器进程都有其自己的程序全局区(PGA)。
图 15-1 Oracle 进程和 SGA
Description of "Figure 15-1 Oracle Processes and the SGA"
另见:
-
"Dedicated Server Architecture"和"Shared Server Architecture"
- 您的特定于操作系统的 Oracle 数据库的文档,关于配置选项的更多详细信息
-
《Oracle Database Reference》了解 V$PROCESS 视图
多进程和多线程Oracle数据库系统
多进程 Oracle 数据库 (也称为多用户 Oracle Database) 使用几个进程来运行 Oracle 数据库代码的不同部分,并为用户运行一些其他进程——要么每个连接的用户一个进程, 或由多个用户共享一个或多个进程。
在Oracle Database 12c之前的版本中,Oracle进程不能作为线程在UNIX和Linux系统上运行。从Oracle Database 12c开始,多线程Oracle数据库模型允许Oracle进程作为操作系统线程在单独的地址空间中执行。安装Oracle Database 12c后,数据库将以进程模式运行。必须将 THREADED_EXECUTION 初始化参数设置为TRUE,才能在线程模式下运行数据库。在线程模式下,UNIX和Linux上的一些后台进程作为进程运行(每个进程包含一个线程),而剩余的Oracle进程作为进程中的线程运行。
在以线程模式运行的数据库中,PMON和DBW可以作为操作系统进程运行,而LGWR和CMON可以作为单个进程中的线程运行。两个前台进程和一个并行执行(parallel execution, PX)服务器进程可以作为第二个操作系统进程中的线程运行。第三个操作系统进程可能包含多个前台线程。因此,“Oracle进程”并不总是意味着“操作系统进程”。
例 15-1 查看Oracle进程元数据
V$PROCESS视图包含连接到数据库实例的每个Oracle进程的一行。例如,您可以在SQL*Plus中运行以下查询,以获得每个进程的操作系统进程ID和操作系统线程ID:
COL SPID FORMAT a8
COL STID FORMAT a8
SELECT SPID, STID, PROGRAM FROM V$PROCESS ORDER BY SPID;
查询产生以下部分样本输出:
SPID STID PROGRAM
----- ----- ---------------------------
7190 7190 oracle@samplehost (PMON)
7192 7192 oracle@samplehost (PSP0)
7194 7194 oracle@samplehost (VKTM)
7198 7198 oracle@samplehost (SCMN)
7198 7200 oracle@samplehost (GEN0)
7202 7202 oracle@samplehost (SCMN)
7202 7204 oracle@samplehost (DIAG)
7198 7205 oracle@samplehost (DBRM)
7202 7206 oracle@samplehost (DIA0)
.
.
.
另见:
-
《Oracle Database Performance Tuning Guide》了解如何使用V$PROCESS视图
-
《Oracle Database Reference》了解 THREADED_EXECUTION 初始化参数
客户端进程概述
客户端进程和服务器进程
客户端进程和与实例直接交互的 Oracle 进程在某些重要方面不同。
SQL> CONNECT SYS@inst1 AS SYSDBA
Enter password: *********
Connected to an idle instance.
% ps -ef | grep -e sample -e sqlplus | grep -v grep
clientuser 29437 29436 0 15:40 pts/1 00:00:00 sqlplus as sysdba
% ps -ef | grep -e sample -e sqlplus | grep -v grep
serveruser 29441 1 0 15:40 ? 00:00:00 oraclesample (LOCAL=NO)
另见:
"How an Instance Is Started"了解当实例未启动时客户机如何连接到数据库
连接和会话
连接是在客户端进程和数据库实例之间的一条物理通信路径。
在连接过程中,通信路径使用可用的进程间通信机制或网络软件来建立。通常,连接在客户端进程和服务器进程(或调度器进程)之间产生,但它也可以在客户端进程与 Oracle 连接管理器(CMAN)之间产生。
会话是数据库实例内存中的一个逻辑实体, 表示登录到数据库的某个当前用户的状态。 例如, 当用户使用密码通过了数据库身份验证时, 会为此用户建立一个会话。 会话的持续时间从用户通过数据库验证开始, 直到用户断开连接,或退出数据库应用程序。
图 15-2 每个连接一个会话
Description of "Figure 15-2 One Session for Each Connection"
如图 15-3 所示, hr 用户仅有一个单一数据库连接, 但此连接有两个会话。
图 15-3 单个连接中的两个会话
Description of "Figure 15-3 Two Sessions in One Connection"
示例 15-2 中的 DISCONNECT 命令实际上结束了会话,而未中断连接。
例 15-2 链接和会话
如下示例使用 SYSTEM 用户从 SQL*Plus 连接到数据库,并启用跟踪,从而创建一个新的会话(包括示例输出)。
SQL> SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE USERNAME = USER;SID SERIAL# PADDR
--- ------- --------
90 91 3BE2E41CSQL> SET AUTOTRACE ON STATISTICS;
SQL> SELECT SID, SERIAL#, PADDR FROM V$SESSION WHERE USERNAME = USER;SID SERIAL# PADDR
--- ------- --------
88 93 3BE2E41C
90 91 3BE2E41C
...
SQL> DISCONNECT
SQL> CONNECT dba1@inst1
Password: ********
Connected.
SQL> SELECT PROGRAM FROM V$PROCESS WHERE ADDR = HEXTORAW('3BE2E41C');PROGRAM
------------------------------------------------
oracle@stbcs09-1 (TNS V1-V3)
另见:
"Shared Server Architecture"
数据库操作
在数据库监控上下文中,数据库操作是最终用户或应用程序代码定义的两个时间点之间的会话活动。
一个简单的数据库操作要么是一个SQL语句,要么是一个PL/SQL过程或函数。复合数据库操作是一组单个或复合操作。
要监控、比较和调优任务,可以将大量任务划分为数据库操作,并将操作细分为阶段。用例是一个PL/SQL批处理作业,它的运行速度比正常情况下要慢。通过将作业配置为数据库操作,您可以识别和调优作业中的昂贵步骤。
数据库操作的每次执行都由一对属性惟一地标识:操作名称和执行ID。一个会话可以通过指定其会话ID和序列号在不同的会话中启动或停止数据库操作。
同一数据库操作的两次出现可以使用相同的名称但不同的执行id同时执行。具有相同名称的数据库操作的每次执行都可以包含不同的语句。
使用DBMS_SQL_MONITOR PL/SQL包创建和管理数据库操作。可以使用V$SQL_MONITOR、V$SQL_PLAN_MONITOR和V$SQL_MONITOR_SESSTAT监控操作。
另见:
-
《Oracle Database SQL Tuning Guide》学习如何监视数据库操作
-
《Oracle Database Data Warehousing Guide》了解如何监控长时间运行的负载
-
《Oracle Database PL/SQL Packages and Types Reference》了解更多关于 DBMS_SQL_MONITOR 的信息
-
《Oracle Database Reference》了解更多关于 V$SQL_MONITOR 的信息
服务器进程概述
为某个数据库应用程序创建的服务器进程,可以执行一个或多个下列任务:
- 解析并运行通过应用程序发出的 SQL 语句,包括创建和执行查询计划
-
执行 PL/SQL 代码
- 将数据块从数据文件读入数据库缓冲区高速缓存(将已修改的块写回磁盘是 DBWn 后台进程的任务)
-
返回结果信息,以便应用程序可以进一步处理
另见:
"Stages of SQL Processing"
专用服务器进程
对于专用服务器连接,客户端连接与一个且仅与一个服务器进程相关联。
另见:
-
"Dedicated Server Architecture"
-
"PGA Usage in Dedicated and Shared Server Modes"
共享服务器进程
对于共享服务器连接,客户端应用程序通过网络连接到一个调度器进程,而不是一个服务器进程。例如,20 个客户端进程可能会仅连接到一个单一的调度器进程。
另见:
-
"Shared Server Architecture"
-
"Large Pool"
Oracle数据库如何创建服务器进程
数据库根据连接方法以各种方式创建服务器进程。
连接方法如下:
-
bequeath
SQL*Plus、OCI客户机或其他客户机应用程序直接生成服务器进程。
-
Oracle 网络监听
客户机应用程序通过监听连接到数据库。
-
专门的代理
这是一个创建前台进程的数据库进程。与监听不同,代理驻留在数据库实例中。当使用专用代理时,客户机连接到监听,然后监听将连接传递给专用代理。
当连接不使用 bequeath 时,数据库创建服务器进程如下:
-
客户机应用程序从监听或代理请求一个新连接。
-
监听或代理启动新进程或线程的创建。
-
操作系统创建新进程或线程。
-
Oracle数据库初始化各种组件和通知。
-
数据库移交连接和特定于连接的代码。
如果使用专用代理连接方法,则可以使用DBMS_PROCESS包预先创建服务器进程池。在这种情况下,Process Manager (PMAN)后台进程监视预先创建的进程池,这些进程等待与客户机请求关联。当连接需要服务器进程时,数据库跳过创建进程的步骤2-4,只执行步骤5。这种优化提高了性能。
另见:
-
《Oracle Database PL/SQL Packages and Types Reference》了解DBMS_PROCESS PL/SQL包
-
《Oracle Database Reference》了解PMAN后台流程
后台进程概述
后台进程是多进程Oracle数据库使用的其他进程。后台进程执行操作数据库所需的维护任务,并最大化多用户性能。
每个后台进程都有其单独的任务, 但又与其他进程相互协作。例如,LGWR 进程将重做日志缓冲区中的数据写入到联机重做日志。当已填充的日志文件将被存档时,LGWR 通知另一个进程来归档该文件。
SELECT PNAME
FROM V$PROCESS
WHERE PNAME IS NOT NULL
ORDER BY PNAME;
另见:
《Oracle Database Reference》用于描述所有后台进程
强制性后台进程
强制性后台进程存在于所有典型的数据库配置。
另见:
-
"Read/Write and Read-Only Instances"
-
《Oracle Database Reference》关于其他强制性进程, 包括 MMAN、DIAG、VKTM、DBRM 和 PSP0 等的说明
-
《Oracle Real Application Clusters Administration and Deployment Guide》和《Oracle Clusterware Administration and Deployment Guide》关于 Oracle RAC 和 Oracle 集群件特定的后台进程的详细信息
进程监视器进程 (PMON)组
PMON组包括PMON、清理主进程(CLMN)和清理辅助进程(CLnn)。这些流程负责监视和清理其他流程。
PMON组监视缓冲区缓存的清理和客户机进程使用的资源的释放。例如,PMON组负责重置活动事务表的状态,释放不再需要的锁,并从活动进程列表中删除终止进程的进程ID。
数据库必须确保已终止进程所持有的资源已被释放,以便其他进程可以使用它们。否则,进程可能会阻塞或陷入争用。
进程监视器进程 (PMON)
进程监视器(PMON)检测其他后台进程的终止。如果服务器或调度程序进程非正常终止,则PMON组负责执行进程恢复。进程终止可能有多个原因,包括操作系统 kill 命令或 ALTER SYSTEM KILL SESSION 语句。
清理主进程(CLMN)
PMON将清理工作委托给清理主进程(CLMN)。检测异常终止的任务仍然由PMON来完成。
CLMN定期对已终止的进程、已终止的会话、事务、网络连接、空闲会话、分离事务和已超过空闲超时的分离网络连接进行清理。
清理辅助进程(CLnn)
CLMN将清理工作委托给CLnn辅助进程。
CLnn进程帮助清理终止的进程和会话。辅助进程的数量与要做的清理工作的数量和当前清理的效率成正比。
清理进程可能被阻塞,从而阻止它继续清理其他进程。此外,如果多个进程需要清理,那么清理时间可能很长。由于这些原因,Oracle数据库可以同时使用多个helper进程来执行清理,从而减轻了缓慢的性能。
V$CLEANUP_PROCESS 和 V$DEAD_CLEANUP 视图包含关于 CLMN 清理的元数据。V$CLEANUP_PROCESS 视图为每个清理进程包含一行。例如,如果V$CLEANUP_PROCESS.STATE 是 BUSY,则进程当前正在进行清理。
另见:
《Oracle Database Reference》了解更多关于V$CLEANUP_PROCESS的信息
数据库资源隔离
如果进程或会话终止,则PMON组将所持有的资源释放给数据库。在某些情况下,PMON组可以自动隔离损坏的、不可恢复的资源,这样就不会立即强制终止数据库实例。
PMON组继续对持有隔离资源的进程或会话执行尽可能多的清理。V$QUARANTINE视图包含元数据,比如资源的类型、消耗的内存数量、导致隔离的Oracle错误等等。
另见:
《Oracle Database Reference》 了解更多关于
V$QUARANTINE
Process Manager (PMAN)
Process Manager (PMAN)监视多个后台进程,包括共享服务器、池服务器和作业队列进程。
PMAN监视、生成和停止以下类型的进程:
-
调度程序和共享服务器进程
-
数据库驻留连接池的连接代理和池服务器进程
-
工作队列进程
-
可重新开始的后台进程
监听注册进程(LREG)
监听注册进程(LREG)使用Oracle 网络监听注册关于数据库实例和调度程序进程的信息。
当实例启动时,LREG轮询监听以确定它是否正在运行。如果监听正在运行,则LREG将传递相关参数。如果它不运行,那么LREG会定期尝试与它联系。
另见:
"The Oracle Net Listener"
系统监视器进程(SMON)
系统监视器进程(SMON)负责各种系统级清理职责。
- 如有必要,在实例启动时执行实例恢复。在 Oracle RAC 数据库中,一个数据库实例的 SMON 进程可以为另一个失败的实例执行实例恢复。
- 在实例恢复期间,由于读文件或表空间脱机错误而跳过的已终止事务,由 SMON 进行恢复。当表空间或文件重新联机时,SMON 将恢复该事务。
- 清理未使用的临时段。例如,Oracle 数据库在创建索引时会分配扩展区。如果操作失败,则 SMON 会清理临时空间。
-
合并在字典管理的表空间中的多个连续空闲扩展区。
数据库写入器进程 (DBW)
DBW 进程在下列条件下会将脏缓冲区写入到磁盘:
- 当服务器进程扫描了额定数目的缓冲区后, 仍未找到干净的可重复使用的缓冲区时,它会通知 DBW 执行写入操作。 DBW 尽可能以异步方式将脏缓冲区写入到磁盘,以便同时能执行其他处理。
- DBW 周期性地写出缓冲区,以推进检查点,该点是重做线程中实例恢复开始的位置。 检查点的日志位置由在缓冲区高速缓存中最老的脏缓冲区确定。
另见:
-
"Database Buffer Cache"
-
"Overview of Checkpoints"
-
《Oracle Database Performance Tuning Guide》有关配置、 监测、 和调整 DBW 的建议
日志写入器进程(LGWR)
日志写入器进程(LGWR)管理重做日志缓冲区。
-
用户提交了事务。
-
发生了在线重做日志切换。
-
自 LGWR 最后一次写入到现在超过了三秒。
- 重做日志缓冲区已达到三分之一满,或包含 1 MB 以上被缓冲的数据。
-
DBW 必须将修改的缓冲区写入到磁盘。
在 DBW 可以将脏缓冲区写到磁盘之前,与该缓冲区更改相关联的重做记录必须先被写入磁盘 (预写协议)。如果 DBW 发现一些重做记录尚未写入, 则它通知 LGWR 将记录写入磁盘,并等待 LGWR 完成此工作,然后DBW 才将数据缓冲区写入磁盘。
另见:
"Commits of Transactions"
LGWR 与提交
Oracle 数据库使用快速提交机制来提高已提交事务的性能。
LGWR 和无法访问的文件
LGWR 同步写入联机重做日志文件组的所有活动镜像。
See Also:
-
"How Oracle Database Writes to the Online Redo Log"和"Redo Log Buffer"
-
《Oracle Database Performance Tuning Guide》有关如何监视和调整的 LGWR 性能的信息
检查点进程(CKPT)
图 15-4 检查点进程
Description of "Figure 15-4 Checkpoint Process"
另见:
"Overview of Checkpoints"
可管理性监视器进程(MMON 和 MMNL)
另见:
"Automatic Workload Repository (AWR)"和"Active Session History (ASH)"
恢复器进程(RECO)
另见:
《Oracle Database Administrator’s Guide》有关分布式系统中的事务恢复的详细信息
可选后台进程
可选后台进程即是未定义为强制性的后台进程。
另见:
-
"Oracle Database Advanced Queuing (AQ)"
-
《Oracle Database Reference》有关特定于 AQ 和 ASM 的后台进程的说明
归档器进程(ARCn)
另见:
-
"Archived Redo Log Files"
-
《Oracle Database Administrator’s Guide》了解如何调整归档器进程的个数
-
《Oracle Database Performance Tuning Guide》了解如何调优归档器性能
作业队列进程 (CJQ0 和 Jnnn)
作业队列进程来运行用户作业,通常使用批处理模式。作业是一种用户定义的被计划运行一次或多次的任务。
- Oracle 调度器根据需要会自动启动和停止作业协调器进程 (CJQ0)。协调器进程定期从系统表 JOB$ 中选择需要运行的作业。 被选出的新作业是按时间排序的。
-
协调器进程动态派生出作业队列从属进程 (Jnnn) 来运行作业。
- 作业队列进程运行由 CJQ0 进程选出以备执行的某个作业。每个作业队列进程一次运行一个作业直至完成。
- 在进程完成单个作业的执行后,它会轮询以运行更多工作。如果没有计划的作业可供执行, 则它进入睡眠状态,且周期性地醒来再次轮询以运行更多工作。如果该进程未找到任何新的作业, 则它在一个预设的时间间隔后会终止。
另见:
-
"Oracle Scheduler"
-
《Oracle Database Administrator’s Guide》了解 Oracle 调度器作业
-
《Oracle Database Advanced Queuing User's Guide》了解 AQ 后台进程
闪回数据存档器进程(FBDA)
空间管理协调器进程 (SMCO)
SMCO 进程协调各种空间管理相关的任务。
通常任务包括主动预防性的空间分配和空间回收。SMCO 动态生成从属进程(Wnnn)来执行此任务。
另见:
《Oracle Database Development Guide》了解闪回数据存档和时间历史特性
从属进程
从属进程是为其他进程执行工作的后台进程。
另见:
《Oracle Database Reference》关于 Oracle 数据库从属进程的描述
I/O 从属进程
I/O 从属进程 (Innn) 为不支持异步 I/O 的系统和设备模拟异步 I/O。
数据库支持包括以下不同类型的 I/O 从属进程:
-
恢复管理器 (RMAN)的 I/O 从属进程
当使用 RMAN 备份或还原数据时, 您可以为磁盘和磁带设备使用 I/O 从属进程。 -
数据库写入器从属进程
如果计算机只有一个 CPU,则数据库使用多个写入器进程并不现实,此时数据库可以通过多个从属进程来分布 I/O。 DBWR 是扫描缓冲区高速缓存 LRU 列表中的块以写入到磁盘的唯一进程。 而 I/O 从属进程为这些块执行 I/O。
另见:
-
《Oracle Database Backup and Recovery User’s Guide》了解备份和还原操作中的 I/O从属进程
-
《Oracle Database Performance Tuning Guide》了解数据库写入器从属进程
并行查询 (PX) 服务进程
在并行执行中,多个进程同时协作,来运行一个单一 SQL 语句。
并行执行与串行执行形成对比,在串行执行中,单个服务器进程执行SQL语句顺序执行所需的所有处理。例如,要执行完整的表扫描,例如SELECT * FROM employees,一个服务器进程执行所有的工作,如图15-5所示。
图 15-5 串行全表扫描
Description of "Figure 15-5 Serial Full Table Scan "
另见:
-
《Oracle Database VLDB and Partitioning Guide》 了解并行执行的更多信息
-
《Oracle Real Application Clusters Administration and Deployment Guide》关于在 Oracle RAC 环境中的并行执行的注意事项
查询协调器
在并行执行中,服务器进程充当查询协调器(也称为并行执行协调器)。
查询协调器负责以下工作:
-
解析查询
-
分配和控制并行执行服务器进程
-
向用户发送输出
给定查询的查询计划,协调器将SQL查询中的每个操作符分解为多个并行块,按照查询中指定的顺序运行它们,并集成执行操作符的并行执行服务器生成的部分结果。
分配给单个操作的并行执行服务器的数量是一个操作的并行度。同一SQL语句中的多个操作都具有相同的并行度。
Producers 和 Consumers
并行执行服务器分为 producers 和 consumers。consumers 负责处理他们的数据,然后将其分发给需要它的 consumers。
数据库可以使用多种技术执行分发。两种常见的技术是广播和哈希。在广播中,每个 producer 将行发送给所有 consumers。在哈希中,数据库对一组键计算哈希函数,并使每个 consumer 负责哈希值的子集。
图 15-6 表示 producers 和 consumers 在并行执行以下语句时的相互作用:
SELECT * FROM employees ORDER BY last_name;
执行计划实现对 employees 表的完整扫描。扫描之后是检索到的行。扫描操作中涉及的所有 producer 进程都将行发送到执行排序的适当 consumers 进程。
图 15-6 Producers 和 Consumers
Description of "Figure 15-6 Producers and Consumers"
颗粒
在并行执行中,表被动态划分成多个称为颗粒的加载单元,是访问数据时最小的工作单元。
一个基于块的颗粒是一个由单个并行执行服务器读取的数据块范围(也称为PX服务器),其名 称格式为 Pnnn。为了在并行服务器进程之间获得工作的均匀分布,颗粒的数量总是远远高于所请求的DOP。
图 15-7 显示了在 employees 表上的并行扫描。
图 15-7 并行全表扫描
Description of "Figure 15-7 Parallel Full Table Scan"
另见:
-
《Oracle Database VLDB and Partitioning Guide》学习如何使用并行执行
-
《Oracle Database Data Warehousing Guide》了解并行度初始化参数的建议