Buffer Cache结构及LRU, LRBA , Checkpoint Queue[final]



Buffer Cache结构:

链表为 Hash Chain  "-->" 

Buffer header里面记录的指针就指向buffer cache中的该数据块本身


[hash bucket 0] --> [buffer header] --> [buffer header] --> [buffer header]  ...

[hash bucket 1] --> [buffer header] ...

[hash bucket 2] --> [buffer header] --> [buffer header] ...

[hash bucket 3] --> [buffer header]

[hash bucket 4] --> [buffer header] --> [buffer header] 

[hash bucket 5] --> [buffer header] --> [buffer header] --> [buffer header]  ...

... 

 

LRU:  Least Recently Used,也就是指最近最少使用的buffer header链表。LRU链表串联起来的buffer header都指向可用数据块。buffer按照被使用的先后顺序挂在LRU链表上,先被使用的buffer挂在LRU链表的后面,后被使用的buffer则被挂在LRU链表的前面。如果buffer被DML语句修改了,则该buffer会从LRU链表上摘下来。换句话说,LRU链表上的buffer header所指向的buffer都是可用数据块。

 


检查点队列 (Checkpoint Queue,Dirty List) --

该队列上串起来的都是脏数据块所对应的buffer header。而每次DBWn写脏数据块时,也是从检查点队列上扫描脏数据块,并将这些脏数据块实际写入数据文件的。当写完以后,DBWn会将这些已经写入数据文件的脏数据块从检查点队列上摘下来。

检查点队列上的buffer header是按照数据块第一次被修改的时间的先后顺序来排列的。越早修改的数据块的buffer header排在越前面,同时如果一个数据块被修改了多次的话,在该链表上也只出现一次。buffer header还记录了脏数据块在第一次被修改时,所对应的重做条目在重做日志文件中的地址,也就是LRBA (Low Redo Block Address).

[buffer header0]->[buffer header2]->[buffer header3]->[buffer header4]->....

 


LRBA --

Redo log file中的LRBA (Low Redo Block Address) 表示脏数据块第一次被修改时候所对应的重做条目在重做日志文件中的地址 (Low表示第一次修改)

[LRBA0][LRBA1][LRBA2][LRBA3][LRBA4][LRBA5][LRBA6]

 

检查点位置(Checkpoint Position) --  

表示出现系统崩溃后日志文件中的重做条目恢复起点

当前检查点队列上的第一个buffer header,该buffer header中所记录的LRBA 就是checkpoint position,  该检查点位置记录在控制文件里

 

DBWn负责写检查点队列上的脏数据块,而CKPT负责记录当前检查点队列的第一个数据块所对应的的重做条目在日志文件中的地址。而到底应该写哪些脏数据块,写多少脏数据块,则要到检查点队列上才能确定的。

 

请使用浏览器的分享功能分享到微信等