ORACE_体系结构001_进程体系结构

进程简介

进程是在操作系统中可以运行一系列步骤的机制。该机制取决于操作系统。例如,在Linux上的一个Oracle后台进程是一个Linux进程。
而在Windows上的一个Oracle后台进程是在某个进程内执行的一个线程。

代码模块由进程来运行。所有已连接的Oracle数据库用户必须运行以下模块来访问数据库实例:

1.应用程序或Oracle数据库实用程序
数据库用户运行一个数据库应用程序,如预编译器程序或数据库工具(如SQL*Plus),来向数据库发出SQL语句。
2.Oracle数据库代码
每个用户都具有为其运行的Oracle数据库代码,以解释和处理应用程序的SQL语句。
进程通常在其自己的私有内存区内运行。大多数进程可以定期写入一个关联的跟踪文件。

多进程Oracle(也称为多用户Oracle)使用几个进程来运行Oracle数据库代码的不同部分,并为用户运行一些其他进程——要么
每个连接的用户一个进程,或由多个用户共享一个或多个进程。大多数数据库都是多用户的,因为数据库的主要优势是管理同时由多个用户所需的数据。

数据库实例中的每个进程执行某个特定的作业。通过将数据库和应用程序的工作划分成几个进程,多个用户和应用程序可以同时连接到实例,
而系统仍可提供较好的性能。

进程的类型

数据库实例包含如下类型的进程,或与以下类型的进程进行交互:
1.客户端进程,运行应用程序或Oracle工具代码。
2.Oracle进程,运行Oracle数据库代码。Oracle进程包括下列子类型:
1).后台进程,与数据库实例同时启动,并执行一些维护任务,如执行实例恢复、清理进程、将重做缓冲区写入磁盘等。
2).服务器进程,基于客户端请求,执行相应的工作。
例如,这些进程解析SQL查询、将查询放入共享池、为查询创建并执行查询计划、和将数据从数据库缓冲区高速缓存(或从磁盘)读入缓冲区。
注意:
服务器进程,和为这些进程分配的进程内存,是在该实例中运行的。当服务器进程终止时,实例仍将继续运行。
3).从属进程,为后台进程或服务器进程执行额外任务。

进程的结构取决于操作系统,以及选择了哪些Oracle数据库选项。例如,已连接用户的代码可能会配置为专用服务器或共享服务器的连接。
在一个共享服务器的体系结构中,每个运行数据库代码的服务器进程可以为多个客户端进程服务。

如果使用专用服务器连接时的系统全局区(SGA)和后台进程。对每个用户连接,应用程序由一个客户端进程来运行,而由其专用服务器
进程来运行数据库代码。每个客户端进程都与其自己的服务器进程相关联,而每个服务器进程都有其自己的程序全局区(PGA)。

客户端进程概述

当用户运行一个应用程序(如Pro*C程序或SQL*Plus)时,操作系统会创建一个客户端进程(有时称为用户进程)来运行用户应用程序。客户端应
用程序具有已链接到进程的Oracle数据库库文件,以提供与数据库进行通信所需的API。

客户端进程和服务器进程

客户端进程和与实例直接交互的Oracle进程在某些重要方面不同。为客户端进程服务的Oracle进程可能会读取或写入SGA,而客户端进程不能。
客户端进程可以在数据库主机之外另一台主机上运行,而Oracle进程不能。

例如,假设在客户端主机上的某个用户启动SQL*Plus,并通过网络连接到另一台主机上的sample数据库(该数据库实例还未启动):
SQL>CONNECTSYS@inst1ASSYSDBA
Enterpassword:*********
Connectedtoanidleinstance.
在客户端主机上,搜索sqlplus或sample相关进程,显示只有sqlplus客户端进程:
%ps-ef|grep-esample-esqlplus|grep-vgrep
clientuser2943729436015:40pts/100:00:00sqlplusassysdba
在数据库主机上,搜索sqlplus或sample相关进程,显示一个非本地连接的服务器进程,但没有客户端进程:
%ps-ef|grep-esample-esqlplus|grep-vgrep
serveruser294411015:40?00:00:00oraclesample(LOCAL=NO)

