3358 blog.csdn.net/Robinson 1988/article/details/5982996
根据这篇文章
「
那么,增加这些AUX List到底是什么呢? 数据库启动后,Buffer首先存储在LRU AUX List中。
用户进程搜索Free Buffer是从LRU AUX List的结束/结尾开始的。
当修改这些块时,或者当用户进程尝试构建CR块时(尝试构建CR块表示该块不满足读取一致性,并且为Dirty )。
LRU aux列表上的缓冲区被移动到LRU主列表的中间。
记住,中间不是头,也不是末尾,
DBWR搜索Dirty Buffer可以从LRU主列表开始(注意: DBWR搜索LRU主列表是因为增量检查点)。
当DBWR搜索LRU Main List时,如果它找到了一个冰冷的可复用Buffer,
将其移动到LRU aux列表中。 这样,在LRU Main List中搜索的Buffer几乎都是Dirty Buffer,从而提高了搜索效率。
DWR会将搜索到的Dirty Buffer移动到原始主列表中,如果需要导出该Dirty Buffer,请单击,
将此Dirty Buffer移动到lruw aux列表。 然后,可以在DBWR执行导出时从LRUW AUX List中导出。
这实际上是异步导出机制。 (知识源Metalink: 157868.1 )
”
这里没有提到ckpt-q,但是这里的写入写为LRUW AUX List
3358 space.itpub.net/9842/view space-399668
根据这篇文章
「
排队的是与脏块对应的buffer header。
每次写入脏块时,DBWR都会从检查点队列中扫描脏块。
将这些脏数据块实际写入数据文件。
写入完成后,DBWR将从检查点队列中删除写入数据文件的脏块。
这样,即使在巨大的buffer cache下工作,CKPT也可以快速确定哪些脏块写入了数据文件。
只要检查点队列中的数据块是未写入数据文件的脏数据块,则未写入数据文件的数据块是显而易见的
”
「
当DBWR在主LRUW链表中查找更新已完成且正在等待写入数据文件的buffer header时,
当找到的buffer header的数量超过一定限度时(由隐藏参数: _db_writer_scan_depth_pct决定),
DWR不再继续向下扫描,转到次LRUW链表中的脏块并写入数据文件。
”
这是同一篇文章,但关于如何写肮脏数据的说法也不一样。
真的困惑了吗?
3358 www.Oracle fans.cn/forum/show topic.JSP? rootid=35493CPages=1
根据这篇文章
「
在进行正常的CHECKPOINT操作时,CKPT进程会找到CKPT链的开头,将CKPT QUEUE传递给DBWR,DBWR组织CHECKPOINT DBWR批处理,然后DBWR进程开始写入操作。 由于CKPT QUEUE是按照LOW RBA的顺序排序的,因此在进行CHECKPOINT的DBWR完成写入操作后,CKPT进程将对文件和相关的标头的SCN数据进行更高的控制,并记录此次的CKPT操作的结果。
由于ckpt队列上的缓冲区可能在LRU链上,也可能在LRU-W链上,因此在组织DBWR批时,LRU链上的缓冲区是否拆下并放入LRU-W,这些算法目前正在验证
”
也不知道怎么写。
到底写数据时是什么样的算法呢?
bmdgtx,你能告诉我吗?