ITPub博客

首页 > 数据库 > Oracle > ORACLE buffer cache 原理 --检查点队列链表(参照学习:oracle内核技术揭秘)

ORACLE buffer cache 原理 --检查点队列链表(参照学习:oracle内核技术揭秘)

原创 Oracle 作者:lff1530983327 时间:2016-08-30 23:43:19 0 删除 编辑

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/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2014-11-12

  • 博文量
    72
  • 访问量
    49744