连接和会话
连接是在客户端进程和数据库实例之间的一条物理通信路径。通信路径使用可用的进程间通信机制或网络软件来建立。通常,连接在客户端进程
和服务器进程(或调度器进程)之间产生,但它也可以在客户端进程与Oracle连接管理器(CMAN)之间产生。

会话是数据库实例内存中的一个逻辑实体,表示登录到数据库的某个当前用户的状态。例如,当用户使用密码通过了数据库身份验证时,会为此
用户建立一个会话。会话的持续时间从用户通过数据库验证开始,直到用户断开连接,或退出数据库应用程序。

在单个连接之上,可以建立0个、1个、或多个会话。这些会话相互独立:一个会话中的事务提交并不会影响其他会话中的事务。

注意:
如果配置了Oracle网络连接池,则可能出现连接已断掉、而会话却保持不变的情况。
单个数据库用户可能会同时运行多个会话。例如,hr用户可能具有到数据库的多个连接。对于专用服务器连接,数据库为每个连接创
建一个服务器进程。只有导致创建该专用服务器进程的客户端进程才能使用它(该会话)。对于共享服务器连接,由多个客户端进程访问单个共
享服务器进程。

生成一个SQL语句执行统计信息的自动跟踪报告,使用SYSTEM用户从SQL*Plus连接到数据库,并启用跟踪,从而创建一个新的会话(包括示例输出)。
有两个会话的单个连接:
SQL>SELECTSID,SERIAL#,PADDRFROMV$SESSIONWHEREUSERNAME=USER;
SIDSERIAL#PADDR
------------------
90913BE2E41C
SQL>SETAUTOTRACEONSTATISTICS;
SQL>SELECTSID,SERIAL#,PADDRFROMV$SESSIONWHEREUSERNAME=USER;
SIDSERIAL#PADDR
------------------
88933BE2E41C
90913BE2E41C
...
SQL>DISCONNECT
DISCONNECT命令实际上只是结束了会话,而未中断连接。打开一个新的终端并以一个不同的用户连接到实例,查看连接仍处于活动状态。
SQL>CONNECTdba1@inst1
Password:********
Connected.
SQL>SELECTPROGRAMFROMV$PROCESSWHEREADDR=HEXTORAW('3BE2E41C');
PROGRAM
------------------------------------------------
oracle@stbcs09-1(TNSV1-V3)
现在上面这个是没有会话的连接。

服务器进程概述

Oracle数据库创建服务器进程,以处理连接到实例的客户端进程的请求。客户端进程总是通过单独的服务器进程与数据库进行通信。

为某个数据库应用程序创建的服务器进程,可以执行一个或多个下列任务:
1.解析并运行通过应用程序发出的SQL语句,包括创建和执行查询计划
2.执行PL/SQL代码
3.将数据块从数据文件读入数据库缓冲区高速缓存(将已修改的块写回磁盘是DBWn后台进程的任务)
4.返回结果信息,以便应用程序可以进一步处理

专用服务器进程
对于专用服务器连接,客户端连接与一个且仅与一个服务器进程相关联。在Linux上,连接到一个数据库实例的20个客户端进程,
有相应的20个服务器进程为其提供服务。
每个客户端进程直接与其服务器进程进行通信。在会话期间,此服务器进程专用于其客户端进程。服务器进程将特定于进程的信息和UGA存储在其PGA中。

共享服务器进程
对于共享服务器连接,客户端应用程序通过网络连接到一个调度器进程,而不是一个服务器进程。例如,20个客户端进程可能会仅连接到一个单一的调度器进程。

调度器进程接收来自已连接客户端的请求,并将它们放入大池中的请求队列。第一个可用的共享服务器进程从队列承接一个请
求并处理之。之后,共享服务器进程将结果放回调度器响应队列。调度器进程会监视此队列,并将结果传回客户端。

