修改块为例:
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内核技术揭秘_吕海波中理解
oracle 内核介绍——检查点队列链表CKPT-Q
来源:这里教程网
时间:2026-03-03 19:11:44
作者:
编辑推荐:
- oracle 内核介绍——检查点队列链表CKPT-Q03-03
- oracle RFS[16]: No standby redo logfiles available for thread 103-03
- oracle Buffer pin锁的过程(Buffer busy waits)03-03
- oracle 一次ORA-00600:[krrfro_cachedscn]案例03-03
- oracle 通过tar包刷数据字典方式升级(10g-11g)03-03
- 江波龙 MWC26 巴塞罗那展示 HLC UFS 与 pTLC UFS 嵌入式闪存解决方案03-03
- 消息称索尼《战神》系列 IP 续作今年内官宣,游戏主角为奎托斯妻子“劳菲”03-03
- 航嘉推出 1250W 重火力金牌全模组电源,999 元03-03
下一篇:
相关推荐
-
雷神推出 MIX PRO II 迷你主机:基于 Ultra 200H,玻璃上盖 + ARGB 灯效
2 月 9 日消息,雷神 (THUNDEROBOT) 现已宣布推出基于英
-
制造商 Musnap 推出彩色墨水屏电纸书 Ocean C:支持手写笔、第三方安卓应用
2 月 10 日消息,制造商 Musnap 现已在海外推出一款 Oce
热文推荐
- oracle 内核介绍——检查点队列链表CKPT-Q
oracle 内核介绍——检查点队列链表CKPT-Q
26-03-03 - oracle RFS[16]: No standby redo logfiles available for thread 1
- oracle Buffer pin锁的过程(Buffer busy waits)
- oracle 一次ORA-00600:[krrfro_cachedscn]案例
- oracle 通过tar包刷数据字典方式升级(10g-11g)
oracle 通过tar包刷数据字典方式升级(10g-11g)
26-03-03 - 江波龙 MWC26 巴塞罗那展示 HLC UFS 与 pTLC UFS 嵌入式闪存解决方案
- 消息称索尼《战神》系列 IP 续作今年内官宣,游戏主角为奎托斯妻子“劳菲”
- 航嘉推出 1250W 重火力金牌全模组电源,999 元
航嘉推出 1250W 重火力金牌全模组电源,999 元
26-03-03 - 开发商 Iron Galaxy Studios 暗示正重制 B 社经典游戏《辐射:新维加斯》,有望引入虚幻引擎 5
- 高通展示 AI200 推理机架:结合自有加速器与 AMD CPU
高通展示 AI200 推理机架:结合自有加速器与 AMD CPU
26-03-03
