oracle实例中5个后台进程的执行顺序
- 提问者网友:呐年旧曙光
- 2021-03-04 23:23
- 五星知识达人网友:青尢
- 2021-03-05 00:46
- 1楼网友:渡鹤影
- 2021-03-05 00:56
1、dbwr进程:该进程执行将缓冲区写入数据文件,是负责缓冲存储区管理的一个oracle后台进程。当缓冲区中的一缓冲区被修改,它被标志为“弄脏”,dbwr的主要任务是将“弄脏”的缓冲区写入磁盘,使缓冲区保持“干净”。由于缓冲存储区的缓冲区填入数据库或被用户进程弄脏,未用的缓冲区的数目减少。当未用的缓冲区下降到很少,以致用户进程要从磁盘读入块到内存存储区时无法找到未用的缓冲区时,dbwr将管理缓冲存储区,使用户进程总可得到未用的缓冲区。
oracle采用lru(least recently used)算法(最近最少使用算法)保持内存中的数据块是最近使用的,使i/o最小。在下列情况预示dbwr 要将弄脏的缓冲区写入磁盘:
当一个服务器进程将一缓冲区移入“弄脏”表,该弄脏表达到临界长度时,该服务进程将通知dbwr进行写。该临界长度是为参数db-block-write-batch的值的一半。
当一个服务器进程在lru表中查找db-block-max-scan-cnt缓冲区时,没有查到未用的缓冲区,它停止查找并通知dbwr进行写。出现超时(每次3秒),dbwr 将通知本身。当出现检查点时,lgwr将通知dbwr.在前两种情况下,dbwr将弄脏表中的块写入磁盘,每次可写的块数由初始化参数db-block- write-batch所指定。如果弄脏表中没有该参数指定块数的缓冲区,dbwr从lur表中查找另外一个弄脏缓冲区。
如果dbwr在三秒内未活动,则出现超时。在这种情况下dbwr对lru表查找指定数目的缓冲区,将所找到任何弄脏缓冲区写入磁盘。每当出现超时,dbwr查找一个新的缓冲区组。每次由dbwr查找的缓冲区的数目是为寝化参数db-block- write-batch的值的二倍。如果数据库空运转,dbwr最终将全部缓冲区存储区写入磁盘。
在出现检查点时,lgwr指定一修改缓冲区表必须写入到磁盘。dbwr将指定的缓冲区写入磁盘。
在有些平台上,一个实例可有多个dbwr.在这样的实例中,一些块可写入一磁盘,另一些块可写入其它磁盘。参数db-writers控制dbwr进程个数。
2、lgwr进程:该进程将日志缓冲区写入磁盘上的一个日志文件,它是负责管理日志缓冲区的一个oracle后台进程。lgwr进程将自上次写入磁盘以来的全部日志项输出,lgwr输出:
◆当用户进程提交一事务时写入一个提交记录。 ◆每三秒将日志缓冲区输出。 ◆当日志缓冲区的1/3已满时将日志缓冲区输出。 ◆当dbwr将修改缓冲区写入磁盘时则将日志缓冲区输出。
lgwr进程同步地写入到活动的镜象在线日志文件组。如果组中一个文件被删除或不可用,lgwr可继续地写入该组的其它文件。
日志缓冲区是一个循环缓冲区。当lgwr将日志缓冲区的日志项写入日志文件后,服务器进程可将新的日志项写入到该日志缓冲区。lgwr 通常写得很快,可确保日志缓冲区总有空间可写入新的日志项。
注意:有时候当需要更多的日志缓冲区时,lwgr在一个事务提交前就将日志项写出,而这些日志项仅当在以后事务提交后才永久化。
oracle使用快速提交机制,当用户发出commit语句时,一个commit记录立即放入日志缓冲区,但相应的数据缓冲区改变是被延迟,直到在更有效时才将它们写入数据文件。当一事务提交时,被赋给一个系统修改号(scn),它同事务日志项一起记录在日志中。由于scn记录在日志中,以致在并行服务器选项配置情况下,恢复操作可以同步。
3、ckpt进程:该进程在检查点出现时,对全部数据文件的标题进行修改,指示该检查点。在通常的情况下,该任务由lgwr执行。然而,如果检查点明显地降低系统性能时,可使ckpt进程运行,将原来由lgwr进程执行的检查点的工作分离出来,由ckpt进程实现。对于许多应用情况,ckpt进程是不必要的。只有当数据库有许多数据文件,lgwr在检查点时明显地降低性能才使ckpt运行。 ckpt进程不将块写入磁盘,该工作是由dbwr完成的。初始化参数checkpoint-process控制ckpt进程的使能或使不能。缺省时为false,即为使不能。
由于oracle中lgwr和dbwr工作的不一致,oracle引入了检查点的概念,用于同步数据库,保证数据库的一致性。在oracle里面,检查点分为两种:完全检查点和增量检查点。下面我们分别介绍这两种检查点的作用:
1、完全检查点
在oracle8i之前,数据库的发生的检查点都是完全检查点,完全检查点会将数据缓冲区里面所有的脏数据块写入相应的数据文件中,并且同步数据文件头和控制文件,保证数据库的一致。完全检查点在8i之后只有在下列两种情况下才会发生:
(1)dba手工执行alter system checkpoint的命令;
(2)数据库正常shutdown(immediate,transcational,normal)。
由于完全检查点会将所有的脏数据库块写入,巨大的io往往会影响到数据库的性能。因此oracle从8i开始引入了增量检查点的概念。
2、 增量检查点
oracle从8i开始引入了检查点队列这么一种概念,用于记录数据库里面当前所有的脏数据块的信息,dbwr根据这个队列而将脏数据块写入到数据文件中。检查点队列按时间先后记录着数据库里面脏数据块的信息,里面的条目包含rba(redo block address,重做日志里面用于标识检查点期间数据块在重做日志里面第一次发生更改的编号)和数据块的数据文件号和块号。在检查点期间不论数据块更改几次,它在检查点队列里面的位置始终保持不变,检查点队列也只会记录它最早的rba,从而保证最早更改的数据块能够尽快写入。当dbwr将检查点队列里面的脏数据块写入到数据文件后,检查点的位置也要相应地往后移,ckpt每三秒会在控制文件中记录检查点的位置,以表示instance recovery时开始恢复的日志条目,这个概念称为检查点的“心跳”(heartbeat)。检查点位置发生变更后,oracle里面通过4个参数用于控制检查点位置和最后的重做日志条目之间的距离。在这里面需要指出的是,多数人会将这4个参数看作控制增量检查点发生的时间。事实上这是错误的,这4个参数是用于控制检查点队列里面的条目数量,而不是控制检查点的发生。