与专用服务器进程类似,共享服务器进程也有其自己的PGA。但是,会话的UGA位于SGA中,以便任何共享服务器进程可以访问其中的会话数据。

后台进程概述

多进程Oracle数据库会使用某些称为后台进程的额外进程。后台进程执行操作数据库所需的维护任务,并最大化多用户性能。
每个后台进程都有其单独的任务,但又与其他进程相互协作。例如,LGWR进程将重做日志缓冲区中的数据写入到联机重做日志。当已填充的日志文件
将被存档时,LGWR通知另一个进程来归档该文件。

数据库实例启动时,Oracle数据库将自动创建后台进程。实例可能会有许多后台进程,但并不是所有这些进程在每种数据库配置中都存在。
以下查询列出了在您的数据库上运行的后台进程:
SQL>SELECTPNAMEFROMV$PROCESSWHEREPNAMEISNOTNULLORDERBYPNAME;

PNAME
-----
ARC0
ARC1
ARC2
ARC3
CKPT
D000
DBRM
DBW0
DIA0
DIAG
GEN0
LGWR
MMAN
MMNL
MMON
PMON
PSP0
Q000
Q001
QMNC
RECO
S000
SMCO
SMON
VKTM
W000

26rowsselected.

SQL>

强制性后台进程
强制性后台进程存在于所有典型的数据库配置。默认情况下,这些进程运行在以一个最小化配置的初始化参数文件启动的数据库实例中。
本节介绍以下强制性后台进程:
进程监视器进程(PMON)
系统监视器进程(SMON)
数据库写入器进程(DBWn)
日志写入器进程(LGWR)
检查点进程(CKPT)
可管理性监视器进程(MMONandMMNL)
恢复器进程(RECO)

1.进程监视器进程(PMON)
进程监视器(PMON)监视其他的后台进程,并在某个服务器进程或调度器进程异常终止时执行进程恢复。PMON负责清理数据库缓冲区高速缓存,
并释放客户端进程以前还在使用的资源。例如,PMON重置活动事务表的状态、释放不再需要的锁、并从活动进程列表中删除其进程ID。
PMON还将实例和调度器进程的信息注册到Oracle网络监听器。当实例启动时,PMON轮询监听器以确定它是否正在运行。如果监听器正在运行,
则PMON将有关参数传递给它。如果监听器未运行,则PMON定期尝试联系它。

2.系统监视器进程(SMON)
系统监视器进程(SMON)负责各种系统级清理职责。分配给SMON的职责包括:
1).如有必要,在实例启动时执行实例恢复。在OracleRAC数据库中,一个数据库实例的SMON进程可以为另一个失败的实例执行实例恢复。
2).在实例恢复期间,由于读文件或表空间脱机错误而跳过的已终止事务,由SMON进行恢复。当表空间或文件重新联机时,SMON将恢复该事务。
3).清理未使用的临时段。例如,Oracle数据库在创建索引时会分配扩展区。如果操作失败,则SMON会清理临时空间。
4).合并在字典管理的表空间中的多个连续空闲扩展区。
SMON定期检查是否需要做什么。其他进程在发现需要做什么时,也可以调用SMON来做。

3.数据库写入器进程(DBWn)
数据库写入器进程(DBWn)将数据库缓冲区的内容写入到数据文件中。DBWn进程将数据库缓存中被修改的缓冲区写入到磁盘中.
虽然一个数据库写入进程(DBW0)对于大多数系统来说已经足够,但如果您的系统大量修改数据,您也可以配置额外的写入器进程——从
DBW1到DBW9,和从DBWa到DBWj——来提高写入性能。这些额外的DBWn进程在单处理器系统上用处不大。
DBWn进程在下列条件下会将脏缓冲区写入到磁盘:
1).当服务器进程扫描了额定数目的缓冲区后,仍未找到干净的可重复使用的缓冲区时,它会通知DBWn执行写入操作。
DBWn尽可能以异步方式将脏缓冲区写入到磁盘,以便同时能执行其他处理。
2).DBWn周期性地写出缓冲区,以推进检查点,该点是重做线程中实例恢复开始的位置。
检查点的日志位置由在缓冲区高速缓存中最老的脏缓冲区确定。
在许多情况下,DBWn写入的块将遍布整个磁盘。因此,该写操作往往要比由LGWR执行的顺序写入速度慢。DBWn进程尽可能进行多块写入,
以提高效率。多块写入的数据块数量因操作系统而异。

