zoukankan      html  css  js  c++  java
  • oracle检查点队列

    主要总结数据库写脏块的机制。

    当一个进程要进行修改数据块的时候

    1、获取cbc latch

    2、修改buffer pin status

    3、释放cbc latch

    4、生成redo记录

    5、修改buffer数据块

    6、将脏块移到检查点队列中,到此才算修改完毕

    7、获得cbc latch

    8、修改buffer pin status

    9、释放cbc latch

    这里说明第6步:

    如上图,检查点队列上有4个块,他们的顺序就是变脏的顺序,当6号文件322号块被修改时,会在redo生成对应日志条目,这里的2.1.322意思是2号redo日志1号块的322号字节。这里第一条redo日志记录6号文件322号块第一次改变后映像在redo中的地址,称为low rda,后面又一次改变的地址被称为high rba,这里high rba意义不大,而low rba意义重大。oracle中没过3s会触发增量检查点通知dbwr写脏块,具体些多少脏块由参数fast_start_mttr_target控制。这里解释下fast_start_mttr_target,oracle写脏块条件是发现脏块过多,什么情况下算脏块过多?假设有3000个脏块,系统每次io为1ms那么恢复3000个脏块就需要3s,而fast_start_mttr_target就是控制实例恢复时间,就是说假如宕机我要在该值的时间内恢复完数据库,所以该值除每个脏块写的时间就是刷新一次脏块的数目,通常由oracle根据系统硬件情况自动调整,默认为300s。

     low rba的意义:实例恢复。

    当数据库在写第2个脏块也就是3号文件233号块的时候突然宕机了,buffer中的脏数据都已经没了,那oracle是怎么恢复的呢?其实答案就是low rba,在实例恢复时候oracle会去检查检查点队列第一个low rba地址位置,由于6号文件322号块已经完成写了(这里注意下oracle在写过程中会先把数据库从检查点队列放到obj-q队列)此时检查点队列的第一条记录是3号文件的322号块在redo中的low rda位置,这个记录就记录在控制文件中。其实仔细观察可以发现,检查点队列的顺序就是redo记录中的顺序,我们找到检查点队列第一条需要恢复的rda位置时候就能根据rda将原来的检查点队列恢复出来,有2个小点需要注意,第一,这里的终点其实就是on disk rda,这条记录的意思是oracle写入redo日志到磁盘的redo位置,如果说redo的rba大于这个值说明还有log buffer未刷到磁盘里,oracle也不会去恢复它。第二,6号文件322号块第二次改变是不需要恢复的,在第一次变成脏块的时候,数据库就已经将该块的值改为了green当恢复遇到该条目的时候,会将green改为green,所以说low rba的重要性远远大于high rba。

  • 相关阅读:
    1093 Count PAT's(25 分)
    1089 Insert or Merge(25 分)
    1088 Rational Arithmetic(20 分)
    1081 Rational Sum(20 分)
    1069 The Black Hole of Numbers(20 分)
    1059 Prime Factors(25 分)
    1050 String Subtraction (20)
    根据生日计算员工年龄
    动态获取当前日期和时间
    对计数结果进行4舍5入
  • 原文地址:https://www.cnblogs.com/huayng/p/9211601.html
Copyright © 2011-2022 走看看