Oracle 后台进程详解

后台进程

后台进程负责保证数据库的稳定工作,每当数据库启动时,这些后台进程会自动启动,并且持续整 个实例的生命周期,每个进程负责一个独特的任务,表2-4 是一些最重要的后台进程。(本文地址:http://blog.sunansheng.com/2016/04/29/oracle-back-process/)

进 程 缩 写 描 述
Database Writer DBWn 负责把脏数据写回磁盘
Log Writer LGWR 负责把日志数据写到联机日志文件
Checkpoint CKPT 负责检查点操作
Process Monitor PMON 负责维护用户进程
System Monitor SMON 负责实例恢复
Archiver ARCn 负责归档操作,生成归档日志
Manageability Monitor MMON 和AW R有关
Manageability Monitor Light MMNL 和AW R有关
Memory Manager MMAN 和自动SGA管理有关
Job Queue Coordination Process CJQO 定时任务进程
Recover Writer RVWR 和Flashback Database 功能有关
Change Tracking Writer CTWR 跟踪数据块变化,支持快速增量备份

1.DBWn

Oracle 对于数据的修改都是在内存中进行的,Oracle 不会直接修改磁盘上的数据,因此 Oracle 在修改数据之前必须把数据从磁盘读入到SGA 中。这个模式就遇到两个问题:首先,如何确保SGA 中有足够的空间来装载这些数据?其次,修改后的数据终将写回到磁盘上,这又是如何完成的?我 们就带着这两个问题来了解DBWn 进程的功能。

DBWn (Database Writer)进程的显式作用是负责把 SGA 中被修改的数据同步到磁盘文件中。 每当SGA 缓存中的空闲空间变得过小时,DBWR进程就通过把脏数据写到磁盘来释放空间。DBWn 进程使用的是LRU(Least Recently Used )算法工作的,也就是根据数据从最后一次被使用以来的 时间决定释放那些数据,越久没有用到的数据越先被清除。因此 DBWn 的隐式的作用是保证 Buffer Cache 中空闲数据块的数量,避免 Server Process 从磁盘把数据读入内存时没有空间可用。

DBWn 的写时机包括:

  • 检查点,即数据库的检查点动作会触发 DBWn 进程工作;
  • 如果一个 Sever Process 在寻找可空闲数据块时, 超过了一定阈值仍然没能找到空闲块,就 会触发 DBWn 进程工作;
  • 每 3 秒自动唤醒一次。

对于一个大型数据库或者修改非常频繁的系统而言,仅靠一个DBWn 进程为所有数据文件的写 操作提供服务,可能会力不从心。因此,Oracle 允许同时运行多个 DBWn 进程,以分担繁重的写负 载。这就是 DBWn 中n 的来历。数据库中最多可以使用 20 个DBWn 进程(n 从0~9 ,a~i)。数据库 初始化参数DB_WRITER_PROCESSES 就是用来定义DBWn 进程数量。如果没有定义这个参数, Oracle 缺省时按照 CPU 的数量来决定需要的进程个数。每8 个CPU 分配一个进程。

Oracle 推荐在增加 DBWn 进程数量之前,要先考虑使用异步 IO,有可能异步 IO就能够解决问 题,不需要增加进程数量。

2.LGWR (Log Writer)

LGWR 进程的作用是吧Log Buffer中的日志内容写到联机日志文件中,从而释放 Log 用户Buffer 空间。数据库的所有修改操作(增、删、改)都会生成日志,这些日志最初先保存在 Redo Log Buffer 中,然后在某个时刻由LGWR 进程写入到磁盘的联机日志文件中。

触发LGWR 写操作的原因有几种:

  • 用户提交,即用户发出 Commit 指令时会触发 LGWR 写操作;
  • 每三秒钟定时唤醒;
  • 如果使用的 Log Buffer 超过了配置的 1/3 时,即 1/3 满会触发 LGWR 的写操作;
  • Log Buffer 中的日志数量超过 1MB 时,即 1MB 限制也会触发 LGWR 的写操作;
  • 由 DBWR 进程触发

(1)提前写。

Oracle 使用的是提前写(Write-Ahead)机制,即和一个数据块相关联的的 Redo记录必须先于 数据块本身被记录到磁盘中。这就意味着,当DBWn 进程试图把一个脏数据块写到磁盘上之前, DBWn 进程会先确定和这个数据块相关联的所有Redo记录都已经被写到联机日志文件中了,如果 没有满足这个前提条件,那么 DBWn 进程就会通知 LGWR 进程,等待 LGWR 进程把相关日志都写 完后,DBWn 进程再把数据块内容写到磁盘文件中。

(2)快速提交。

每当用户发出Commit命令时,Oracle 只是会把Redo Log Buffer 中的记录写到日志文件中,同 时会在日志中写入一条代表事务已经提交的记录(Commit Record)。但是这个事务所修改到的数据 块并不会被写到数据文件中。或者说Oracle 对Commit操作成功的定义是这样的:只要这个事务的 Redo Record被写到日志文件中,这个事务就算是 Commit成功了,至于事务修改的数据是否记录到 数据文件没有任何关系。这也就是Oracle 的快速提交(Fast Commit)机制。

提前写(Write Ahead)和快速提交(Fast Commit)是 Oracle 两个很重要的运行机制,这两个机 制保证了事务提交不必等待数据写到磁盘,而之所以采用这种机制,也是平衡性能和可用性的结果。

对于一个繁忙的OLTP 系统来说,同时会有大量的事务发生,因此同时会有大量的Commit请 求,这时LGWR 进程就可以把许多的 Commit请求批量的写入日志文件,而不是针对每个Commit 请求立即处理,这种机制也叫做Group Commit。

3.CKPT(Checkpoint)

所谓检查点,代表着数据库的一致性状态。在检查点时刻,数据文件的内容和SGA 中的内容 完全一致,也就是说在 SGA 中进行的所有数据修改都被写回到数据文件上,而数据库的一致性状态 也正是从这个角度来描述的。

注意:检查点所代表的数据一致和事务隔离级别所说的读一致性不是一个概念,后者是从数据完整性角度 来说的。而检查点的数据一致仅指内存和磁盘的数据一样,是从恢复的角度来说的,二者一定不能 混淆。虽然在检查点时刻,系统中会有很多未提交事务,修改后的脏数据最终可能被提交,永久生 效,也有可能回滚,还原成修改前的样子,但这不是检查点所关心的。检查点只关心恢复操作是否 可以从这一时刻开始。

在发生检查点机制时,会同时有 DBWn 、LGWR 、CKPT 三组进程的活动。首先,DBWR进程 要把脏数据写入的磁盘数据文件中,当然这个操作也会触发 LGWR 的工作。而 CKPT 进程只负责更 新控制文件中的检查点记录,它的任务量并不像 DBWn 进程和 LGWR 进程那么繁重.

4.PMON(Process Monitor)

这个后台进程用来监控用户进程的。用户进程可能由各种原因导致异常终止,比如网络故障、 用户机器断电等。这时用户进程对应着的服务进程可能还占用着系统资源,如果这些资源不及时释 放,就会影响正常用户的工作。

PMON 进程就负责在发现用户进程异常中止后的清理工作,以确保释放占用的资源。比如,一 个用户进程可以在异常中止之前正在处理事务,使用了若干锁,突然用户计算机断电了,这些锁没 有被正常释放,而且这些锁永远不会有机会被正常释放,其他用户可能就要永久等待这些锁。这时 就需要PMON 进程强行进行清理工作,释放这些被占用的资源,以保证其他用户不会因为这些异常 中止进程的干扰。PMON 进程定期被唤醒,其他进程也会在需要时主动唤醒PMON 进程。

5.SMON(System Monitor)

如果遭遇数据库异常关闭,SGA 中还没有来得及写到磁盘的信息就丢失了,数据库再次启动时,
就先要进行恢复工作,这种恢复叫做实例恢复(Instance Recovery )。SMON 进程负责实例恢复,实
例恢复分成3 个阶段。

  • 前滚(Roll Forward):这一阶段是读取联机日志,找到最后一次检查点之后的日志内容, 并重做这些日志,把数据库恢复到上次实例关闭时的状态,这时系统包含着提交和未提交的 事务。
  • 打开数据库:为了减少用户等待时间,Oracle 选择尽可能早地打开数据库,打开数据库以 后,再继续进行恢复工作。现在用户就可以使用数据库。
  • 回滚(Roll Back) :SMON 进程回滚未提交的事务,Server Process 也可以进行部分回滚工作。

除了实例恢复,SMON 进程还负责部分空间管理工作,包括:

  • 如果使用字典管理表空间(DMT) ,SMON 进程需要合并空闲 Extents,以避免磁盘碎片, 这个功能叫做 Coalesce,这个任务每 3 秒执行一次;
  • SMON 进程负责清理临时段,以释放空间;
  • SMON 进程也是定期被唤醒或者被其他进程主动唤醒。

6.ARCn(Archiver)

归档(Archiver)进程负责归档模式的数据库的归档操作。我们知道每个数据库都必须要创建 至少两组联机日志,这些日志是循环使用的,也就是一组日志写满后,LGWR 就切换到另一组日志 继续写入,周而复始。因此稍早产生日志终将被新的日志覆盖掉,这是非归档模式。而归档模式比 非归档模式多出的处理就是,在发生日志切换时,ARCn 进程被唤醒,把之前写满的日志做一个文 件拷贝,这个拷贝被保存到一个特殊的目录下——归档目录,这个拷贝就叫做归档日志。每个联机 日志能够被覆盖的前提条件也相应地多了一个,除了要完成检查点,还必须完成归档操作。

归档模式就是确保数据库所有操作日志都被保留下来,这样能够最大程度的保证数据库的可恢 复性。

ARCn 进程就是完成这个拷贝动作,和DBWn 进程一样,ARCn 进程可以有多个,最多是 10 个(n 取值范围为 0~9 )。数据库的初始化参数 LOG_ARCHIVE_MAX_PROCESSES 就是定义数据库 启动时运行的ARCn 的个数。

你可能感兴趣的:(oracle,oracle,进程,后台进程)