4.日志写入器进程(LGWR)
日志写入器进程(LGWR)管理重做日志缓冲区。LGWR将缓冲区中的一个连续部分写入联机重做日志。通过分离各种修改数据库缓冲区任务,
将脏缓冲区分散写入到磁盘,而将重做缓冲区顺序写入到磁盘,提高了数据库性能。
在以下的情况下,LGWR将自上次最后写入以来,复制到缓冲区的所有重做条目写入联机重做日志:
1).用户提交了事务。
2).发生了在线重做日志切换。
3).自LGWR最后一次写入到现在超过了三秒。
4).重做日志缓冲区已达到三分之一满,或包含1MB以上被缓冲的数据。
5).DBWn必须将修改的缓冲区写入到磁盘。
在DBWn可以将脏缓冲区写到磁盘之前,与该缓冲区更改相关联的重做记录必须先被写入磁盘(预写协议)。如果DBWn发现一些重做记录尚未写入,
则它通知LGWR将记录写入磁盘,并等待LGWR完成此工作,然后DBWn才将数据缓冲区写入磁盘。

LGWR与提交
Oracle数据库使用快速提交机制来提高已提交事务的性能。当用户发出COMMIT语句时,事务分配到一个系统更改号(SCN)。LGWR将一个提
交记录记入重做日志缓冲区,连同提交SCN和事务的重做条目,并立即写入到磁盘。

重做日志缓冲区是循环的。当LGWR将重做条目从重做日志缓冲区写入到联机重做日志文件时,服务器进程可以复制新条目并覆盖已写入到磁盘的
重做日志缓冲区中的条目。通常LGWR的写入速度足够快,以确保在缓冲区中总会有可用空间供新条目使用,即使对联机重做日志的访问很繁重时也是如此。

包含事务提交记录的重做条目的原子写入,是确定该事务已提交的唯一事件。Oracle数据库向已提交事务返回一个成功代码,虽然数据缓冲区
尚未写入到磁盘。对数据块的相应更改被延迟,直到DBWn在某个有利的时机将它们写到数据文件。

注意:
LGWR可能会在提交事务之前,将重做日志条目写入到磁盘。只有之后提交了事务,这些重做条目才会成为永久性的。
当事务活动很高时,LGWR可能会使用组提交。例如,某个用户提交其事务,导致LGWR将事务的重做条目写入到磁盘。在此写操作的过程中,其他用户
也试图提交。但LGWR无法写入磁盘以提交这些事务,直到前面的写入完成为止。完成后,LGWR可以将(尚未提交的)等待事务中的重做条目列表在一
个操作中全部写入。通过这种方式,数据库最小化了磁盘I/O,而最大化了性能。如果提交请求继续维持在一个高的水平,则每个LGWR写入操作都可能
包含多个提交记录。

LGWR和无法访问的文件
LGWR同步写入联机重做日志文件组的所有活动镜像。如果某个日志文件不可访问,则LGWR继续写入组中的其他文件,并在LGWR跟踪文件和警报日志
中记录一个错误。如果组中的所有文件都损坏,或者如果因为尚未存档而不可用,则LGWR不能继续工作。

