写脏数据是按照CKPT-Q顺序还是按照LRUW-AUX顺序?
http://blog.csdn.net/robinson1988/article/details/5982996这篇文章上说
“
那增加这些AUX List究竟是干嘛的呢?在数据库启动之后,Buffer首先被存放在LRU AUX List上,
用户进程搜索Free Buffer就会从LRU AUX List 的末/冷端进行。
当这些块被修改后或者是用户进程要构造CR块的时候(要构造CR块也就表明这个块不满足读一致性,是Dirty的),
在LRU AUX List上的Buffer就会被移动到LRU Main List的中间,
记住是中间不是头部也不是末尾,
那么DBWR来搜索Dirty Buffer就可以从LRU Main List开始(注意:DBWR 来搜索LRU Main List 是由于增量检查点导致的),
DBWR在搜索LRU Main List的时候如果发现冷的可以被重复使用的Buffer,
就会将其移动到LRU AUX List上,这样搜索LRU Main List上的Buffer基本都是Dirty Buffer,提高了搜索效率。
DBWR将搜索到的Dirty Buffer移动到LRUW Main List,当需要将这个Dirty Buffer写出的时候,
就把这个Dirty Buffer移动到LRUW AUX List,这样,当DBWR要执行写出可以从LRUW AUX List写出,
这其实是一个异步的写出机制。(知识来源Metalink: 157868.1)
”
这里没有提到ckpt-q,这里说写入是写LRUW AUX List
http://space.itpub.net/9842/viewspace-399668
这篇文章上说
“
队列上串起来的都是脏数据块所对应的buffer header。
而DBWR每次写脏数据块时,也是从检查点队列上扫描脏数据块,
并将这些脏数据块实际写入数据文件的。
当写完以后,DBWR会将这些已经写入数据文件的脏数据块从检查点队列上摘下来。
这样即便是在巨大的buffer cache下工作,CKPT也能够快速的确定哪些脏数据块已经被写入了数据文件,
而哪些还没有写入数据文件,显然,只要在检查点队列上的数据块都是还没有写入数据文件的脏数据块
”
“
当DBWR在主LRUW链表上查找已经更新完而正在等待被写入数据文件的buffer header时,
如果找到的buffer header的数量超过一定限度(由隐藏参数:_db_writer_scan_depth_pct决定)时,
DBWR就不再继续往下扫描了,而转到辅助LRUW链表上将其上的脏数据块写入数据文件。
”
这是同一篇文章,但是关于如何写脏数据的说法也是不同的。
实在是困惑了?
http://www.oraclefans.cn/forum/showtopic.jsp?rootid=35493&CPages=1
这篇文章上说
“
在做普通的CHECKPOINT操作的时候,CKPT进程找到CKPT链的头部,将CKPT QUEUE交给DBWR,由DBWR组织CHECKPOINT DBWR批处理,DBWR进程开始写入操作,由于CKPT QUEUE是按照LOW RBA的顺序排序的,因此在做CHECKPOINT DBWR批处理的时候,是按照RBA的顺序写入脏数据的。当DBWR完成写操作后,CKPT进程更高控制文件和相关的文件头的SCN数据,记录本次CKPT操作的结果。
由于CKPT QUEUE上的BUFFER有可能在LRU链上,也有可能在LRU-W链上,在组织DBWR批处理的时候,LRU链上的BUFFER是否要摘下放入LRU-W,这些算法目前CHECKPOINT 写入的时候,这些BLOCK不从LRU LIST上移走,写完后,从CKPTQ里清除,这和普通的LRUW中的块被写入数据库是不同的。
”
写得也是语焉不详。
到底,写数据的时候是哪样一种算法呢?
刘大师,能否指点一番呢? 这是一个 有意义讨论的问题, 会在晚些时候详细说明, 敬请期待。 希望刘大可以详细讲讲lru列表、lru辅助列表、lruw列表、lruw辅助列表的原理,一直对这些概念很迷糊,网上也是有很多不同说法。 该问题 延迟 回答 需要整理一些材料 ,可能会以文档形式 发布在博客 有没有后续更新
页:
[1]