前面我们说过,Oracle的实例由内存结构和一组后台的进程组成。Oracle的后台进程比较重要的包括以下几个:
·SMON
·PMON
·DBWR
·LGWR
·ARCH
·CKPT
下面我们将逐一介绍各个进程的作用。
一、SMON
SMON(System Monitor)-系统监控进程,在实例启动时执行实例恢复,并负责清理不再使用的临时段。
SMON进程要完成所有“系统级”任务。PMON感兴趣的是单个的进程,而SMON与之不同,它以系统级为出发点,这是一种数据库“垃圾收集器”。SMON所做的工作包括:
·清理临时空间
·合并空闲空间
·针对原来不可用的文件恢复活动的事务
·执行RAC中失败节点的实例恢复
·清理OBJ$
·收缩回滚段
·“离线”回滚段
二、PMON
PMON (进程监控程序)后台进程清除失败用户的进程,释放用户当时正在使用的资源。PMON负责释放锁并使其可以被其他用户使用。同SMON一样,PMON周期性地唤醒检测它是否需要被使用。
PMON负责在出现异常中止的连接之后完成清理-释放资源,回滚未提交的事务工作
PMON还负责监视其他的Oracle后台进程,并在必要时重启这些后台进程。
PMON还会为实例做另外一件事,这就是向Oracle TNS监听器注册这个实例。
三、DBWR
DBWR (数据库写入程序)后台进程负责管理数据块缓存区及字典缓存区的内容。它以批方式把修改块从SGA写到数据文件中。
尽管每一个数据库实例只有一个SMON和一个PMON进程在运行,但是根据平台和操作系统的不同,用户可以同时拥有多个DBWR进程。
DBWn会写出缓冲区缓存中的脏块,通常是为了在缓存中腾出更多的空间(释放缓存区来读入其他数据),或者是为了推进检查点(将在线重做日志文件中的位置前移,如果出现失败,Oracle会从这个位置开始独取来恢复实例。)
可以看到,DBWn的性能可能很重要。如果它写出块的速度不够快,不能很快地释放缓冲区,就会看到Free Buffer Waits和Write Complete Waits的等待数和等待时间开始增长。可以配置多个DBWn;实际上可以配置多达20个的DBWn。
最好的情况下,DBWn使用异步I/O将块写至磁盘。采用异步I/O,DBWn会收集一批要写的块,并把它们交给操作系统。DBWn并不等待操作系统真正将块写出;而是立即返回,并收集下一批要写的块。当操作系统完成写操作时,它会异步地通知DBWn写操作已经完成。这样,与所有的操作都串行进行相比,DWBn可以更快地工作。
根据定义,块写入器进程会把块写出到所有磁盘,即分散到各个磁盘上;也就是说,DBWn会做大量的分散写。执行一个更新时,你会修改多处存储的索引块,还可能修改随机地分布到磁盘上的数据块。另一方面,LGWR则是向重做日志完成大量的顺序写。这是一个很重要的区别。
分散写比顺序写慢多了。通过在SGA中缓存脏块,并由LGWR进程完成大规模顺序写,这样可以提升性能。DBWn在后台完成它的任务(很慢),而LGWR在用户等待时完成自己的任务(这个任务比较快),这样我们就能够得到更好的整体性能。
四、LGWR
LGWR(日志写入程序)后台进程负责把联机重做日志缓冲区的内容写入联机重做日志文件。
LGWR分批将日志条目写入联机重做日志文件。重做日志缓冲区条目总是包含着数据库的最新状态,这是因为DBWR进程可以一直等待到把数据块缓冲区中的修改数据块写入到数据文件中。
LGWR是数据库正常操作时唯一向联机重做日志文件写入内容并从重做日志缓冲区直接读取内容的进程。与DBWR对数据文件执行的完全随机访问相反,联机重做日志文件以序列形式写入。如果联机重做日志文件是镜像文件, LGWR同时向镜像日志文件中写内容。
对于Oracle 8,可以创建多个LGWR I/O从进程以改善向联机重做日志文件的写入性能,其个数由数据库的init.ora文件的LGWR _IO_SL AVES参数决定。在Oracle 8 i中,这个参数已不能用, LGWR I/O从进程由DBWR _ IO _SLAVES设置值派生而来。
如果满足以下某个条件,LGWR进程就会把重做日志缓冲区的内容刷新输出到磁盘上:
·每3秒钟会刷新输出一次
·任何事务发出一个提交时
·重做日志缓冲区1/3满,或者已经包含1MB的缓冲数据
由于这些原因,分配超大的重做日志缓冲区并不实际,Oracle根本不可能完全使用这个缓冲区。
五、ARCH
LGWR后台进程以循环方式向联机重做日志文件写入;当填满第一个日志文件后,就开始向第二个日志文件写入;第二个日志文件填满后,再向第三个日志文件写入。一旦最后一个重做日志文件填满, LGWR就开始重写第一个重做日志文件的内容。
当Oracle以ARCHIVELOG (归档日志)模式运行时,数据库在开始重写重做日志文件之前先对其进行备份。这些归档的重做日志文件通常写入一个磁盘设备中。也可以直接写入磁带设备中,但是这往往要增加操作员的劳动强度。
这种归档功能由ARCH (归档进程)后台进程完成,利用该性能的数据库在处理大数据事务时将遇到重做日志磁盘冲突问题,这是因为当LGWR准备写入一个重做日志文件时, ARCH正准备读取另一个。如果归档日志目标磁盘写满,数据库还将遇到数据库锁定问题。此时,ARCH冻结,禁止LGW R写入;从而禁止在数据库中出现进一步的事务处理;这种情况一起延续到归档重做日志文件的空间清空为止。
在线重做日志(LGWR)用于在出现电源故障(实例中止)时“修正”数据文件,而归档重做日志则不同,它是在出现硬盘故障时用于“修正”数据文件。
ARCH通常将在线重做日志文件复制到至少两个位置(冗余正是不丢失数据的关键所在!)。这些位置可能是本地机器上的磁盘,或者更确切地讲,至少有一个在另一台机器上,以应付灾难性失败。
六、CKPT
CKPT (检查点进程)用来减少执行实例恢复所需的时间。检查点使DBWR把上一个检查点以后的全部已修改数据块写入数据文件,并更新数据文件头部和控制文件以记录该检查点。
当一个联机重做日志文件被填满时,检查点进程会自动出现。可以用数据库实例的init.ora文件中的LOG_CHECKPOINT_INTERVAL参数来设置一个频繁出现的检查点。
注意:
检查点进程并不像它的名字所暗示的那样,真的建立检查点--建立检查点是主要是DBWn的任务。CKPT只是更新数据文件的文件首部,以辅助真正建立检查点的进程(DBWn)。
注:本文所有内容均摘自CSDN网友方友松的技术Blog(作者的Blog地址为:http://blog.csdn.net/truexf/)
以及Tom kyte的《Oracle9i&10g编程艺术》人民邮电出版社