5.检查点进程(CKPT)
检查点进程(CKPT)使用检查点信息更新控制文件和数据文件头,并通知DBWn将块写入磁盘。检查点信息包括检查点位置、SCN、联机重做日志中的起
始恢复位置等等。
CKPT不会将数据块写入数据文件,也不会将重做块写入联机重做日志文件。

6.可管理性监视器进程(MMON和MMNL)
可管理性监视器进程(MMON)执行许多与自动工作负载存储库(AWR)相关的任务。例如,当某个度量超出其阈值时,MMON会写入信息,并拍摄快照,
捕获最近修改的SQL对象的统计信息。
可管理性监视器轻量进程(MMNL)将SGA中的活动会话历史(ASH)缓冲区统计信息写入磁盘。当ASH缓冲区已满时,MMNL将其写入到磁盘。

7.恢复器进程(RECO)
在一个分布式数据库中,恢复器进程(RECO)会自动解决在分布式事务中的故障。一个节点的RECO进程会自动连接到可疑分布式事务中涉及的其他数据库。
当RECO数据库之间重新建立了连接后,它会自动解决所有可疑事务,从每个数据库事务表中删除任何与可疑事务对应的未决事务行。

可选后台进程

可选后台进程即是未定义为强制性的后台进程。大多数可选后台进程是特定于任务或功能特性的。例如,支持Oracle流高级队列(AQ)或Oracle自
动存储管理(OracleASM)的后台进程,只有在启用这些功能时才可用。

本节将介绍一些常见的可选流程:
ArchiverProcesses(ARCn)
JobQueueProcesses(CJQ0andJnnn)
FlashbackDataArchiverProcess(FBDA)
SpaceManagementCoordinatorProcess(SMCO)

1.归档器进程(ARCn)
重做日志切换发生后,归档器进程(ARCn)将联机重做日志文件复制到脱机存储。这些进程也可能会收集事务重做数据,并将其传送到备用数据库目标位置。
仅当数据库处于归档模式下且启用了自动归档时,才存在ARCn进程。
2.作业队列进程(CJQ0和Jnnn)
Oracle数据库使用作业队列进程来运行用户作业,通常使用批处理模式。作业是一种用户定义的被计划运行一次或多次的任务。例如,您可以使用作业队
列来计划一个在后台长时间运行的更新任务。给定一个开始日期和时间间隔,作业队列进程尝试在下一个间隔重新运行该作业。
Oracle数据库动态管理作业队列进程,以使作业队列客户端在需要时能使用更多作业队列进程。当这些新启动的进程处于空闲状态时,数据库会释放其资源。

动态作业队列进程可能会在某个给定的时间间隔同时运行大量的作业。事件的顺序如下所示:
1).Oracle调度器根据需要会自动启动和停止作业协调器进程(CJQ0)。协调器进程定期从系统表JOB$中选择需要运行的作业。
被选出的新作业是按时间排序的。
2).协调器进程动态派生出作业队列从属进程(Jnnn)来运行作业。
3).作业队列进程运行由CJQ0进程选出以备执行的某个作业。每个作业队列进程一次运行一个作业直至完成。
4).在进程完成单个作业的执行后,它会轮询以运行更多工作。如果没有计划的作业可供执行,则它进入睡眠状态,且周期性地醒来再次轮询以运行更多工作。
如果该进程未找到任何新的作业,则它在一个预设的时间间隔后会终止。

初始化参数JOB_QUEUE_PROCESSES表示在实例上可以同时运行的作业队列进程的最大数目。然而,客户端不应假定所有作业队列进程都可用于执行作业。
注意:
如果初始化参数JOB_QUEUE_PROCESSES被设置为0,则不会启动协调器进程。

2.闪回数据存档器进程(FBDA)
闪回数据归档器进程(FBDA)将跟踪表的历史行归档到闪回数据归档区。当跟踪表中包含DML的事务提交时,该进程将行的前像存储到闪回数据存档区。
它也会保存当前行上的元数据。
FBDA自动管理闪回数据存档的空间、组织、和保留期等。此外,该进程会跟踪被跟踪的事务归档已发生了多久。

