oracle 检查点队列链表CKPT-Q

修改块为例:
update,只是修改buffer cache中的buffer,改完后,update算完工。buffer和磁盘中的block就不一致了,buffer中的最新数据没有写入磁盘。buffer就是脏buffer(又称脏块)。脏块由DBWR进程统一写入磁盘,DBWR写脏块的过程也叫刷新脏块。

定义哪些buffer是脏块,需要一个链表把所有脏buffer串起来,DBWR写脏块时,按照这个链表顺序来。
这样的链表有2个,CKPT-Q(检查点队列链表)和LRUW。

没有任何脏块的情况,要修改5号文件1234号块,流程如下
更改1234号块时,在CBC latch保护下,块状态被改为脏块。进程先持有checkpoint queue latch,然后将1234号块加入检查点队列(CKPT-Q)
在这里插入图片描述

块被修改后,产生对应的redo数据,下面是第一行张三,改成李四,后映象被记录在19号redo文件1号块的16字节处,19.1.16是这个redo记录的地址,这个地址也叫RBA(redo block address)
在这里插入图片描述

5号文件的4321号块被修改,产生的redo紧接着上条记录存放(时间在1234号块之后),如果4321号块的redo记录在400字节,地址就是19.1.400
在这里插入图片描述

并不是每次修改块都会对检查点队列做出改变。例子:1234号块再次被改变,李四改成王五,新的地址是19.2.80,但是检查点队列没有变化。
在这里插入图片描述

第一次修改,块由不脏转脏,会被加入检查点队列。当脏块再次被修改,完成修改的进程不需要持有checkpoint queue latch,不需要对检查点队列做改动。所以checkpoint queue latch通常不会造成竞争。因为不是每次修改块都需要持有此latch,反复修改脏块不需要持有此latch

1234号块2次修改,redo地址分别是19.1.16和19.2.80,老地址被称为low RBA,简称LRBA。最后一次修改的redo地址被称为high RBA,简称HRBA。可以说检查点队列脏块的顺序,就是LRBA的顺序。

又一个块被修改,6号文件135号块。检查点队列排在4321后面,redo记录排在二次修改的1234后面。
在这里插入图片描述

Buffer cache中所有buffer,当第一次变脏时会立即被链接到检查点队列中。
将脏块链接到检查点队列中是修改操作的一部分,完成链接动作才算修改完成。

脏块写入磁盘由DBWR进程负责,DBWR每3秒会被唤醒活动一次。
醒来后,查看检查点队列长度(就是看脏块数量),如果DBWR认为脏块过多,他会把脏块写进磁盘。

例中,DBWR醒来,获取checkpoint queue latch ,扫描检查点队伍,看脏块数量,发现脏块过多,开始写脏块。1234-4321-135顺序被写入磁盘。
扫描完,确认要写的脏块后,会把脏块从检查点队列移走,移到对象队列(OBJ-Q),当移动完毕后,会释放checkpoint queue latch。
实际上,DBWR不是一次性把所有脏块写完。

在这里插入图片描述

假设DBWR此次只写了一个脏块(5号文件的1234号块),在写进磁盘前,已经被移出检查点队列了。1234号块已经不脏了。
在这里插入图片描述

此时宕机,剩余2个脏块里的修改的数据丢失,宕机后buffer cache没了,内存里的信息就丢了。但是19号redo文件的信息不会丢,因为他是已经写进redo文件的信息。
在这里插入图片描述

宕机后,缺了哪些脏块,从检查点队列中可以知道,从而恢复这几个块。但是内存中的信息没了,检查点队列也就没了。可以根据redo来判断。
在这里插入图片描述
在这里插入图片描述

如何根据redo记录找到要恢复的脏块呢?找到对应的redo记录19.1.400,以此顺序向下恢复即可。

这里的从19.1.400开始的原因,见下方!!!
在这里插入图片描述

实例恢复时,19.1.400处开始读取redo记录,进行恢复,深色部分需要恢复。
在这里插入图片描述

恢复19.1.400,在redo中记录了文件号、块号、后映象(就是被修改成了什么值)、第几行、第几列。恢复进程从磁盘中把5号文件4321号块读进buffer cache,再降后映象写入到buffer cache中的4321块的第一行第一列。
在这里插入图片描述

涉及到19.2.80是不需要恢复的,因为此时5号文件1234号块不脏了,这个块做过2次修改,从张三到李四(不脏——脏),然后从李四到王五(脏——脏)。因为增量检查点出发,1234号块写入磁盘,值是最后一次被修改的值。
在这里插入图片描述

实例恢复时,RBA是19.2.80的redo记录,可以不用恢复,宕机之前就不脏了。
在这里插入图片描述

由于19.1.400是恢复起始点,所以1234号块也会被恢复。1234号块会从磁盘读到buffer cache中,将原本是王五的值再次改成王五。
在这里插入图片描述

宕机过后,此案例是从19.1.400处开始恢复,这个值必须保存在磁盘上,需要实例恢复时,从磁盘上读取它,再从它指向redo处开始恢复。
恢复是从检查点队列头记录的LRBA处开始恢复,检查点队列头又称为检查点位置(checkpoint position)。在宕机后,内存清空,内存信息丢失。
oracle找CKPT进程,每3秒一次将检查点位置对应的LRBA记录到控制文件中。
在这里插入图片描述

小结:
1.块被修改会产生redo记录
2.块在不脏变脏时会被链接到检查点队列中(CKPT-Q)
3.检查点队列中的块的排列顺序和redo记录的顺序基本一致
4.DBWR每3秒检查一次CKPT-Q(检查点队列)的长度,就是脏块数,队伍过长就触发写脏块。
5.DBWR会沿着检查点队列的顺序写脏块。
6.CKPT每3秒一次,将检查点队列头对应的LRBA(low RBA)写进控制文件。
7.崩溃、宕机,需要实例恢复,恢复起始点就是控制文件中记录的检查点队列头对应的LRBA(low RBA)
8.实例恢复开始时,找到LRBA,再定位到某个redo 的某个位置,开始依次进行实例恢复。

本文从Oracle内核技术揭秘_吕海波中理解

  • 19
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

汪灵骅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值