checkpoint会触发dbwr写脏块时是根据checkpoint queue来的,而LRU-W是负责dbwr的其他写出条件的触发。
DBWR作为一个后台进程,只有在某些条件满足了才会触发。这些条件包括:
-
当进程在辅助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
”的值。 -
当DBWR在主LRUW链表上查找已经更新完而正在等待被写入数据文件的buffer header时,如果找到的buffer header的数量超过一定限度(由隐藏参数:_db_writer_scan_depth_pct决定)时,DBWR就不再继续往下扫描了,而转到辅助LRUW链表上将其上的脏数据块写入数据文件。_db_writer_scan_depth_pct表示已经扫描的脏数据块的个数占整个主LRUW链表上buffer header总数的百分比。
-
如果主LRUW链表和辅助LRUW链表上的脏数据块的总数超过一定限度,也将触发DBWR进程。该限度由隐藏参数:_db_large_dirty_queue决定。
-
发生增量检查点(incremental checkpoint)或完全检查点(complete checkpoint)时触发DBWR。
-
每隔三秒钟启动一次DBWR。
-
将表空间设置为离线(offline)状态时触发DBWR。
-
发出命令:alter tablespace … begin backup,从而将表空间设置为热备份状态时触发DBWR。
-
将表空间设置为只读状态时,触发DBWR。
-
删除对象时(比如删除某个表)会触发DBWR。