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。

  • 相关阅读:
    Linux下fork机制详解(以PHP为例)
    查看Nginx、PHP、Apache和MySQL的编译参数
    MySQL更新
    Map集合的四种遍历方式
    Selenium2工作原理
    Web自动化测试框架-PO模式
    jmeter(十二)处理Cookie与Session
    java 字符串截取的几种方式
    操作JavaScript的Alert弹框
    selenium 延迟等待的三种方式
  • 原文地址:https://www.cnblogs.com/huayng/p/9211601.html
Copyright © 2011-2022 走看看