概述

Oracle有很多相关的后台进程,如LGWR、DBWn、CKPT、SMON、PMON、ARCn、RECO等,那么这些进程主要是做什么呢?什么时候又会触发这些进程呢?


Oracle进程

oracle配置参数详解(详解Oracle数据库进程--LGWR)(1)

● 系统监控进程(SMON) ,主要任务是实例启动时执行恢复性工作,对有故障数据库实例进行恢复。

● 进程监控进程(PMON) ,主要任务用于恢复失败的用户进程。

● 数据库写入进程(DBWn) ,将修改后的数据块内容写回数据文件。

● 日志写入进程(LGWR) ,将内存中的日志内容写入日志文件。

● 检查点进程(CKPT) ,启动检查点,用于减少数据库实例恢复所需要的时间。

● 归档进程(ARCn) ,当数据库服务器以归档方式运行时调用该进程完成日志归档。

● 恢复进程(RECO) ,用于分布式数据库中的失败处理。

● 锁进程(LCKn) ,在并行服务器模式下确保数据的一致性。

● 调度进程(Dnnn) ,负责把用户进程分配到可用的服务进程进行处理。


LGWR(重做日志缓冲区--》日志文件)

当运行 DML 或 DDL 语句时,服务器进程首先要将事务的变化记载到重做日志缓冲区,然后才会写入数据高速缓冲区,并且重做日志缓冲区的内容将会被写入联机重做日志文件,以避免系统出现意外带来的数据损失(如果操作系统断电,内存中的重做日志缓冲区的内容会丢失,而存在磁盘上的联机日志文件则不会丢失) ,这项任务由 LGWR 来完成。

在出现以下情况时 LGWR 会开始工作:

● 在 DWBR 进程将脏缓冲区写入数据文件之前。 //预写协议 ● 在重做日志记录达到缓冲区的三分之一。 ● 日志缓冲区记录的日志多于 1M。 ● 每隔 3 秒钟。 //重做日志缓冲区是循环使用的,要腾出足够的空间给新的记录使用 ● 提交事务(执行 Commit) 。 //提交事务相当于确定保存修改,不存入日志文件就有丢失的可能

Oracle 总是先记载数据变化到重做日志缓冲区,然后才修改数据高速缓存。与之类似,在后台进程 DBWn 将脏缓冲区写入到数据文件之前, 首先要由后台进程 LGWR 将重做日志缓冲区写入到重做日志中。与数据高速缓存相比,重做日志缓冲区相对要小得多,但写入频率高的多,Oracle 必须要确保重做日志缓冲区总有足够的空间容纳新事务,因此每隔 3 秒钟或重做日志缓冲区已有三分之一填满时 LGWR 会自动工作。

另外,Oracle 采用了快速提交机制,当执行 COMMIT 操作时,并不是将“脏缓冲区”数据写入到数据文件中,而是将重做日志缓冲区的内容写入到重做日志文件中,以确保数据库完整性。此时即使系统出现意外情况(如掉电、系统崩溃等) ,因为被提交事务已经记载到了存放在磁盘上的联机重做日志文件中,将来在重新启动数据库时系统会自动进行实例恢复,并将事务所修改数据写入到数据文件中,从而避免了数据丢失。


DBWn(数据库高速缓冲区--》数据文件)

一个数据库写进程( DBW0 )适用于大多数系统,但数据库管理员可以配置额外的进程(DBW0-DBW9,最多 10 个进程) ,以提高写入性能,通过设置初始化参数DB_WRITER_PROCESSES 来完成。

当数据库高速缓冲区的块被修改,它被标记为脏缓冲区并添加到以 SCN(System Change Number,系统更改号,这里可以看做“时间”)为顺序的 LRUW(LRUWriter)列表。

在出现以下情况时 DBWn 进程会开始工作:

● 系统发出检查点指令。 //同步数据,详见检查点进程(CKPT) 。 ● 脏缓冲区个数达到指定阀值。 ● 服务进程搜索一定数目的数据块后,不能找到自由缓冲区。 ● 数据写入计时时间到。 //客户端执行 SELECT\INSERT\UPDATE\DELETE 语句时,都需要访问数据库高速缓冲区。如果是第一次访问,必须要将数据由数据文件读取到数据库高速缓冲区,所以 Oracle 必须要确保数据高速缓存总是存在足够的“自由缓冲区”以容纳新数据。当 DBWn 进程将脏缓冲区的数据块写入到数据文件后,Oracle 将把“脏缓冲区”标记为“自由缓冲区” 。 因此,为了保证有足够“自由缓冲区”来存放新的数据块,需要 DBWn 进程工作。 ● 表空间脱机或进入只读状态。 ● 执行删除或截断表操作。 ● 执行 ALTER TABLESPACE … BEGIN BACKUP 命令 //需要同步数据,原理同检查点


