ITPub博客

首页 > Linux操作系统 > Linux操作系统 > DBWR 工作机制

DBWR 工作机制

原创 Linux操作系统 作者:ses19828 时间:2012-12-05 11:31:09 0 删除 编辑

DBWR进程

 

该进程将缓冲区写入数据文件。 也就是将脏数据写入磁盘。

改用LRU算法

当脏数据到达阀值的时候,DBWR进行写。 临界长度为参数db_block_write_batch的值的一半

当服务器进程在LRU表中查找db_block_max_scan_cnt缓冲区时,没有查到未用的缓冲区,通知DBWR进行写

当超时3秒,DBWR进行写

当出现检查点时,LGWR指定修改缓冲区表必须写入磁盘。

 

什么情况下在未commit的情况下会把脏数据写入到datafile中,此时数据块事物槽上仍然带着未提交的标记,等下次将此数据块读到buffer cache中的时候会将事物槽上的未提交标记改为已提交?

 

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”的值。

 

select x.ksppinm name, y.ksppstvl value

from x$ksppi x, x$ksppcv y

where x.indx = y.indx  and x.ksppinm like '_db_block_max_scan_pct'

 

        NAME    VALUE

        _db_block_max_scan_pct  40

 

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决定。 

select x.ksppinm name, y.ksppstvl value

from x$ksppi x, x$ksppcv y

where x.indx = y.indx  and x.ksppinm like '_db_large_dirty_queue'

   NAME    VALUE

1   _db_large_dirty_queue   25

4) 发生增量检查点(incremental checkpoint)或完全检查点(complete checkpoint)时触发DBWR。

5) 每隔三秒钟启动一次DBWR。

6) 将表空间设置为离线(offline)状态时触发DBWR。

7) 发出命令:alter tablespace … begin backup,从而将表空间设置为热备份状态时触发DBWR。

8) 将表空间设置为只读状态时,触发DBWR。

9) 删除对象时(比如删除某个表)会触发DBWR。

 

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/607244/viewspace-750565/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: CKPT工作机制
请登录后发表评论 登录
全部评论

注册时间:2012-07-04

  • 博文量
    42
  • 访问量
    119574