oracle实例恢复之检查点队列

chain即链。

oracle中链有很多种,LRU、LRUW、checkpoint queue等,都是干什么的呢???

LRU将可用块(干净的块)串起来、LRUW将脏块串起来,指导DBWR进程率先将冷端的块写入磁盘,(buffer cache中的原则是不常访问的块“冲刷”掉,常访问的尽可能保存)也就是说将冷端先变成干净的块,然后串到LRU链上。

但是checkpoint queue作用是什么呢???checkpoint queue主要作用是确定实例崩溃后恢复的起点。数据库掉电、服务器死机均会造成实力崩溃,那么崩溃后会丢数据么,什么样的脏块保存的住,什么样的保存不住呢?答:当实力崩溃恢复后,提交过后的数据会保存住,未提交的事物会回滚。在8i以前,oracle是没有检查点队列,实例恢复完全是靠redo log日志“从头到位”的恢复,这样效率很差,恢复的很慢,当出现checkpoint queue之后确定了恢复的“起点”,那为什么只说“起点”而没有“终点”呢?这里要引出on disk rba,它是redo log日志current状态的最后一条日志也就是在redo log中当前的最近写入的日志,这个就是恢复的终点,所以说终点好找,起点不易啊!

      checkpoint queue确定的是恢复的起点,那它是如何确定的呢?其实checkpoint queue链的块也是脏块,与LRUW链不同的是,它上面链的块是按第一次脏的时间的前后顺序链起来的,而不是按访问的频率。当我们修改数据库中的数据时,修改块会产生日志块的地址,称为RBA(redo buffer address)、LRBA(low redo buffer address)、HRBA。对于脏块,有这三个地址。LRBA是指buffer第一次修改的RBA,就算以后再更改多少次,只要还没有被DBWR进程写入到磁盘中,它的LRBA是不会变的,而HRBA则是最后一次修改的RBA。所以也可以这样说,检查点队列是按LRBA地址链起来的,这样oracle就把最早修改时候的块的信息记录到redo log中了。所以说checkpoint queue链最前部的块就是目前buffer cache中的最早的脏块,这也就是恢复的起点了!CKPT进程有完全检查点和增量检查点,增量检查点会将检查点队列第一个块(最早脏的块)所对应的日志地址(LRBA)记录到控制文件中,当实例恢复时,就会从控制文件中知道恢复的起点了,增量检查点还有一个作用,就是如果发现checkpoint queue过长(也就说明脏块很多),且此时的I/O不是很忙的情况下,这时会触发DBWR进程写脏块,DBWR会优先写checkpoint queue前部分的脏块。但CKPT进程的增量检查点的主要功能还是第一个(三秒一次)。

      当事物提交过后,日志会将log buffer cache中的日志信息通过LGWR进程写入到redo log中,这样就被记录到磁盘了,故实力崩溃,写入到磁盘的信息是不会丢失的,所以当实例恢复时,这些信息就会被恢复,也就是说,提交过后的脏数据,在实例恢复时会被重现在buffer cache中,而未被提交的脏数据是否还会一同被恢复呢,答案是会的,因为它会将从LRBA至on disk rba全部恢复,不论是否提交,但是oracle会自动将未提交的数据回滚。

总结:1.提交的事物,脏块一定会被日志恢复,未提交的事物,也会被日志恢复,但是会被undo表空间回滚。

2.DBWR有两种写方式:写冷端、按检查点队列写较早的脏块。

3.实例恢复,由控制文件中记录的LRBA为恢复的起点,on disk rba为恢复的终点。

上一篇:PHP 解析 ElasticSearch 的 json 方法,有關遍歷所有 json 元素


下一篇:【译】使用 Python 编写虚拟机解释器