LRU and Dirty List
Buffer cache 中:LRU list and Dirty List(也叫Write List,Checkpoint Queue)
各List 上存放指向 具体buffer的指针
LRU List用于维护内存中Buffer,按照LRU算法(即最近最少使用)管理。数据库初始化时,
所有的Buffer都被Hash到LRU List上管理,当需要从数据文件上读取数据时,首先要在 LRU List
上寻找free的Buffer,然后读取数据到Buffer Cache中,数据被修改后,状态变为Dirty,就可以
被移动Dirty List上,Dirty List 是随后可以被DBWR写出到数据文件的Buffer,一个Buffer 要么在
LRU List上要么在Dirty List上,不可能同时存在于两List
辅助List:oracle8i开始 新增用于提高管理效率
数据库初始化时,Buffer首先放在LRU的辅助List上,当被使用后移到LRU主List上,
这样用户进程搜索free Buffer 时就可以从辅助List开始,而DBWR搜索Dirty时可以从
LRU主List上开始,从而提高搜索效率和性能
增量检查点会促使DBWR主动检查Dirty Buffer,将Dirty Buffer放到Dirty List
DBWR 触发条件: 1.Lru 链上扫描以查找可以覆盖的 buffer header 时,如果已经扫描的 buffer header 的数量到达一定的限度(由隐藏参数:
_db_block_max_scan_pct 决定,我的库中是 40 )
2. 当 DBWR 在主 LRUW 链表上查找已经更新完而正在等待被写入数据文件的 buffer header 时,如果找到的 buffer header 的数量超过一定限度
(由隐藏参数: _db_writer_scan_depth_pct 决定 我的库中是 25 )
3. 如果主 LRUW 链表和辅助 LRUW 链表上的脏数据块的总数超过一定限度,。该限度由隐藏参数: _db_large_dirty_queue (我的库是 25 )决定。
4. 完全检查点时触发 DBWR 。
5. 将表空间设置为离线( offline )状态时触发 DBWR 。
6. 发出命令: alter tablespace … begin backup ,从而将表空间设置为热备份状态时触发 DBWR 。
7. 将表空间设置为只读状态时,触发 DBWR 。
8. 删除对象时(比如删除某个表)会触发 DBWR 。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/24217871/viewspace-679674/ ,如需转载,请注明出处,否则将追究法律责任。