进程监视器进程(PMON)
进程监视器(PMON)监视其他的后台进程,并在某个服务器进程或调度器进程异常终止时执行进程恢复。PMON负责清理数据库缓冲区高速缓存,释放客户端进程以前还在使用的资源。例如,PMON重置活动事务表的状态、释放不再需要的锁、并从活动进程列表中删除其进程ID。
PMON还将实例和调度器进程的信息注册到Oracle网络监听器。当实例启动时,PMON轮询监听器以确定它是否正在运行。如果监听器正在运行,则PMON将有关参数传递给它。如果监听器未运行,则PMON定期尝试联系它。
系统监视器进程(SMON)
系统监视器进程(SMON)负责各种系统级清理职责。分配给SMON的职责包括:
- ? 如有必要,在实例启动时执行实例恢复。在Oracle RAC数据库中,一个数据库实例的SMON进程可以为另一个失败的实例执行实例恢复。
- ? 在实例恢复期间,由于读文件或表空间脱机错误而跳过的已终止事务,由SMON进行恢复。当表空间或文件重新联机时,SMON将恢复该事务。
- ?清理未使用的临时段。例如,Oracle数据库在创建索引时会分配扩展区。如果操作失败,则SMON会清理临时空间。
- ?合并在字典管理的表空间中的多个连续空闲扩展区。
SMON定期检查是否需要做什么。其他进程在发现需要做什么时,也可以调用SMON来做。
日志写入器进程(LGWR)
日志写入器进程(LGWR)管理重做日志缓冲区。LGWR将缓冲区中的一个连续部分写入联机重做日志。通过分离各种修改数据库缓冲区任务,将脏缓冲区分散写入到磁盘,而将重做缓冲区顺序写入到磁盘,提高了数据库性能。在以下的情况下,LGWR将自上次最后写入以来,复制到缓冲区的所有重做条目写入联机重做日志:
- ? 用户提交了事务。
- ?发生了在线重做日志切换。
- ?自LGWR最后一次写入到现在超过了三秒。
- ?重做日志缓冲区已达到三分之一满,或包含1MB以上被缓冲的数据。
- ?DBWn必须将修改的缓冲区写入到磁盘。
在DBWn可以将脏缓冲区写到磁盘之前,与该缓冲区更改相关联的重做记录必须先被写入磁盘(预写协议)。如果DBWn发现一些重做记录尚未写入,则它通知LGWR将记录写入磁盘,并等待LGWR完成此工作,然后DBWn才将数据缓冲区写入磁盘。
LGWR与提交
Oracle数据库使用快速提交机制来提高已提交事务的性能。当用户发出COMMIT语句时,事务分配到一个系统更改号(SCN)。LGWR将一个提交记录记入重做日志缓冲区,连提交SCN和事务的重做条目,并立即写入到磁盘。重做日志缓冲区是循环的。当LGWR将重做条目从重做日志缓冲区写入到联机重做日志文件时,服务器进程可以复制新条目并覆盖已写入到磁盘的重做日志缓冲区中的条目。通常LGWR的写入速度足够快,以确保在缓冲区中总会有可用空间供新条目使用,即使对联机重做日志的访问很繁重时也是如此。包含事务提交记录的重做条目的原子写入,是确定该事务已提交的唯一事件。Oracle数据库向已提交事务返回一个成功代码,虽然数据缓冲区尚未写入到磁盘。对数据块的相应更改被延迟,直到DBWn在某个有利的时机将它们写到数据文件。
注意:
LGWR可能会在提交事务之前,将重做日志条目写入到磁盘。只有之后提交了事务,这些重做条目才会成为永久性的。当事务活动很高时,LGWR可能会使用组提交。例如,某个用户提交其事务,导致LGWR将事务的重做条目写入到磁盘。在此写操作的过程中,其他用户也试图提交。但LGWR无法写入磁盘以提交这些事务,直到前面的写入完成为止。完成后, LGWR 可以将(尚未提交的)等待事务中的重做条目列表在一个操作中全部写入。通过这种方式,数据库最小化了磁盘I/O,而最大化了性能。如果提交请求继续维持在一个高的水平,则每个 LGWR写入操作都可能包含多个提交记录。
LGWR和无法访问的文件
LGWR同步写入联机重做日志文件组的所有活动镜像。如果某个日志文件不可访问,则LGWR继续写入组中的其他文件,并在LGWR跟踪文件和警报日志中记录一个错误。如果组中的所有文件都损坏,或者如果因为尚未存档而不可用,则LGWR不能继续工作。