Oracle DBWR,LGWR,CKPT,ARCH 触发条件 总结

一.  DBWR写磁盘数据触发条件

       1. 当进程在辅助LRU链表和主LRU链表上扫描以查找可以覆盖的buffer header[空闲缓冲区]时,如果已经扫描的buffer header的数量到达一定的限度(由隐藏参数:_db_block_max_scan_pct决定)时,触发DBWR进程。  _db_block_max_scan_pct表示已经扫描的buffer header的个数占整个LRU链表上buffer header总数的百分比。这时,搜索可用buffer header的进程挂起,在v$session_wait中表现为等待“free buffer wait”事件,同时增加v$sysstat中的“dirty buffers inspected”的值。(can query by x$kvit)

 

       这部分内容在我的Blog里也有说明:

              Oracle Buffer Cache 原理

              http://blog.csdn.net/tianlesoftware/archive/2011/06/28/6573438.aspx


       2. 当DBWR在主LRUW链表上查找已经更新完而正在等待被写入数据文件的buffer header时,如果找到的buffer header的数量超过一定限度(由隐藏参数:_db_writer_scan_depth_pct决定)时,DBWR就不再继续往下扫描了,而转到辅助LRUW链表上将其上的脏数据块写入数据文件。_db_writer_scan_depth_pct表示已经扫描的脏数据块的个数占整个主LRUW链表上buffer header总数的百分比。
       3. 如果主LRUW链表和辅助LRUW链表上的脏数据块的总数超过一定限度,也将触发DBWR进程。该限度由隐藏参数:_db_large_dirty_queue决定。
       4. 发生增量检查点(incremental checkpoint)或完全检查点(complete checkpoint)时触发DBWR。
       5. 每隔三秒钟启动一次DBWR。
       6. 将表空间设置为离线(offline)状态时触发DBWR。
       7. 发出命令:alter tablespace … begin backup,从而将表空间设置为热备份状态时触发DBWR。
       8. 将表空间设置为只读状态时,触发DBWR。
       9. 删除对象时(比如删除某个表)会触发DBWR。

 

二.  LGWR写联机日志文件触发条件

       1. 超时(timeout)

       当LGWR处于空闲状态时,它依赖于rdbms ipc message等待,处于休眠状态,直到3秒超时时间到。       如果LGWR发现有redo需要写出,那么LGWR将执行写出操作,log file parallel write等待事件将会出现。

       2. 阈值达到
       只要一个进程在log buffer中分配空间,已经使用的Log buffer的数量将被计算。如果使用的块的数量大于或等于_log_io_size参数设置,那么将会触发LGWR写操作。
       如果此时LGWR未处于活动状态,那么LGWR将被通知去执行后台写操作。
       缺省的_log_io_size等于1/3 log buffer大小,上限值为1M,此参数在X$KSPPSV中显示的0值,意为缺省值。也就是,LGWR将在Min(1M,1/3 log buffer size)时触发。

       注意此处的log buffer size是以log block来衡量的。此值通常为512 bytes.

       3. 提交
       当一个事物提交时,在redo stream中将记录一个提交标志。
       在这些redo被写到磁盘上之前,这个事物是不可恢复的。所以,在事务返回成功标志给用户前,必须等待LGWR写完成。进程通知LGWR写,并且以log file sync事件开始休眠,超时时间为1秒。
       Oracle的隐含参数_wait_for_sync参数可以设置为false避免redo file sync的等待,但是就将无法保证事务的恢复性.注意,在递归调用(recursive calls)中的提交(比如过程中的提交)不需要同步redo直到需要返回响应给用户。因此递归调用仅需要同步返回给用户调用之前的最后一次Commit操作的RBA。
       存在一个SGA变量用以记录redo线程需要同步的log block number。
       如果多个提交在唤醒LGWR之前发生,此变量记录最高的log block number,在此之前的所有redo都将被写入磁盘。这有时候被称为组提交(group commit).

 

       4. 在DBWR写之前
       如果DBWR将要写出的数据的高RBA超过LGWR的on-Disk RBA,DBWR将post LGWR去执行写出。
       在Oracle8i之前,此时DBWR将等待log file sync事件。
       从Oracle8i开始,DBWR把这些Block放入一个defer队列,同时通知LGWR执行redo写出,DBWR可以继续执行无需等待的数据写出。

 

三.  CKPT发送CHECKPOINT信号的触发条件

       1. log_checkpoint_timeout时间达到
       2. 当前redo日志已经写够log_checkpoint_internavl*操作系统块大小
       3. redo log switch
       4. alter system checkpoint
       5. alter tablespace XXX begin backup,end backup的時候
       6. alter tablespace , datafile offline, shutdown immediate, direct read的時候;

      

四.  ARCH进程日志归档触发条件

       1. 如果设置了自动归档模式,则日志切换时,由LGWR进程触发ARCH进程进行归档。这是最常见的方式。

       2. 可以手工进行归档。使用命令:alter system archive log current表示启动ARCH进程,从而对当前的日志文件进行归档。

       3. 如果ARCH进程在5分钟以后还没有接收到LGWR的通知,则发生超时,于是ARCH被唤醒以检查是否存在需要归档的日志文件。ARCH通过读取控制文件中的信息来决定是否需要归档以及应该归档哪些日志文件。但是在进行实例恢复或者介质恢复的过程中,ARCH进程不会启动。

 

 

转载自: http://space.itpub.net/23071790/viewspace-692142



本文转自 张冲andy 博客园博客,原文链接:http://www.cnblogs.com/andy6/p/6129911.html  ,如需转载请自行联系原作者


上一篇:《Apache Kafka实战》| 每日读本书


下一篇:[LeetCode] Find Leaves of Binary Tree 找二叉树的叶节点