3).空间管理协调器进程(SMCO)
SMCO进程协调各种空间管理相关的任务,比如主动预防性的空间分配和空间回收。SMCO动态生成从属进程(Wnnn)来执行此任务。

从属进程

从属进程是为其他进程执行工作的后台进程。本部分介绍一些Oracle数据库使用的从属进程。

1.I/O从属进程

I/O从属进程(Innn)为不支持异步I/O的系统和设备模拟异步I/O。异步的I/O没有传输时间要求,使其他进程可以在完成传输之前就可以开始。

例如,假定应用程序在一个不支持异步I/O的操作系统上写入1000个块到磁盘。每次写入都是顺序发生的,并等待一个写操作已成功的确认。
而对于异步磁盘,应用程序可以大容量写入数据块,并在等待操作系统确认写入完的同时执行其他工作。

为模拟异步I/O,由一个进程监督几个从属进程。调用者进程将工作分配给每个从属进程,从属进程会等待每个写操作完成,并在完成后报告调用者。
在真正的异步I/O中,操作系统会等待I/O完成,并在完成时报告主进程,而在模拟异步I/O中,从属进程会等待,并在完成时报告调用者。

数据库支持包括以下不同类型的I/O从属进程:
1).恢复管理器(RMAN)的I/O从属进程
当使用RMAN备份或还原数据时,您可以为磁盘和磁带设备使用I/O从属进程。
2).数据库写入器从属进程
如果计算机只有一个CPU,则数据库使用多个写入器进程并不现实,此时数据库可以通过多个从属进程来分布I/O。DBWR是扫描缓冲区高速
缓存LRU列表中的块以写入到磁盘的唯一进程。而I/O从属进程为这些块执行I/O。

2.并行查询从属进程
在并行执行或并行处理中,多个进程同时协作,来运行一个单一SQL语句。通过在多个进程之间分配工作,Oracle数据库可以更快地运行语句。
例如,四个进程分别处理一年中四个不同的季度,而不是由一个进程处理所有四个季度。
并行执行减少了在大型数据库(如数据仓库)上的数据密集型操作的响应时间。对称多处理(SMP)和集群系统能从并行执行获得最大的性能优势,
因为语句处理可以在多个CPU之间划分。并行执行也可以使某些类型的OLTP和混合系统受益。
在OracleRAC系统中,由特定服务的服务配置控制并行执行。具体而言,并行进程在已配置服务的多个节点上运行。默认情况下,Oracle数据库
只在提供数据库连接服务的实例上运行并行进程。这并不影响其他并行操作,如并行恢复或对GV$查询的处理。

串行执行
在串行执行中,由单个服务器进程,执行顺序执行的某个SQL语句的所有必要处理。例如,执行一个全表扫描(如SELECT*FROMemployees),
由一个服务器进程执行所有的工作。

并行执行
在并行执行中,服务器进程作为并行执行协调器,负责解析查询、分配和控制从属进程、并将输出发送给用户。给定一个SQL查询的查询计划,
协调器将SQL查询中的每个运算符分解成一些平行的片断、并按查询中指定的顺序运行它们,最后又将这些执行各个操作的从属进程所产生的
部分结果集成起来。
比如在employees表上的并行扫描。表被动态划分(动态分区)成多个称为颗粒的加载单元。每个颗粒是一个由单个从属进程读取的数据块范围,
这些从属进程叫做并行执行服务器,其名称格式为Pnnn。
数据库在执行时将颗粒映射到执行服务器。当一个执行服务器完成对某个颗粒对应行的读取,而此时还有其它颗粒要读取时,该执行服务器从协调
器获取另一个颗粒。此操作将继续,直到读取完整个表。执行服务器向协调器发送执行结果,协调器再将这些片断合并成最终所需的全表扫描结果。

分配给单个操作的并行执行服务器的数量是操作的并行度。在同一SQL语句中的多个操作都具有相同的并行度。




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值