2009年3月28日星期六

进程结构process architecture

每个连接到Oracle的用户需要运行两个模块才能访问Oracle实例:
1、应用程序或Oracle工具:数据库用户需要运行数据库应用程序(如一个预编译的程序)或Oracle工具(例如SQL*PLUS),向Oracle数据库服务器提交SQL语句。
2、Oracle数据库服务器模块:为用户提供服务的Oracle数据库程序,负责解释执行应用程序提交的SQL语句。
这两种模式都是以进程的形式运行的。

Oracle系统中的各种进程可以被分为两大类:
1、执行应用程序或Oracle工具代码的用户进程(user process)
2、执行Oracle数据库服务器代码的Oracle进程(oracle process)。其中包括服务进程(server process)和后台进程(background process)。

当用户运行一个应用程序或oracle工具时,Oracle将创建一个用户进程(user process)来运行用户的应用程序。

连接(connection)与会话(session)这两个概念均与用户进程(user process)密切相关,但两者有有不同的含义:
连接是用户进程和oracle实例间的通信通道(communication pathway)。这个通信通道是通过进程间的通信机制(interprocess communication mechanisms)(在同一个计算机上运行用户进程和oracle进程)或网络软件(network software)(当数据库应用程序与oracle服务器运行在不同的计算机上时,就需要通过网络来通信)建立的。
会话是用户通过用户进程与oracle实例建立的连接(这里的连接与上面的连接不同,主要指用户和数据库间的联系)。Oracle数据库中的同一个用户可以同时创建多个会话。
当系统没有运行在共享服务模式下时,oracle为每个用户会话创建一个服务进程(server process)。而当系统运行在共享服务模式下时,多个用户会话可以共享同一个服务进程。

Oracle进程主要分为两种:服务进程(server process)和后台进程(background process)

服务进程:oracle需要创建服务进程(server process)来处理连接到实例的用户进程提交的请求。当应用程序与oracle服务器运行在同一计算机时,某些用户进程可以和服务进程合并为一个进程,以便减少系统开销。但是当应用程序与oracle服务器运行在不同的计算机时,用户进程必须通过一个服务进程与oracle通信。
为用户应用程序创建的服务进程(或用户/服务进程合并后的服务进程部分)可以完成以下工作:
1、解析、运行应用程序提交的SQL语句
2、如果数据在SGA中不存在,则将所需的数据块从磁盘上的数据文件读入SGA的数据缓存区(shared database buffer)
3、以应用程序能理解的形式返回SQL语句的执行结果

后台进程:为了实现为多用户提供服务且保证系统性能,在一个多进程oracle系统(multiprocess oracle system)中,存在多个被称为后台进程的oracle进程。
一个Oracle实例中可以包含多种后台进程,这些进程不一定全部出现在实例中。系统中运行的后台进程数量众多,用户可以通过V$BGPROCESS视图查询关于后台进程的信息。Oracle实例中可能运行的常见后台进程有:
数据写入进程DBWn
日志写入进程LGWR
检查点进程CKPT
系统监控进程SMON
进程监控进程PMON
恢复进程RECO
作业队列进程
归档进程ARCn
队列监控进程QMNn
1、数据写入进程DBWn
数据写入进程(database writer process)的功能是将数据缓存区的内容写入数据文件。DBWn负责将数据缓冲区(database buffer cache)内修改过的缓存区(即dirty buffer)写入磁盘。当系统中数据修改操作比较频繁时,DBA可以配置额外的数据写入进程(DBW1到DBW9及DBWa到DBWj)来提高数据写入的性能。
注意:buffer 与cache的区别
注意:在单处理器系统(uniprocessor system)中,额外的数据写入进程并不能提高系统性能。

