这篇文章是参考甲骨论老相老师的视频:
http://v.youku.com/v_show/id_XNDAwOTY3MTU2.html
所做的学习笔记

1. LRU chain 和 LRUW chain CBC chain
     先复习一下:
    
 
         如上图, 在database buffer cache中, 里面的buffer被若干条链串联在一齐(通过头尾部指针实现)

LRU(Least recent used) chain
      
这是一条用于查找最近最少使用的buffer的链, 当buffer不够用时会从这条链冷端找出buffer来重用.

LRUW(Least recent used writed) chain
      
与上面那条LRC chain对应, 有一条专门for  脏buffer的链, 而且是按最近修改次数排序的.
         DBWR后台进程会将这条链的冷端buffers写入dbf文件

CBC(cache buffers chain)
      
根据buffer对应的block在dbf文件位置组织起来的链
       这种链有很多条,  如上图,server process会根据block头部信息算出对应的buffer在dababase buffer cache中的哪一条CBC中,然后遍历出来.

2.  Check Point Queue (检查点队列) chain
      
      
这是按照第一次被修改的时间排列的buffer链.

注意2点:
          1, 里面都是脏buffer
          2. 按照第一次被修改(变脏)时间排序
                 也就说有3个buffer   假如它们第一次修改时间分别是  12:00 13:00 14:00, 那么它们就按照这个顺序排序了, 假如15:00 时第1个buffer又被修改了,  但是这时它们的顺序不会变, 因为顺序依据是第一次的被修改时间啊~

3. Check Point Queue的内容和工作方式
      
这就是本文主要讲的东西,  不过要首先介绍几个概念知识:
       
                3.1 RBA (Redo byte address)
            
看名字就知道这是1个地址.
                当database buffer cache里的1个buffer 被修改时, 也就是被变脏时就会产生日志, 而这些日志为被写入到Log buffer cache(日志缓存里),  那么这些日志在日志缓存里的位置就是RBA了.

而脏buffer会把对把对应的RBA记录在自己的头部信息中, 当这个脏buffer要被回滚时, server process就可以根据RBA找到对应的日志了.

而1个buffer的RBA并不是唯一的. 由于1个buffer可以在不同的时间段被多次修改, 就会产生多次日志, 而这些日志会被写入到log buffer cache中的不同的位置. 所以往往1个buffer里面记录着多个RBA.

             
              3.2 LRBA (Low Redo byte address) 和 HRBA
             
LRBA是RBA的一种.   是对应脏buffer 第一次被修改的日志地址.  而对应地 HRBA就是最近1次被修改的日志地址.


              3.3 Check Point Queue实际上是以脏buffer的LRBA顺序链接起来的.
             
刚才不是说是以第一次被修改的时间为序的吗?
                  没错.  而LRBA就是对应每个buffer第一次被修改的日志地址.
                  而且.  Oracle是严格按照日志的产生时间顺序来写日志的.   也就是地址靠后的日志产生时间肯定比地址靠前的日志产生时间要早.
                
               如下图:
                

可以理解到, 当dirty buffer2在check point queue的位置比 dirty buffer1的位置靠后, 则代表 dirty buffer2的LRBA 肯定比 dirty buffer1 的LRBA 靠后.  也即是 dirty buffer1 的第一次被修改时间比 dirty buffer2的第一次被修改时间早.

3.4 CKPT 进程.
             
checkpoint 进程也叫检查点进程的, 以前都提过了, 是负责更新Oracle 控制文件的.

而CKPT有其中两种事件:
                 a. 完全检查点 (completed checkpoint):

             这时CKPT进程 会 触发 DBWR进程把 check point queue 上所有的脏buffer(也就是所有的脏buffer)写入dbf文件.
                      
                          那么什么时候会出发这个完全检查点的事件呢?  很明显,  这个事件就是要将所有脏buffer写入dbf files的事件.
                          通常来讲, 只有关闭数据库这个1个动作(还有dba手动执行 alter system checkpoint动作),  oracle会将data buffer cache中所有脏buffer写入到dbf文件, 这样数据库的改动就被完整的保存下来了.
                         
                           所以, 在数据库正常运行期间来, 是不会发生完全检查点事件, 对应地, 会每3秒发生一次 增量检查点

b. 增量检查点(incremental checkpoint):
             
这时CKPT 会将  check point queue第一个脏buffer 的 LRBA地址 记录到控制文件中.

而这个事件每3秒发生一次.

上面那个动作,是CKPT进程在增量检查点主要的动作.
                  而实际上, CKPT在增量检查点发生的时候还会做一件事情.
                  就是会检查check point queue, 当它认为check point queue上的脏buffer过多的时候(其实数据库所有脏buffer都在check point queue上啦),    就会把 触发DBWR 把 checkpoint queue 上前几个脏buffer 写入到dbf 文件.     这样就缩短了checkpoint queue 的长度.

也就是会所其实DBWR进程有若干种工作方式, 其中1种是把 LRUW chain中的冷端的脏buffer 写入到 dbf文件. 另一种是在增量检查点事件中被CPKT进程触发, 将checkpoint queue中的前一部分脏buffer 写入dbf文件.

               3.5 on disk RBA 介绍

我们可以用下面语句查看check point queue的一些信息:
                  select CPDRT,
                  CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low RBA",
                  CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF  "On disk RBA",
                  CPODS,CPODT,CPHBT from x$kcccp;

如上图
                 其中 CPDRT 列指的是当前checkpoint queue 上脏buffer的数量.
                       Low RBA 是指checkpoint queue上 第1个脏buffer的 LRBA
                      
                        那么on disk RBA似是啥.
 
                 而我们知道其实Logbuffer 里面空间其实很小,而LGWR 进程不断地将Logbuffer里面的日志写入到 redo log文件中.
                 而redo log文件其实分组的. 当前被写入的那一组就是current状态(当前被写入状态)
                 那么current 状态的redo log 文件记录的最后一条日志的地址,  也就是Current redo log文件最新的那一条日志地址就是On disk RBA了.

              其实就是被记录到硬盘的最新那条日志地址啦.

