第九章进程结构 Oracle概念中译本

发布 2019-07-08 09:46:55 阅读 1831

在共享服务器下,数据库应用程序运行在和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。

为每个用户应用程序创建的服务器进程(或者合并的用户/服务器进程的服务器部分)可以执行下列任务:

解析和运行应用程序发布的sql语句。

如果sga中不存在一些数据块的数据,服务器进程会从磁盘上的数据文件读取必要的数据块到sga的共享服务器缓存中。

以应用程序可以处理的信息方式返回结果。

为获得最高的性能和适应多用户,一个多进程oracle系统使用一些叫做后台进程的额外oracle进程。

一个oracle实例可以有很多后台进程;但不是所有的都必须存在。后台进程数量很多。查看视图v$bgprocess可以得到关于后台进程的信息。

一个oracle实例中的后台进程可以包含下列进程:

数据库写入进程(database writer process,dbwn)

日志写入进程(log writer process,lgwr)

检查点进程(checkpoint process,ckpt)

系统监视进程(system monitor process,smon)

进程监视进程(process monitor process,pmon)

恢复进程(recoverer process,reco)

任务队列进程(job queue processes)

归档进程(arcn)

队列监控进程(queue monitor processes,qmnn)

其他后台进程。

在许多操作系统上,后台进程在实例启动时自动创建。

图9-2显示了每个后台进程如何和oracle数据库的不同部分交互,下一部分会描述每个进程。

图9-2 多进程oracle实例的后台进程。

数据库写入进程(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执行批量(多块)写入来提供效率。多块写入的块数量因操作系统而异。

日志写入进程(lgwr)的职责是重做日志缓存管理:将重做日志缓存写入到磁盘的重做日志文件中。lgwr将上次写入以来已经拷贝到缓存中的所有重做条目写入重做日志文件。

重做日志缓存是一个循环缓存。当lgwr将重做日志缓存的重做条目写入重做日志时,服务器进程可以在已经写入到磁盘的重做日志缓存的条目上拷贝新的条目。lgwr通常写入速度很快,即使在重做日志访问很繁忙的情况,也可以确保总有新的缓存空间来容纳新的条目。

lgwr将缓存中的一段连续部分写入磁盘。lgwr在下列情况下写入磁盘:

当用户进程提交一个事务产生了提交记录。

重做日志缓存。

每3秒钟。当重做日志缓存1/3满时。

当一个dbwn进程在需要时将修改的缓存写入磁盘时。

注意:在dbwn写入修改的缓存到磁盘之前,所有缓存修改的相关重做日志必须写入到磁盘(先写入协议)。如果dbwn发现某些重做记录没有写入磁盘,它会给lgwr发信号要求lgwr将重做记录写入磁盘,并且等待lgwr将重做日志缓存完全写入磁盘之后,dbwn才将数据缓存写入到磁盘。

lgwr同时写入镜像组的重做日志文件。如果组中的一个文件损坏或者不可用,lgwr继续写入到组的其他文件中,并在lgwr跟踪文件和系统警告文件中记录一个错误日志。如果组内的所有文件都损坏了,或者因为组还没有被归档导致组不可用,lgwr就不能继续发挥作用。

当用户发布一个commit语句,lgwr在重做日志缓存中放入一个提交记录,并立即将它和事务重做条目写入到磁盘中。数据块的对应的改变会在以后写入效率较高的时候再写入。这叫做快速提交机制。

将包含事务提交记录的重做条目写入磁盘是个原子操作,它代表着事务已经提交。oracle会返回一个事务成功提交的**,虽然缓存的数据还没有写入到磁盘。

注意:有时候,如果需要更多缓存空间,lgwr会在一个事务提交之前写入重做日志条目。这些条目只有在事务以后提交的时候才是持久性的。

当一个用户提交一个事务,事务会被分配一个系统修改号(system change number,scn),scn和事务重做条目一起写入到重做日志中。scn记录在重做日志中,所以恢复操作可以在真正应用集群(rac)和分布式数据库中同步。

在系统非常活跃时,lgwr可以使用组提交的方式写入重做日志文件。例如,假设一个用户提交一个事务。lgwr必须将事务重做条目写入到磁盘,但同时,另一个用户也发布commit语句。

但是,lgwr必须先完成前面的写操作才可以在重做日志中写入来提交这个事务。在第一个事务条目写入到重做日志文件之后,整个的等待写入的重做日志条目(还没有提交的)可以在一个操作中写入到磁盘,这样比单独写入整个事务条目要节省磁盘i/o。因而,oracle最小化了磁盘i/o,最大化lgwr的性能。

如果提交请求频率很高,然后lgwr从重做日志缓存的每个写入都可以包含多个提交记录。

当检查点发生时,oracle必须更新所有数据文件的首部来记录检查点的详细信息。这个是ckpt进程做的。ckpt进程不负责写入块到磁盘,dbwn完成这项工作。

dbwr 检查点统计在企业管理器的system_statistics中显示了需要完成的检查点数量。

系统监控进程(smon)在实例开始时执行必要的恢复。smon还负责清理不再使用的临时段和在字典管理的表空间中合并临近的空闲区段。如果在实例恢复中因为文件读或者离线错误导致跳过一些结束的事务,在表空间或文件重新**时smon会恢复它们。

smon通常自己检查是否需要启动。其他的进程也可以在它们认为需要的时候调用smon。

在真正应用集群中,一个实例的smon进程可以针对cpu失败或者实例失败执行实例恢复。

进程监控进程(pmon)在用户进程失败时执行进程恢复。pmon负责清理这个用户正在使用的数据库高速缓存和释放这个用户进程正在使用的资源。例如,它重置了活动事务表的状态,释放了锁,从活动进程列表中移除进程id。

pmon定期检查调度器和服务器进程的状态,重启任意停止运行的进程(oracle有意中断的除外)。pmon还对网络***注册实例信息和调度器进程。