CKPT(识别SCN,同步所有数据文件、控制文件和重做日志文件)

Oracle 数据库在执行涉及数据变化的语句时,会针对任何修改生成一个顺序递增 SCN值,并且会将 SCN 值连同事务的变化一起记载到重做日志缓冲区。在数据文件、控制文件头部以及重做日志文件中都记载有该值。Oracle 通过比较各种文件的 SCN 值,确定文件是否损坏、系统是否异常,最终确定系统是需要进行实例恢复还是介质恢复。在发出检查点时,数据文件、控制文件和重做日志的 SCN 值完全一致。

进程 CKPT 在以下情况下会开始工作:

● 发生日志切换。 ● 关闭实例(SHUTDOWN ABORT 除外)。 ● 手工执行检查点操作。 ● 由初始化参数 LOG_CHECKPOINT_INTERVAL 和LOG_CHECKPOINT_TIMEOUT 强制发出。

假设现在有一张员工工资表, 员工号 7899 的员工张三工资为 8000, 由于工作表现良好,现在为其加薪到 10000。

1> 此时,第一次读取,需要将数据从数据文件读入数据库高速缓冲区。

oracle配置参数详解(详解Oracle数据库进程--LGWR)(2)

2> 数据读入数据库高速缓冲区后,我们修改数据的条目先记录入重做日志缓冲区:

oracle配置参数详解(详解Oracle数据库进程--LGWR)(3)

3> 接着新数据被写入数据库高速缓冲区

oracle配置参数详解(详解Oracle数据库进程--LGWR)(4)

4> 提交,LGWR 进程将条目从重做日志缓冲区写入联机重做日志文件

oracle配置参数详解(详解Oracle数据库进程--LGWR)(5)

5> 执行检查点 CKPT,同步数据库

oracle配置参数详解(详解Oracle数据库进程--LGWR)(6)

发现联机日志文件为最新,同步更新数据文件、控制文件,触发了 DBWn 进程。


SMON(重做日志文件--》数据库高速缓冲区)

在实例启动时,如果上一次数据库是非正常关闭,并且重做日志文件和控制文件的 SCN 值是不同的,Oracle 将自动在重新打开数据库之前,通过执行重做日志文件的记录,来同步所有数据文件、控制文件和重做日志文件,确保所有数据库文件的一致性,然后才打开数据库。

系统掉电,导致内存中的数据(数据库高速缓冲区)的数据丢失。那么自然上例中的第五步无法完成(无法从数据库高速缓冲区写入数据文件) ,但是由于此时已写入联机日志文件。因此,此时数据将从联机日志文件中更新,而更新的数据量是多少,自然就是由 SCN 决定。

这一过程我们成为“实例恢复” 。该过程不需要数据库管理员手工干预,由 SMON 进程自动完成。

该进程还负责在启动实例时清理临时段和合并区(Extent)碎片等工作。所以 SMON进程的工作归纳如下:

● 进行实例恢复 ● 合并数据文件的自由空间 ● 释放数据文件的临时段


PMON(对失败的用户进程或服务进程进行恢复,回收内存,回滚没有完成的事务)

当 PMON 检测到用户进程失败时,进行的工作归纳如下:

● 回滚当前用户的事务 ● 释放当前用户加的表或行级锁 ● 释放用户的其他资源 ● 重新启动死掉的调度进程


ARCn(重做日志文件--》归档文件)

日志文件是循环使用的,当一个日志写满后,自动切换到另一个日志文件。ARCn 进程在重做日志文件进行切换时开始工作,将写满的重做日志文件写入归档日志文件。根据归档任务量的大小,通过设置初始化参数,可以同时启动多个 ARCn 进程。Oracle 服务器默认的是非归档模式,通过修改初始化参数文件中的参数可以改变归档模式。生产数据库通常都

会设置为归档模式。


RECO恢复进程

RECO 恢复进程负责在分布式数据库(Distributed Database)环境下,自动恢复失败的分布式事务。当某个分布式事务由于网络连接故障或者其他原因失败时,RECO 进程将会尝试与该事物相关的所有数据库进行联系,已完成对失败事物的处理工作。


Dnnnn 调度进程

Dnnnn 调度进程是多线程服务器体系结构的一部分,调度进程接受用户进程的请求,将他们放入到请求队列中,然后为请求队列中的用户进程分配一个服务进程


这里重点理解LGWR、DBWn、CKPT进程,也要理解有关备份恢复的SMON进程及ARCn进程,后面会分享更多devops和DBA方面的内容,感兴趣的朋友可以关注一下~

oracle配置参数详解(详解Oracle数据库进程--LGWR)(7)

,