第九章 进程结构Oracle概念中译本Word文件下载.docx
《第九章 进程结构Oracle概念中译本Word文件下载.docx》由会员分享,可在线阅读,更多相关《第九章 进程结构Oracle概念中译本Word文件下载.docx(16页珍藏版)》请在冰豆网上搜索。
![第九章 进程结构Oracle概念中译本Word文件下载.docx](https://file1.bdocx.com/fileroot1/2023-1/10/39745238-903e-4361-8304-32323f437d77/39745238-903e-4361-8304-32323f437d771.gif)
进程结构针对不同的Oracle配置、不同的操作系统和Oracle附件的选择都会有所不同。
连接用户的代码可以配置为共享服务器或者专用服务器。
在专用服务器情况下,对每个用户来说,数据库应用程序运行的进程(用户进程)和Oracle数据库服务器代码运行的进程(专用服务器进程)不同。
在共享服务器下,数据库应用程序运行在和Oracle数据库代码不同的进程上(用户进程)。
每个运行Oracle服务器代码的服务器进程(共享服务器进程)可以对多个用户进程服务。
图9-1显示了一个专用服务器配置。
每个连接用户都有一个单独的用户进程,多个进程运行在Oracle后台。
图9-1一个Oracle实例
图9-1可以描述多个并发用户在同一个计算机上运行一个应用程序(Oracle)。
这个特定的配置通常在大型机或微型机上出现。
用户进程概述
当一个用户运行一个应用程序(例如Pro*C程序)或者一个Oracle工具(比如企业管理器或者SQL*Plus),Oracle创建一个用户进程来运行用户的应用程序。
连接和会话
连接和会话跟用户进程紧密联系,但含义上也有不同。
连接是用户进程和Oracle实例之间的连接通道。
一个连接通道使用进程间通讯机制(在一台计算机上同时运行用户进程和Oracle)或者网络软件(当数据库应用程序和Oracle运行在不同的机器上通过网络连接)。
一个会话是一个用户通过用户进程到Oracle实例的特定连接。
例如,当用户启动SQL*Plus,用户必须提供一个有效用户名和密码,然后会为那个用户创建一个会话。
一个会话从用户连接时开始,用户中断连接或者退出数据库应用程序时终止。
多个会话可以通过使用同一个用户名密码的用户创建和并发存在。
例如,一个用户使用SCOTT/TIGER的用户名密码来可以多次连接同一个Oracle实例。
不使用共享服务器的情况下,Oracle为每个用户会话创建一个服务器进程。
但是,在共享服务器下,多个用户会话可以共享一个服务器进程。
Oracle进程概述
这部分描述了运行Oracle数据库服务器代码的两类进程(服务器进程和后台进程)。
它还描述了跟踪文件和警告文件,这些文件记录了Oracle进程的数据库事件。
服务器进程
Oracle创建服务器进程来处理连接到这个实例的用户进程的请求。
在应用程序和Oracle运行在一台机器的情况下,可以将用户进程和对应的服务器进程合并来降低系统开销。
但是,当应用程序和Oracle在不同的计算机上运行时,用户进程总是通过不同的服务器进程连接Oracle。
为每个用户应用程序创建的服务器进程(或者合并的用户/服务器进程的服务器部分)可以执行下列任务:
◆解析和运行应用程序发布的SQL语句
◆如果SGA中不存在一些数据块的数据,服务器进程会从磁盘上的数据文件读取必要的数据块到SGA的共享服务器缓存中。
◆以应用程序可以处理的信息方式返回结果。
后台进程
为获得最高的性能和适应多用户,一个多进程Oracle系统使用一些叫做后台进程的额外Oracle进程。
一个Oracle实例可以有很多后台进程;
但不是所有的都必须存在。
后台进程数量很多。
查看视图V$BGPROCESS可以得到关于后台进程的信息。
一个Oracle实例中的后台进程可以包含下列进程:
◆数据库写入进程(DatabaseWriterProcess,DBWn)
◆日志写入进程(LogWriterProcess,LGWR)
◆检查点进程(CheckpointProcess,CKPT)
◆系统监视进程(SystemMonitorProcess,SMON)
◆进程监视进程(ProcessMonitorProcess,PMON)
◆恢复进程(RecovererProcess,RECO)
◆任务队列进程(JobQueueProcesses)
◆归档进程(ARCn)
◆队列监控进程(QueueMonitorProcesses,QMNn)
◆其他后台进程
在许多操作系统上,后台进程在实例启动时自动创建。
图9-2显示了每个后台进程如何和Oracle数据库的不同部分交互,下一部分会描述每个进程。
图9-2多进程Oracle实例的后台进程
数据库写入进程(DatabaseWriterProcess,DBWn)
数据库写入进程(DBWn)将缓存中的条目写入数据文件。
DBWn进程的责任是将数据库高速缓存中修改的(脏)缓存写入磁盘。
虽然一个数据库写入进程(DBW0)对于大多数系统都足够了,但是如果你的系统数据修改的压力很大,你可以配置额外的进程(DBW1到DBW9和DBWa到DBWj)来提供写入性能。
这些额外的DBWn进程对于单处理器系统来说没什么用处。
当数据库高速缓存的一段缓存修改时,它就被标识为“脏”的。
一个“冷”缓存是根据LRU(最近最少使用)机制最近没有使用的一段缓存。
DBWn进程将冷的、脏的缓存写入磁盘,所以用户进程能够找到可以使用的冷的、清理的缓存来读取新的块到高速缓存中。
随着用户进程不停的弄“脏”缓存,空闲缓存的数量会减少。
如果空闲缓存的数量下降的太多,用户进程就不能找到新的空闲缓存来从磁盘上读取块到高速缓存中。
DBWn管理高速缓存,所以用户进程总能找到空闲的缓存。
通过写入“冷”、“脏”缓存到磁盘,DBWn提高了查找空闲缓存的性能,并在内存中保持了最近使用的缓存。
例如,经常访问的小表或索引的一部分块都保存在高速缓存中,所以它们不需要从磁盘重新读入。
LRU机制确保了最常访问的块保存在高速缓存中,所以当一个缓存写入磁盘,它一般不包括最近经常使用的数据。
初始化参数DB_WRITER_PROCESSES指定了DBWn进程的数量。
最大的DBWn进程数量为20。
如果用户在启动时没有指定这个参数,Oracle根据CPU和处理器组的数量来设置DB_WRITER_PROCESSES参数。
DBWn进程在下列情况下将“脏”缓存写入磁盘:
◆当一个服务器进程搜索了极限数量的缓存也没有找到干净可用的缓存之后,它发信号给DBWn来写入。
DBWn异步的将脏缓存写入磁盘,同时不影响其他进程执行。
◆DBWn定期写入缓存来推进检查点(checkpoint),检查点是实例恢复时重做日志的开始位置。
这个日志位置由高速缓存中的最旧的“脏”缓存决定。
在所有的情况下,DBWn执行批量(多块)写入来提供效率。
多块写入的块数量因操作系统而异。
日志写入进程(LogWriterProcess,LGWR)
日志写入进程(LGWR)的职责是重做日志缓存管理:
将重做日志缓存写入到磁盘的重做日志文件中。
LGWR将上次写入以来已经拷贝到缓存中的所有重做条目写入重做日志文件。
重做日志缓存是一个循环缓存。
当LGWR将重做日志缓存的重做条目写入重做日志时,服务器进程可以在已经写入到磁盘的重做日志缓存的条目上拷贝新的条目。
LGWR通常写入速度很快,即使在重做日志访问很繁忙的情况,也可以确保总有新的缓存空间来容纳新的条目。
LGWR将缓存中的一段连续部分写入磁盘。
LGWR在下列情况下写入磁盘:
◆当用户进程提交一个事务产生了提交记录
◆重做日志缓存
✧每3秒钟
✧当重做日志缓存1/3满时
✧当一个DBWn进程在需要时将修改的缓存写入磁盘时
注意:
在DBWn写入修改的缓存到磁盘之前,所有缓存修改的相关重做日志必须写入到磁盘(先写入协议)。
如果DBWn发现某些重做记录没有写入磁盘,它会给LGWR发信号要求LGWR将重做记录写入磁盘,并且等待LGWR将重做日志缓存完全写入磁盘之后,DBWn才将数据缓存写入到磁盘。
LGWR同时写入镜像组的重做日志文件。
如果组中的一个文件损坏或者不可用,LGWR继续写入到组的其他文件中,并在LGWR跟踪文件和系统警告文件中记录一个错误日志。
如果组内的所有文件都损坏了,或者因为组还没有被归档导致组不可用,LGWR就不能继续发挥作用。
当用户发布一个COMMIT语句,LGWR在重做日志缓存中放入一个提交记录,并立即将它和事务重做条目写入到磁盘中。
数据块的对应的改变会在以后写入效率较高的时候再写入。
这叫做快速提交机制。
将包含事务提交记录的重做条目写入磁盘是个原子操作,它代表着事务已经提交。
Oracle会返回一个事务成功提交的代码,虽然缓存的数据还没有写入到磁盘。
有时候,如果需要更多缓存空间,LGWR会在一个事务提交之前写入重做日志条目。
这些条目只有在事务以后提交的时候才是持久性的。
当一个用户提交一个事务,事务会被分配一个系统修改号(systemchangenumber,SCN),SCN和事务重做条目一起写入到重做日志中。
SCN记录在重做日志中,所以恢复操作可以在真正应用集群(RAC)和分布式数据库中同步。
在系统非常活跃时,LGWR可以使用组提交的方式写入重做日志文件。
例如,假设一个用户提交一个事务。
LGWR必须将事务重做条目写入到磁盘,但同时,另一个用户也发布COMMIT语句。
但是,LGWR必须先完成前面的写操作才可以在重做日志中写入来提交这个事务。
在第一个事务条目写入到重做日志文件之后,整个的等待写入的重做日志条目(还没有提交的)可以在一个操作中写入到磁盘,这样比单独写入整个事务条目要节省磁盘I/O。
因而,Oracle最小化了磁盘I/O,最大化LGWR的性能。
如果提交请求频率很高,然后LGWR从重做日志缓存的每个写入都可以包含多个提交记录。
检查点进程(CheckpointProcesss,CKPT)
当检查点发生时,Oracle必须更新所有数据文件的首部来记录检查点的详细信息。
这个是CKPT进程做的。
CKPT进程不负责写入块到磁盘,DBWn完成这项工作。
DBWR检查点统计在企业管理器的System_Statistics中显示了需要完成的检查点数量。
系统监控进程(SystemMoniorProcess,SMON)
系统监控进程(SMON)在实例开始时执行必要的恢复。
SMON还负责清理不再使用的临时段和在字典管理的表空间中合并临近的空闲区段。
如果在实例恢复中因为文件读或者离线错误导致跳过一些结束的事务,在表空间或文件重新在线时SMON会恢复它们。
SMON通常自己检查是否需要启动。
其他的进程也可以在它们认为需要的时候调用SMON。
在真正应用集群中,一个实例的SMON进程可以针对CPU失败或者实例失败执行实例恢复。
进程监控进程(PMON)
进程监控进程(PMON)在用户进程失败时执行进程恢复。
PMON负责清理这个用户正在使用的数据库高速缓存和释放这个用户进程正在使用的资源。
例如,它重置了活动事务表的状态,释放了锁,从活动进程列表中移除进程ID。
PMON定期检查调度器和服务器进程的状态,重启任意停止运行的进程(Oracle有意中断的除外)。
PMON还对网络监听器注册实例信息和调度器进程。
和SMON一样,PMON通常查看是否需要它,如果其他进程发现需要它可以调用PMON。
恢复进程(RecovererProcess,RECO)
恢复进程(RECO)是用于分布式数据库配置的一个后台进程,自动解决失效的分布式式事务。
一个节点的RECO进程自动连接一个存疑的分布式事务涉及的另外一个数据库。
当RECO进程在相关数据库服务器之间重建连接时,它自动解决所有存疑事务,从每个数据库未决事务表中移除对应的存疑事务的行。
如果RECO进程无法连接远程服务器,RECO自动在一个时间间隔之后重新连接。
但是,RECO在重新连接之前等待的时间间隔以指数级增长。
RECO进程只有在实例允许分布式事务才存在。
当前并发的分布式事务数目并没有限制。
任务队列进程
任务队列进程用来批量处理。
它们运行用户任务。
它们在一个Oracle实例中显示为一个调度服务,可以将PL/SQL语句或者过程来作为调度任务。
给定一个开始时间和间隔,任务队列进程会在下一个时间间隔到达时运行一个任务。
任务队列进程是动态管理的。
它允许任务队列客户端在需要时使用更多的任务队列进程。
新进程使用的资源在它们空闲时会被释放。
动态任务队列进程可以运行在给定的时间间隔内并发运行大量的任务。
任务队列进程按照CJG进程分配它们的样子运行用户任务。
这就是发生的事情:
1、协调进程(名称为CJQ0)定期从系统表JOB$中查找需要运行的任务。
新任务的选择按照时间来排序。
2、CJQ0进程动态产生任务队列子进程(J000.....J999)来运行任务。
3、任务队列进程运行CJQ进程选择的任务中的一个来运行。
进程一次运行一个任务。
4、进程完成完成执行一个任务之后,它轮询更多的任务。
如果没有任务需要调度执行,那么它进入休眠状态,然后它定期醒来,轮询更多的任务。
如果进程没有找到更多的新任务,那么在预先设定的间隔后退出。
初始化参数JOB_QUEUE_PROCESSES代表了一个实例中可以并发运行的最大数据的任务队列进程。
因而,客户端不应该假定所有的任务队列都可以作为任务执行。
协调器进程在初始化参数JOB_QUEUE_PROCESSES设置为0时不启动。
归档进程(ARCn)
归档进程(ARCn)在日志切换后将重做日志文件拷贝到不同的存储设备上。
ARCn进程只有在数据库处于归档日志模式(ARCHIVELOG)时存在,这时候启动了自动归档。
一个Oracle实例可以用10个ARCn进程(ARC0和ARC9)。
LGWR进程在当前数量的ARCn进程无法处理当前负载时会启动一个新的ARCn进程。
LGWR启动一个新的ARCn进程会在警告日志中保存一个记录。
如果你预料到归档负载会很重,比如批量装载数据,你可以使用初始化参数LOG_ARCHIVE_MAX_PROCESSES来指定多个归档进程。
通过ALTERSYSTEM语句修改这个参数值可以动态的增加和减少ARCn的数量。
但是,你不必要修改这个参数的默认值(为1),因为系统会根据需要确定ARCn进程的数量,LGWR在数据库负载需要时会自动启动更多ARCn进程。
队列监控进程(QMNn)
队列监控进程(QMNn)是Oracle流高级队列的一个可选后台进程,它负责监控消息队列。
你可以配置达10个的队列监控进程。
这些进程和任务队列进程类似,和其他Oracle后台进程的不同点在于QMNn和任务队列进程的失败不会造成实例失败。
其他后台进程
还有一些可能运行的其他后台进程。
它们包括下列:
MMON执行不同的后台任务的相关管理工作,例如:
◆当给定的规格违背了阀值发布警告
◆通过产生额外的进程(MMON子进程)来产生快照
◆捕捉最近修改的SQL对象的统计值。
MMNL执行经常性和轻量级的相关任务管理,例如会话历史捕捉和规格计算。
MMAN用来内部数据库任务。
RBAL在自动存储管理实例中协调重新平衡工作。
它在一个自动存储管理磁盘上执行全面打开。
ORBn在自动存储管理实例中执行实际的重新均衡数据区段移动。
可能同时有很多这个进程,ORB0,ORB1或者更多。
OSMB在使用自动存储管理磁盘组的数据库实例中出现。
它负责连接自动存储管理实例。
跟踪文件和警告文件
每个服务器和后台进程可以写入相关的跟踪文件。
当一个进程检测到一个内部错误,它将错误信息写入到跟踪文件中。
如果发生一个内部错误,错误信息写入了跟踪文件,管理员应该联系Oracle支持服务。
一个后台进程关联的所有跟踪文件名称都包含产生这个跟踪文件的进程名称。
一个例外是有任务队列进程(Jnnn)产生的跟踪文件。
跟踪文件的额外信息可以对调整应用程序或者实例提供指导。
后台进程总是在适当的时候将信息写入到跟踪文件。
每个数据库都有一个altet.log文件。
数据库的警告日志是一个消息和错误的按时间排列的日志,包括下列信息:
◆发生的所有内部错误(ORA-600),块讹误错误(ORA-1578)和死锁信息(ORA-60)
◆后勤操作,例如SQL语句CREATE/ALTER/DROPDATABASE/TABLESPACE和企业管理器或者SQL*Plus语句STARTUP,SHUTDOWN,ARCHIVELOG和RECOVER。
◆共享服务器和调度器进程的功能相关的信息和错误
◆实体化视图自动刷新的错误。
Oracle使用警告日志来保存这些事件,作为在操作员终端显示信息的替代方案。
(某些系统还在终端显示这些信息)如果一个管理员操作成功了,警告日志中会写入这个消息,包括时间戳和“completed”。
共享服务器架构
共享服务器进程减少了针对每个连接创建一个专用服务器进程的必要性。
一个调度器将多个到达的网络会话指向一个共享服务器进程的池。
服务器进程共享池中的一个空闲共享服务器进程从一个通用队列中获取一个请求,这意味着很少的共享服务器可以像更多专用服务器那样处理相同数目的进程。
而且,因为每个用户需要的内存量是相对较少的,所以需要更少的内存和进程管理,可以支持更多的用户。
共享服务器系统需要大量不同的进程:
◆一个网络监听器将用户进程连接到调度器或者专用服务器(监听器进程是Oracle网络服务的一部分,不是Oracle的一部分)
◆一个或多个调度器进程
◆一个或多个共享服务器进程
共享服务器进程需要Oracle网络服务或者SQL*Net版本2。
为使用共享服务器,一个用户进程必须通过Oracle网络服务或SQL*Net版本2连接,即使进程和Oracle实例运行在同一台机器上。
当一个实例启动时,网络监听器进程打开并建议一个用户连接Oracle的通讯通道。
那么,每个调度器进程给监听器进程一个地址,在这个地址上,调度器监听连接的请求。
至少需要配置和启动至少一个针对数据库客户端使用的每个网络协议的调度器进程。
当一个用户进程创建一个连接请求,监听器检查这个请求,确定是否这个用户进程可以使用共享服务器进程。
如果可以,监听器返回负载较轻的调度器进程地址,用户进程直接和调度器连接。
某些用户进程不能连接调度器,所以网络监听器进程不能将它们和调度器连接。
在这种情况下,或者用户进程请求一个专用服务器,监听器会创建一个专用服务器并建立一个合适的连接。
Oracle共享服务器架构提高了应用程序的伸缩性和同时连接数据库的客户端数量。
它可以在不修改应用程序本身的情况下提高现有应用程序的性能。
调度器请求和回应队列
用户的一个请求是一个单独的程序接口调用,是用户SQL语句的一部分。
当一个用户创建一个调用,它的调度器将这个请求放入到请求队列中,下一个共享服务器进程从这里拾起这个请求。
请求队列在SGA中,对于实例中的所有调度器进程是公用的。
共享服务器进程搜索公用的请求队列来寻找新的请求。
捡起请求是按照先进先出规则的。
一个共享服务器从队列中捡起一个请求,然后执行所有需要的数据库调用来完成这个请求。
当服务器完整这个请求时,它将回应放入正在调用的调度器的回应队列中。
每个调度器都在SGA中有它自己的回应队列。
调度器然后返回完整的回应给适当的用户进程。
例如,在一个订单系统中,每个店员的用户进程连接到调度器,每个店员的请求被发送到一个调度器,它将请求放到请求队列中。
下一个可用的共享服务器进程捡起请求、处理它、将回应放回到回应队列中。
当一个店员的请求完成,店员和调度器保持连接,但是处理请求的共享服务器进程被释放,可以处理其他请求。
当一个店员和顾客说话时,另外的店员可以使用同一个共享服务器进程。
图9-3显示了用户进程如何通过程序接口连接调度器和调度器如何将用户的请求和共享服务器进程通讯。
图9-3共享服务器进程配置和处理
调度器进程
调度器进程通过允许用户进程共享有限数目的服务器进程来支持共享服务器配置。
在共享服务器情况下,相同数目的用户只需要更少的共享服务器进程。
因而,共享服务器可以支持大量数目的用户,特别是客户端/服务器环境下,这里客户端应用程序和服务器在不同的计算机上操作。
你可以对单个数据库实例创建多个调度器进程。
至少对Oracle使用的每个网络协议要创建一个调度器。
数据库管理员启动的调度器进程的最优数量依赖于操作系统限制和每个进程的连接数量,可以在实例运行时增加和移除调度器进程。
最终用户进程必须通过Oracle网络服务或者SQL*Net版本2连接调度器。
即使两个进程都运行在一台机器上。
在共享服务器配置下,一个网络监听器进程从客户端应用程序接受连接请求并将每个请求路由给一个调度器进程。
如果它不能将客户端应用程序连接到调度器上,监听器进程会启动一个专用服务器进程,然后将客户端应用程序和专用服务器连接。
监听器进程不是Oracle实例的一部分,是网络服务的一部分,只是和Oracle协同工作而已。
共享服务器进程(SharedServerProcesses,Snnn)
在共享服务器配置下,每个共享服务器进程对多个客户端请求服务。
共享服务器进程和专用服务器进程提供相同的功能,除了共享服务器进程不和特定的用户进程关联。
相反,在共享服务器配置下,一个共享服务器进程对可以任何客户端请求服务。
共享服务器进程的PGA不包括用户关联数据(所有共享服务器进程都可以访问这些数据)。
共享服务器进程的PGA只包含堆栈空间和进程特定变量。
所有会话相关信息都在SGA中。
每个共享服务器需要能够访问所有会话的数据空间,这样任何服务器可以处理任何会话的请求。
每个会话的数据空间在SGA中分配。
你可以通过在用户概要文件中设置资源限制PRIVATE_SGA(可用的空间数量)来限制会话可以分配的空间数量。
Oracle根据请求队列的长度来动态调整共享服务器的数量。
共享服务器的可创建数量范围在初始化参数SHARED_SERVERS和MAX_SHARED_SERVERS。
共享服务器的限制操作
特定的管理操作不能在连接调度器进程时执行,包括关闭或启动一个实例和媒体恢复。
在连接调度器进程时想执行上述操作会发布一个错误。
这些动作都是在管理员权限连接才能执行。
当你想在共享服务器配置下以管理员权限连接系统,你必须在你的连