zhuqibs
作者zhuqibs·2020-04-26 09:46
软件开发工程师·Adidas

Oracle DBA 应知应会 -- DB CACHE的几个主要的链和CKPT算法

字数 3303阅读 1205评论 0赞 6

DB CACHE中有很多重要的链,这些链或者和DB CACHE的分配、换出、刷新优化,或者和DB BLOCK的查找有关。下面我们先来了解这些链的基本情况,然后我们来探讨一下这些链在各种DB CACHE活动中所起的作用。
LRU list 和LRU-AUX list
LRU list也叫replacement list,这就是大家常说的LRU链。这个链我们在前面的章节已经做了很详细的介绍,这里就不多说了。要特别提到的是LRU-AUX list,LRU-AUX链是LRU链的一个子链。从LRU-AUX头开始的BLOCK是被确认为CLEAR的,其来源包括DBWR已经写回文件的数据块和UNPIN的干净块。前台进程查找空闲BUFFER的时候,就是首先在LRU-AUX中查找,因为从这里找到的BUFFER一般都是可用的。
LRU-W list (write list)
LRU-W list就是我们常说的脏数据链,在前面的章节中,我们已经详细介绍了LRU-W链,对于LRU-W链,也存在一个AUX链LRUW-AUX。引入AUX链的目的是为了提高LRU-W的效率,支持异步DBWR作业。在这个链没有引入以前,当一个DBWR作业没有完成前,是无法进行下一个DBWR作业的。引入AUX后,AUX链存放的是当前DBWR正在写入的数据,LRU-W就腾出来处理下一个DBWR作业了。
LRU-XO list (reuse object list)
LRU-XO list也被称为重用对象链,这个链主要是为了对TRUNCATE,DROP等操作的对象相关的BUFFER进行CHECKPOINT操作。当reuse object cross instance call事件发生的时候,CKPT会将这个对象的脏数据块放入LRU-XO链,然后由DBWR将这些数据块写盘。当CKPT发现这个链已经空的时候,本次CHECKPOINT操作可告结束。
LRU-XR list (reuse range list)
LRU-XR list也被称为Reuse range链,当reuse range cross instance call事件发生的时候,CKPT搜索这些BUFFER,把脏数据块放入LRU-XR链,然后由DBWR将这些数据写盘。当CKPT发现这个链已经空的时候,本次CHECKPOINT可告结束。如果我们要将某个表空间OFFLINE或者将某个表空间设置为READ ONLY的时候,这个时候就会产生ruse range cross instance call事件,因为要安全的完成这些操作,必须要将表空间上的脏数据全部写入磁盘。

上面我们介绍了一些LRU链,下面我们再来看看BUFFER HEAD的数据结构,看看这些链是如何使用的(下面的伪代码是10G的BH的一部分,为了读者能够更清晰的查阅,我去掉了一部分不相干字段)
kgglk HASH链的指针;
ktsn 表空间号;
krdba RDBA地址;
kobjd 存储OBJNO; / 不一定有 /
kobjn 字典OBJNO; / 不一定有 /
ub2 绝对文件号;
b1 BUFFER修改计数;
ub2 仿真组ID;
ub1 在WORKING SET上的CKPT队列号;
kgglk kcbbhckql; / ckpt queue的链接指针/
kgglk kcbbhfql; / 文件CKPT QUEUE的指针,每个文件都有一个ckpt queue,在做reuse range的时候就有用了 /
ptr_t kcbbhba; /指向真正的BUFFER/
kgglk kcbbhus; /+ 正在使用该BUFFER的使用者的列表/
kgglk kcbbhwa; / 正在等待该BUFFER的列表/
kgglk kcbbhrpl;/ BUFFER的LRU链指针/
b1 是否在LRU-W上; /如果在LRU-W上,该值为TRUE/
b1 LRU闩锁保护标识;
ub2 TCH;
void * 指向TX STAT OBJECT的指针;
kcocv * 指向该BUFFER的最后一个CHANGE#的指针;
struct kcbwds * WORKING SET的指针;
krfgda kcbbhgda; /闪回数据的磁盘地址/
kgglk kcbbhoq; /对象CKPT QUEUE的指针,在REUSE OBJECT的时候使用/
根据上面的数据结构,接下来我们要推测CKPT操作了。以前也经常有人问我CKPT的相关操作,我在这方面也研究较少,主要是Oracle这方面的文档实在是太少了。虽然从TOM和STEVE那里可以获得一些资料,但是都比较支离破碎,因此针对CKPT操作的一些细节问题,我也只能通过上面的数据结构做一个推测,这个推测一定准确,不过大体上可以反映出CKPT算法的一些最为基本的概念。
首先,我们来看看CHECKPOINT QUEUE。CHECKPOINT QUEUE是通过LOW RBA排序的一个链表,当某个BLOCK发生变化的时候,会将该BLOCK按照LOW RBA地址链入相关的CHECKPOINT QUEUE,这些链表包括标准CKPT QUEUE(老白在这里用了“标准”两个字,实际上这不是Oracle 内部的术语,这部分内容公布的很少,因此老白用“标准”两字来将其区别于RANGE和OBJECT两个CKPT QUEUE)、XO CKPT QUEUE(OBJECT CKPT,每个对象一个)和XR CKPT QUEUE(RANGE CKPT,术语称为PER-FILE CKPT QUEUE,每个数据文件一个)。
在做普通的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中的块被写入数据库是不同的。
当TRUNCATE,DROP之类的操作发生的时候,也会发生CHECKPOINT,这类的CHECKPOINT被称为是REUSE OBJECT CHECKPOINT,发生这个操作的时候的具体操作目前很少有资料说明。老白猜测当REUSE OBJECT CHECKPOINT发生时,CKPT进程将kcbbhoq指向的OBJECT CHECKPOINT链上的脏块链入LRU-XO,交给DBWR处理。DBWR组织写批处理,进行写入操作。只有当所有的LRU-XO上的块全部被写入后,DDL操作才能完成。这种算法也造成了TRUNCATE一个大对象可能会很慢(如果这个对象很多块是脏块的话)。10G的kcbbhoq字段是一个对象的BUFFER链。这条链的存在对于REUSED OBJECT CROSS INSTANCE CALL的性能有很大的帮助。

当表空间设置READ ONLY或者OFFLINE的时候,会触发REUSE RANGE的CHECKPOINT,其原理和REUSE OBJECT的CHECKPOINT类似。通过在BUFFER HEAD中的kcbbhfql将每个数据文件的脏块串成一条链。这样,当REUSE RANGE CHECKPOINT发生时,CKPT将这条链链入LRU-XR,然后交给DBWR处理。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

6

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广