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/ ,如需转载,请注明出处,否则将追究法律责任。