首页 > 数据库技术 > 详细

oracle检查点队列

时间:2018-06-24 23:05:02      阅读:292      评论:0      收藏:0      [点我收藏+]

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

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

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。

oracle检查点队列

原文:https://www.cnblogs.com/huayng/p/9211601.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!