我们可以见到On disk RBA 的值 比 LRBA的值要靠后一些,   证明上图中checkpoint queen上的第一个脏buffer 已经被写入到硬盘上了.

如下图:

中间那条红线是分割线.  上面的日志已经被写入redo log file,  下面的日志还在Log buffer. 那么redo log file中最新的那个日志地址就是on disk RBA了,  而整体checkpoint queen 的第1个buffer 的LRBA(就是整条checkpoint queue的LRBA) 地址比on disk RBA还早, 当然就已经写入硬盘了.

4. Check Point Queue的作用和意义

见我的另外一篇文章   checkpoint queue的作用与意义:
 http://blog.csdn.net/nvd11/article/details/8749393

Oracle 的检查点队列 (checkpoint queue)相关推荐

  1. Oracle 实例崩溃恢复原理剖析 -- 检查点队列的作用与意义

    这篇文章是参考甲骨论老相老师的教学视频 http://v.youku.com/v_show/id_XNDAxMzI3NzI4.html 所做的学习笔记 检查点队列的内容已经在上一篇文章里讲过: htt ...

  2. oracle脏块,检查点队列上的最早脏的数据块再次被修改以何种顺序刷到磁盘

    >如果dbwr扫描检查点队列,发现队列过长决定刷出从队首到后面的某一个buffer之间的脏块的时候,如果中间有某个脏块此时恰好被别的进程以独占的pin锁住的话,dbwr会怎么办?例如dbwr决定 ...

  3. oracle 完全检查点条件,ORACLE Checkpoint(检查点)

    1定义: ORACLE数据库采用"提交时并不强迫针对数据块的修改完成",而是"提交是保证修改记录(以重做日志形式)写入日志文件"的机制,来获得性能优势.即 用户 ...

  4. Oracle 检查点队列和HASH Bucket

    作为磁盘数据块的缓存,Buffer Cache在Oracle的所有内存池中是最大的. 假设进程要访问5号数据文件中的第1234号块,Oracle如何知道这个块是否在Buffer Cache中?如果在, ...

  5. Oracle GoldenGate 系列:深入理解 Oracle GoldenGate 检查点机制

    检查点将进程的当前读写位置存储在磁盘中用于恢复目的.检查点不仅可以真实地标记 Extract进程捕获的要进行同步的数据变化以及 Replicat进程应用到 target数据库的数据变化,防止进程进行冗 ...

  6. 【Java】使用单向链表实现一个队列(Queue)

    队列(Queue)是数据结构的一种,元素存储满足的特征是先入的先出(类似于现实生活中的排队这一场景) 队列的实现可以使用双向链表,也可以使用单向链表: 在使用单向链表实现队列时候,需要多加一个记录尾结 ...

  7. Berkeley DB的数据存储结构——哈希表(Hash Table)、B树(BTree)、队列(Queue)、记录号(Recno)...

    Berkeley DB的数据存储结构 BDB支持四种数据存储结构及相应算法,官方称为访问方法(Access Method),分别是哈希表(Hash Table).B树(BTree).队列(Queue) ...

  8. python 实现队列功能 queue insert() pop()

    def calculate_detection_num(self, calcu_list, detect_num):"""计算一段次数内平均识别个数"" ...

  9. 五、队列(Queue)

    一.概述 队列(queue): 只允许在一端进行插入 (队尾) 操作,而在另一端 (队头) 进行删除操作的线性表. 队头:删除操作的一端--front 队尾:插入操作的一端--rear 特点:先进先出 ...

最新文章

  1. [codevs 1034] 家园
  2. 02-Wifi通讯架构介绍
  3. linux svn配置教程,linux svn搭建及配置
  4. python接口测试_python接口测试—get请求
  5. c++频繁读取数据会丢失_透析中会丢失什么营养?透析日的饮食需要注意什么?...
  6. Simple QQLogin 2.1(QQ登陆器,适用于 QQ2009 或更新版本)
  7. Dell uefi使用U盘重装系统
  8. 山西台达plc可编程控制器_可编程控制器16(PLC)数据移位指令
  9. 拉钩网前端项目实战05
  10. 推荐一份完整的大数据教学视频
  11. 图形图像基础 之 gif介绍
  12. Android Studio 设置背景色、修改前进后退快捷键
  13. 一个优秀的UI设计师必备的能力,你都有吗?
  14. HTTP协议-Cookie和Session详解
  15. 【STM32Cube笔记】11-中断控制器NVIC
  16. Halcon与C#混合编程--打开笔记本摄像头实时采集
  17. 《拖延心理学》思维导图精华版
  18. Tauri+Vue3创建桌面应用
  19. 【预测模型】基于布谷鸟算法优化BP神经网络实现数据预测matlab代码
  20. 大数据技术原理与应用作业四

热门文章

  1. 【Opencv实战】图像修复神技?看我一秒修复家里的老照片
  2. ++i 和 i++ 效率分析(C++)
  3. Exclusive monitor在spinlock中的应用
  4. [Trustzone]-ARM Cortex-A Serial支持Trustzone和Hypervisor的总结
  5. [How TO]-openjrok维护手册
  6. Raft 集群成员变更、日志压缩、客户端交互
  7. 去除C++中string前面和后面的空白符
  8. 从一个被Tomcat拒绝的漏洞到特殊内存马
  9. 设计模式C++实现(14)——职责链模式
  10. Dalvik指令集 (smali汇编)