2、日志写入进程LGWR
日志写入进程(log writer process)负责对重做日志进行管理,一一将重做日志缓冲区(redo log buffer)内的数据写入磁盘上的重做日志文件中。LGWR进程将上次写入之后进入缓冲区的所有重做条目(redo entry)写入磁盘中。
注:重做日志缓冲区是一个循环使用的缓冲区(circular buffer)。LGWR进程将重做日志缓冲区一组连续的缓冲区写入磁盘。LGWR进程写入的内容有:
提交记录(commit record)(当用户进程提交一个事务时的提交记录)
重做日志缓冲区
注:当发生下列情况下,LGWR也会将重做日志写入磁盘:
每三秒写入一次;当重做日志缓冲区的使用容量超过总容量的三分之一;当DBWn进程向磁盘写入脏缓冲区时(且相关的重做日志还没有写入磁盘)

3、检查点进程CKPT
当一个检查点事件发生时,oracle需要更新所有数据文件的文件头来记录检查点事件的详细信息。这个工作是由CKPT进程来完成的。但是将数据块写入数据文件的不是CKPT进程,而是DBWn进程。

4、系统监控进程SMON
实例启动时如有需要,系统监控进程(system monitor process)将负责进行恢复(recovery)工作。此外SMON还负责清除系统中不再使用的临时段(temporary segment),以及为数据字典管理的表空间(dictionary managed tablespace)合并相邻的可用空间扩展(extent)。在实例恢复过程中,如果由于文件读取错误活所需文件爱你处于脱机状态而导致某些异常终止的事务未被恢复,SMON将在表空间活文件恢复联机状态后再次恢复这些事务。SMON将定期检查系统中是否存在问题。系统内的其他进程需要服务时也能够调用SMON进程。

5、进程监控进程(PMON)
当一个用户进程失败后,进程监控进程(process monitor process)将对其进行恢复。PMON进程将清除相关的数据缓冲区(database buffer cache)并释放被此用户进程所使用的资源。
PMON进程会周期性的对调度器(dispatcher)和服务进程(server process)进行检查,重新启动停止运行的进程(不包括oracle有意停止的进程)。PMON进程还负责将实例和调度器进程的信息注册到网络监听器(network listener)
同SMON一样,PMON进程也会定期地检查系统中是否有问题需要处理,当系统内的其他进程需要服务时也能够调用PMON进程。

6、恢复进程RECO
恢复进程(recovery process)是在分布式数据库环境(distributed database configuration)中自动地解决分布式事务(distributed transaction)错误的后台进程。一个节点(node)上的RECO进程能够连接到出现了不可信的分布式事务(in-doubt distributed transaction)的数据库。当RECO进程重新连接到与不可信的事务相关的数据库后,它将负责对此事务进行处理,并从相关数据库的活动事务表(pending transaction table)中移除和此事务有关的数据。
如果RECO进程无法连接到远程数据库,她将在一定时间间隔后尝试再次连接。每次重新连接间的时间间隔会以指数级的方式增长。只有实例允许分布式事务时才会启动RECO进程。实例中不会限制并发的分布式事务的数量。

7、作业队列进程
作业队列进程(job queue process)的功能是进行批处理(batch processing)。这种进程用于运行用户的作业(job)。这种进程能够提供作业调度服务(schedular service),在oracle实例中调度PL/SQL语句及存储过程。用户只需提供作业的开始时间及调度间隔,作业队列进程就能够按用户的设定调度作业。
作业队列进程可以被动态管理,这样用户需要时就能够使用更多的作业队列进程。当一个作业队列进程进入空闲状态(idle)后,其使用的资源将被释放。

8、归档进程ARCn
归档进程(archiver process)发生在日志切换(log switch)时将重做日志文件复制到指定的存储设备中。只有当数据库运行在ARCHIVELOG模式下,切自动归档功能被开启时,系统才会启动ARCn进程。
一个oracle实例中,最多可以运行10个ARCn进程(0-9)。如果当前所有的ARCn进程不能满足工作负载的需要,LGWR进程会启动新的ARCn进程。当LGWR进程启动新的ARCn进程时,告警日志(alter log)会进行记录(但是最多只能运行10个ARC进程)。

9、队列监控进程QMNn
队列监控进程(queue monitor process)是提供oracle工作流高级队列(oracle streams advanced queuing)使用的可选的进程,用于监控消息队列。队列监控进程和作业队列进程(job queue process)与其他oracle后台进程的区别在于,这两类进程出错不会导致整个实例出错。