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为恢复的终点。

oracle实例恢复之检查点队列的更多相关文章

  1. oracle检查点队列与增量检查点【转载】

    oracle检查点队列与增量检查点 今天是2013-09-04,这几天一直心里安顿不下来,今天还好了,可以自己安静的学习一下oracle,在此记录一下学习笔记.这篇文章我不知道在那转载的,一直都留在我 ...

  2. oracle检查点队列(checkpoint queue)

    buffer cache CBC链 按地址链 LRU  干净buffer LRUW  脏buffer  按照冷热 checkpoint queue:链buffer,①链脏块②按buffer第一次脏的时 ...

  3. oracle实例名,数据库名,服务名等概念差别与联系

    数据库名.实例名.数据库域名.全局数据库名.服务名 这是几个令非常多刚開始学习的人easy混淆的概念.相信非常多刚開始学习的人都与我一样被标题上这些个概念搞得一头雾水.我们如今就来把它们弄个明确. 一 ...

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

    原创 http://blog.chinaunix.net/uid-26762723-id-3271558.html 检查点的主要目的是以对数据库的日常操作影响最小的方式刷新脏块.脏块不断的产生,如何将 ...

  5. Oracle 实例恢复

    -======================= -- Oracle 实例恢复 --======================= 一.Oracle实例失败 Oracle实例失败多为实例非一致性关闭所 ...

  6. Oracle实例名,服务名等概念区别与联系

    数据库名.实例名.数据库域名.全局数据库名.服务名 , 这是几个令很多初学者容易混淆的概念.相信很多初学者都与我一样被标题上这些个概念搞得一头雾水.我们现在就来把它们弄个明白. 一.数据库名 什么是数 ...

  7. oracle之二检查点

    检查点(checkpoint) 8.1 什么是checkpointcheckpoint是数据库的一个内部事件,检查点激活时会触发数据库写进程(DBWR),将数据缓冲区里的脏数据块写到数据文件中. 8. ...

  8. Oracle实例和Oracle数据库(Oracle体系结构)

    --========================================== --Oracle实例和Oracle数据库(Oracle体系结构) --==================== ...

  9. 【转载】Oracle实例和Oracle数据库(Oracle体系结构)

    免责声明:     本文转自网络文章,转载此文章仅为个人收藏,分享知识,如有侵权,请联系博主进行删除.     原文作者:Leshami      原文地址:http://blog.csdn.net/ ...

随机推荐

  1. *HDU2510 DFS

    符号三角形 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submi ...

  2. STL之list

    list是一个线性链表结构,它的数据由若干个节点构成,每一个节点都包括一个信息块,一个前驱指针和一个后驱指针.它无需分配指定的内存大小且可以任意伸缩,这是因为它存储在非连续的内存空间中,并且由指针将有 ...

  3. 【Java】实战Java虚拟机之五“开启JIT编译”

    今天开始实战Java虚拟机之五“开启JIT编译” 总计有5个系列 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Ja ...

  4. 实战Java虚拟机之一“堆溢出处理”

    从今天开始,我会发5个关于java虚拟机的小系列: 实战Java虚拟机之一“堆溢出处理” 实战Java虚拟机之二“虚拟机的工作模式” 实战Java虚拟机之三“G1的新生代GC” 实战Java虚拟机之四 ...

  5. 配置Office 365单点登录摘要

    O365: 如果O365账号之前做过测试,则停用同步,强制删除已有用户涉及命令:Remove-MsolUser -UserPrincipalName zhang_san@company.cn (-Re ...

  6. 合并多个工作薄workbooks到一个工作薄workbook

    微软示例教程 微软示例教程 Sub MergeAllWorkbooks() Dim SummarySheet As Worksheet Dim FolderPath As String Dim NRo ...

  7. dock-compose 安装

    apt-get install python-pip python-dev pip install -U docker-composechmod +x /usr/local/bin/docker-co ...

  8. 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果

    [转] 原文 自定义RecyclerView.ItemDecoration,实现RecyclerView的分割线效果 字数1598 阅读302 评论2 喜欢23 1.背景   RecyclerView ...

  9. VC++获取IDC_EDIT的7种方法

    VC++获取IDC_EDIT的7种方法 http://blog.csdn.net/baizengfei/article/details/7997618 //第一种方法 int number1, num ...

  10. python httprequest, locust

    r = self.client.get("/orders", headers = {"Cookie": self.get_user_cookie(user[0] ...