CKPT-Q 和 LRU
在update过程中,首先在前文所讲的CBC Latch的保护下修改数据,之后进程先持有 checkpoint queue latch,然后将5号文件中的1234号块加入到检查点队列(CKPT-Q),当然还有产生对应的redo数据。再次update时 会在产生一个新的redo数据,并不会影响CKPT-Q,所以只有在不脏变脏的过程中才需要持有 checkpoint queue latch。最后一次redo的地址为high RBA,第一次是的 是 low rba ,LRBA的作用是巨大的,检查点队列中脏块的顺序就是 LRBA的顺序。DBWR会按照CKPT-Q 顺序写脏块。首先扫描checkpoint queue latch 然后确定要写的脏块后,将其移到OBJ-Q中,移动完毕,马上释放checkpoint queue latch。
实例恢复时是从检查点队列的LRBA处开始恢复的。检查点队列头又称为检查点位置,CKPT进程会每隔3秒将检查点位置对应的的LRBA记录到控制文件中。
redo信息包括: 所属的文件号 对应的块号 被修改的行号 列号 还有后映像。
DBWR发现队列中的脏块较多,才开始写入磁盘。影响其写入的因素有一下几个:
1>fast_start_mttr_target,表示用户期望的恢复时间。对应多少个脏块的恢复时间可以估算需要刷脏块的比例。10g后 自调节检查点是默认开启的。
2>IO合并缓冲区,是为了将相邻的脏块合并为一个IO一次性写入而设置的一个专门的缓冲区。脏块太多的时候 ,可以将脏块分成多个batch 分批合并。开始写构成一个batch的脏块前,一个batch会记录db file parallel write等待事件,直至这一个batch所有操作都完成,事件才结束。
检查点队列与实例恢复相关:
1.块被修改时会产生redo log
2.块由不脏变脏会写入检查点队列
3.检查点队列中的排列顺序和redo log记录基本一致
4.DBWR每3秒检查一次检查点队列长度,过长,则会触发写脏块
5.DBWR会沿着检查点队列顺序写脏块
6.CKPT每3秒一次,将检查点队列头对应的LRBA写进控制文件
7.如果数据库崩溃,需要恢复,起点就是控制文件中的检查点队列头对应的LRBA
8.开始恢复时候,Oracle找到LRBA再定位到redo 文件的某个位置,开始依次进行实例恢复。
LRBA : low redo block address 对应的还有HRBA
写脏块之前,Oracle会有一个合并的动作,在共享池中有一个IO合并缓存区就是用作这个的,主要是合并IO
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30018455/viewspace-2124239/ ,如需转载,请注明出处,否则将追究法律责任。