oracle检查点队列

Posted huayng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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。

以上是关于oracle检查点队列的主要内容,如果未能解决你的问题,请参考以下文章

Oracle-检查点队列

以编程方式检查Oracle AQ队列是否存在

oracle学习笔记 实例崩溃恢复原理剖析

SCN

Oracle GoldenGate学习之Goldengate介绍

OCP知识点讲解 之 检查点队列与增量检查点