下面就来介绍一下这些在后台辛勤工作的进程们。系统检测器(system monitor,smon)、进程监视器(process monitor,pmon)、数据库写入器(database writer,dbwn)、日志写入器(log writer,lgwr)、检查点进程(checkpoint process,ckpt)
1、smon:安装和打开数据库。通过查找和验证数据库控制文件来安装数据库。此后,通过查找和验证所有数据文件和联机日志文件打开数据库。一旦打开数据库并使数据库处于使用状态,smon就负责执行各种内部管理任务。
2、pmon:用户会话是连接到服务器进程的用户进程。服务器进程在会话创建时启动,在绘画结束时销毁。如果会话正常结束,则用户执行的任何工作都会有序完成,服务器进程将终止。如果非正常终止会话,pmon将销毁服务器进程,将其pga内存返回给操作系统,并回滚任何尚在进行的未提交完成的事务。
3、dbwn:会话不直接将数据写入磁盘,而是写入到数据库高速缓存区。然后又数据库写入器负责将缓冲区写入到磁盘。一般来说一个实例可能有多个写入器。依次为dbw0,dbw1等。默认情况是8个cpu对应一个数据库写入器。
通常情况下,oracle会尽可能的减少写入缓冲区的数量。因为io操作会降低性能。真实情况中,如果出现会话对某些缓冲区执行写作,那么通常还会有会话对其进行操作。这样,就没有必要将其写入到磁盘了。
dbwn采用极懒算法执行写入:尽可能少,在尽可能少。有四种情况需要进行些操作:没有可用缓冲区、脏缓冲区过多、遇到三秒超时,遇到检查点。
没有可用缓冲区:服务器进程在将块复制到高速缓冲区之前,需要查找可用缓冲区。可用缓冲区是既不脏也未被占用的缓冲区。如果查找可用缓冲区时间过长(oracle内部自行设定),则会将脏缓冲区写入到磁盘,以清理缓冲区。
脏缓冲区数量过多:在什么情况下谓多,有oracle的内部阈值确定,如果超过了,就会将一些缓冲区写到磁盘
三秒超时:dbwn每三秒会对一些缓冲区清理一次。即使系统处于闲置状态,也会清理缓冲区。
请求检查点:遇到检查点时,会写入所有的缓冲区数据。此时系统性能下降。检查点只有在不得已的情况下才会设置。关闭数据库和关闭实例时会设置检查点,也可以使用命令来设置。
在这里需要注意一点,在会话提交事务时,dbwn什么也不做,dbwn按照自己的方式执行。此时需要执行的操作是:写入日志缓冲区的数据。
4、lgwr:日志写入器将日志缓冲区的内容写入到磁盘上的联机日志文件中。当会话发出commit时,lgwr会实时写入:在lgwr将缓冲区写入磁盘时,会话将会被挂起。在oracle体系结构中,lgwr是最大的瓶颈之一。dml的速度不能超过lgwr将更改矢量写入到磁盘的速度。在以下三种情况发生时,lgwr将转储日志缓冲区:
提交写入时:已提交事务的每个更改矢量都可以再磁盘上的重做日志中得到,并可以再此后应用于数据文件备份。
日志缓冲区的占用率达到1/3:在应用程序中,通常在非常短的时间内就能填充满日志缓冲区的1/3,这时强制lgwr将更改矢量准实时的写入磁盘。此后,当会话发生commit时,几乎没有什么要写入的内容:commit可以立即完成。
dbwn需要将脏缓冲区从数据库高速缓存区写入到数据文件时:在dbwn执行写入操作之前,总会执行lgwr的写入操作。目的是:始终可以逆转未提交的事务。dbwn可能会将未提交的事务写入数据文件,如果能过获取逆转事务所需的数据和更改矢量,这样做就不会产生问题。所以,在dbwn执行写入之前,需要执行lgwr的写入,以确保这些数据进入重做日志文件中。
5、ckpt:系统崩溃后,必须从重做日志提取与脏缓冲区对应的所有更改矢量,并将其应用于数据块。这就是恢复过程。频繁的检查点确保:可以将脏缓冲区快速写入磁盘,从而最大程度的减少崩溃发生后必须应用的重做量。在oracle8i之后,采用增量检查点机制,dbwn以固定速率写出脏缓冲区,因此dbwn和lgwr之间始终有一个可以预见的差距。使用增量检查点时系统性能更加平稳,恢复时间可以预测。
当然,在10g之后,oracle又新增了几个进程,这里简单介绍一下:
mmon:管理监视器(maniageability monitor),数据块的自我监视和自我调整的支持进程。
mmnl:mmon的辅助进程。
mman:支持内存分布的自动调整。