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。

  • 相关阅读:
    opencv出现问题:/usr/lib/x86_64-linux-gnu/libpng16.so.16: undefined reference to `inflateValidate@ZLIB_1.2.9'
    SCI-HUB 解锁论文的正确姿势——如何免费下载论文
    VS2019 实现与 Linux服务器同步
    VS Code 写代码实时同步服务器【Sftp插件】
    Docker实用技巧(二):容器与主机之间复制文件
    Docker实用技巧(一):镜像的备份/保存/加载/删除
    mycat注解及高可用(三)
    mycat分片及主从(二)
    SVN中trunk,branches,tags用法详解
    寄存器的英文全称
  • 原文地址:https://www.cnblogs.com/huayng/p/9211601.html
Copyright © 2011-2022 走看看