·清理不使用临时段,举个栗子,在创建一个索引时,数据库会分配一些extent给它,如果操作发生了错误,那么SMON会把这些临时的空间给清理 。
·在dictionary-managed(字典管理)的表空间中,会合并相连的空闲extents。
SMON会周期性的检查时候有东西需要它。其他进程可以在检测到有需要SMON的地方时通知SMON来处理。
Database Writer Process (DBWn)(数据库写进程)
DBWn把buffers中的内容写到数据文件。DBWn进程把buffercache中修改过的buffer 写到磁盘中。虽然大多数系统中,一个write 进程(DBW0)已经足够了,但是你依然可以配置额外的进程DBW1到DBW9以及DBWa到DBWj,来增加写的性能(如果你系统修改数据非常多)
这些附加的DBWn进程在唯一进程系统中是无用的。
DBWn进程在下面条件时会将脏的buffer写入到磁盘:
·当一个server进程在扫描了一大堆buffers后(超过了一个阀值)还没有找到clean 可重用的buffer,那么server进程会给DBWn发信号,让它去写。DBWn尽可能的异步写入脏的buffer以便同时执行其他处理。
·DBWn周期性的将脏buffer写出,用来推进checkpoint(检查点),检查点指的是实例恢复时在redo log 上面的开始点。在log上的checkpoint 取决于buffer cache里最老的dirty buffer。
在大多数情况下,DBWn写入的块都是离散分布在磁盘删哪个,因此,往往比LGWR所执行的顺序写入速度要慢。DBWn尽可能的执行多块写来提高效率。多块写时块的数量 根据操作系统的不同而不同。
Log Writer Process (LGWR)(log写程序)
LGWR管理着redo log buffer。LGWR会把log buffer中的一个连续的部分写入到onlineredo log文件。通过与 离散写入脏buffer到磁盘的任务 分离(LGWR是顺序写)这样提升了整个数据库的性能。
在下面情况,LGWR把buffer中从上次写入之后的所有redo 条目都写入磁盘:
·用户提交一个事务
·一个在线日志的log switch 发生。
·离上次LGWR写入三秒后
·redo log buffer 三分之一满或者 1M大小的内容时
·DBWn写入修改buffers 到磁盘
在DBWn写脏buffer之前,与这些脏buffer相关的redorecords必须已经写到磁盘里了(write-ahead protocol)。如果DBWn发现一些相关的redo records还没写入,那么它会发信号给LGWR去写这些records到磁盘,等LGWR写入完成后,它才把脏的buffer写到磁盘中。
LGWR and Commits(LGWR和提交)
Oracle 数据库使用fast commit机制来提高事务提交的性能。当一个用户发布COMMIT语句,事务被分配一个system change number(SCN)。LGWR写一个commit 记录到redo log buffer然后把这条记录以及这个事务相关的记录立即写入到磁盘。
Redo log buffer是循环使用的。当LGWR把redo logbuffer中的redo条目写入到redo log文件时,server进程新复制进来的条目可以覆盖掉被写入的条目。LGWR正常来说写的足够快,保证buffer中的空间总是够用的,哪怕redo log很多。
事务提交的记录作为一个单独的redo条目,用来确定事务是提交的,事务记录写入磁盘后,哪怕相关的data buffers还没被写入到磁盘,但是Oracle数据库也会返回提交已成功。而数据块相关的改变会延迟,直到DBWn能够更有效的写入它们到数据文件时。
注意:LGWR可以在事务提交之前就写入到redolog 文件中。只有之后事务提交了,这些条目才会成为永久的。
当事务提交量密集时,LGWR可以使用group commits。举个栗子,一个用户提交,导致LGWR写和事务相关的redo 条目到磁盘,在这次写入过程中,其他用户也提交了,LGWR只有在之前提交写入完成之后,才能写这些提交。在之前的写入完成以后,LGWR可以把等待写入的事务们的这些条目,在一个操作中全部写入。通过这种方式,数据库减少了磁盘I/O和增加了性能。如果提交请求一直很高频率,那么LGWR的每个写,都可能包含多个提交的记录。
LGWR and Inaccessible Files(LGWR和不可访问的文件)
LGWR同对redo log active组中的所有文件写入。如果组中的一个文件不可访问,那么LGWR依然会继续写组中的其他文件,然后写一个错误到 LGWR trace文件和alert log文件。如果组中的所有文件都损坏了,或组暂时不可用(因为还没归档完毕)那么LGWR将停止工作。
Checkpoint Process (CKPT)(检查点进程)
CKPT会把 检查点信息 更新到控制文件中,以及数据文件的头部,以及发信号给DBWn去写块到磁盘。检查点信息 包括 检查点的位置,SCN,位于哪个online redo log上,等等。如下图所示,CKPT并不会写数据块到数据文件或redo条目到online redo log文件。
Manageability Monitor Processes (MMON and MMNL)(可管理性监控进程)
MMON执行和Automatic WorkloadRepository(AWR)相关的很多任务。举个例子,当某个度量值超过了阀值, 制作一个快照,以及捕获SQL最近修改的对象的统计信息 时 会发生写入操作。
Manageability monitor lite process(MMNL),从SGA中ActiveSession History(ASH) buffer中把统计的资料写到磁盘。到ASH buffer满的时候 MMNL会把它写到磁盘上。
Recoverer Process (RECO)
在distributed database(通过DBLINK连着的库)中,recover process(RECO)会自动处理错误的distributed transactions 。在一个两阶段提交事务中,一个节点的RECO进程会自动连接其他涉及的数据库。当RECO重建数据库之间的连接时,它将自动回滚所有的两阶段事务,把所有数据库中pending transaction table中与被回滚的事务像关联的行都移除。
Optional Background Processes(可选的后台进程)
可选进程就是任何后台进程(除了强制启动的)。绝大多数可选后台进程,都是针对一些任务或特性。举个例子,比如Oracle Streams Advanced Queuing(QA)或 OracleAutomatic Storage Management(Oracle ASM)的相关进程只有在这些特性启用时,进程才会启动
这一节描述了一些通用的可选进程:
·Archiver Processes (ARCn)
·Job Queue Process