Oracle检查点队列–实例崩溃恢复原理剖析

2023-11-14

检查点队列–实例崩溃恢复原理剖析

什么叫检查点队列?

检查点队列是将脏块连接起来,按照第一次脏的数据块依次往后串联起来,形成一个队列。

检查点的作用是什么?

检查点只是一个数据库事件,它存在的根本意义在于减少崩溃恢复时间,Oracle8i以前是没有检查点队列这个说法的,当数据库宕机或者异常关闭的时候(shutdown abort) 再次启动数据库会根据全部的redo log日志将已提交的数据进行恢复,消耗很长时间,检查点队列出现以后只需要找到第一个脏快所对应的redo log的地址和最后被脏的脏快对应的redo log地址进行恢复,缩短了恢复的时间。如下图:

先来认识几个名词:

RBA: redo block address日志的地址,日志块的地址。 如我们对一个数据库进行修改并且提交了将会在redo log里产生对应的日志。RBA正是记录被修改的数据块对应的日志地址。

扩展:对每个脏块来讲有LRBA和HRBA,LRBA数据块指的是最早被脏的日志地址 HRBA数据块最近被脏的日志地址也是对应当前数据块最后一次被修改的日志地址。假设最近一次是第五次被脏,它也对应着一个地址叫HRBA地址。

LRBA 记录着最早被脏的数据块地址,而日志是按照时间顺序记录着buffercache的变化历程,也就是在它后面被脏的数据库都会在它后面也就是检查点队列的后面所有的数据块,它们的脏所对应的日志,都在LRBA对应的日志地址的下面。

如图中的数据块(文件后6 Block500)被修改为B 因为他对应的时间是最早被修改的,所以它可以理解为LRBA,所以对应的redo log它也排在第一位,而在被修改为A之后,又进行了一次事务,虽然不知道具体做了哪些修改,但它仅仅是在修改为A的事务之后发生的,所以排在第二位,redo log的地址也是仅在LRBA之后,紧接着又产了一个事务,将之前修改为B的数据块的名字修改为C,为了控制检查点队列的长度以及性能,相同的数据块再次被修改是不会再次被挂到链上的。所以在链上是看不出来的,但还是会依次记录在redo log中,这就是数据块被修改并且提交的过程。

在这里插入图片描述

后台进程和恢复:检查点(CKPT)
要了解实例恢复,需要了解特定后台进程的功能。
每隔三秒(或频率更高),CKPT 进程就在控制文件中存储一次数据,以记录DBWn 从
SGA 写入到磁盘的已修改数据块。这就称为“检查点”。检查点的用途是标识联机重做
日志文件开始进行实例恢复的位置(这个位置称为“检查点位置”)。
如果使用日志切换,CKPT 进程还会将这个检查点信息写入到数据文件头。
使用检查点的原因如下:
• 确保定期将内存中的已修改数据块写入磁盘,以便在系统或数据库出现故障的情况
下不会丢失数据
• 减少实例恢复所需的时间。在进行恢复时只需处理跟在最后一个检查点后面的联机
重做日志文件
• 确保在关闭过程中所有已提交数据都写入到数据文件中
由CKPT 进程写入的检查点信息包括检查点位置、系统更改号、联机重做日志文件中开始
恢复的位置、关于日志的信息等等。
注:CKPT 进程并不将数据块写入到磁盘,也不将重做块写入到联机重做日志文件。

检查点进程工作方式:

在启动数据库后输入ps -ef|grep ora 会发现有一个进程ora_ckpt这个进程就是检查点进程

这个进程有两种工作方式

完全检查点:当完全检查点发生的时候,CKPT进程会触发DBWR,将所有的脏块写到磁盘上。

增量检查点:将检查点队列最早被脏的日志地址记录在控制文件中,如果发现脏快太多,触发DBWR,缩短检查点队列。

完全检查点案列:

最经典的是关闭数据库的时候,oracle会发生一个完全检查点,CKPT会触发DBWR将所有的脏缓冲区写到磁盘上,这样数据库是干净的关闭了。

数据库正常运行的时候只有正常关闭的时候才会发生完全检查点,所以一般数据库正常运行期间完全检查点几乎不发生,它就会发生增量检查点。oracle每隔3秒钟会发生一次增量检查点。

我们可以用一条sql来查看当前被脏的数据块

select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low RBA",
CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT 
from x$kcccp;

执行结果

SQL> select CPDRT,CPLRBA_SEQ||'.'||CPLRBA_BNO||'.'||CPLRBA_BOF "Low RBA",
CPODR_SEQ||'.'||CPODR_BNO||'.'||CPODR_BOF "On disk RBA",CPODS,CPODT,CPHBT
from x$kcccp;  2    3

     CPDRT Low RBA              On disk RBA          CPODS            CPODT                     CPHBT
---------- -------------------- -------------------- ---------------- -------------------- ----------
        16 5.13167.0            2.34561.0            527629           06/20/2022 13:58:38   911687624
         0 0.0.0                0.0.0                0                                              0
         0 0.0.0                0.0.0                0                                              0
         0 0.0.0                0.0.0                0                                              0
         0 0.0.0                0.0.0                0                                              0
         0 0.0.0                0.0.0                0                                              0
         0 0.0.0                0.0.0                0                                              0
         0 0.0.0                0.0.0                0                                              0

8 rows selected.

CPDRT列是检查点队列中的脏块数目;
CPODS列是on disk rba的scn ;
CPODT列是on disk rba的时间戳 ;
CPHBT列是心跳。

On disk RBA列是一个地址,on disk rba是current日志的最后一条日志的地址。就是我们目前数据库里面的所保存的最后一条日志的地址,logbuffer里面的很多日志还没有写到current里面去,但是logbuffer里面写进来的最后一条日志叫on disk rba。目前数据库里面的current redolog里面的所记录的最新的rba地址叫on disk rba。

如果想要把数据库刷到磁盘里去可以执行

alter system flush buffer_cache;

再次查询脏快数量就会变为0,检查点队列也为空了。

实例恢复
实例恢复或崩溃恢复:
• 原因是尝试打开一个数据库,该数据库中的文件在关闭
时没有进行同步
• 是自动执行的
• 使用重做日志组中存储的信息来同步文件
• 涉及到两个不同的操作:
– 前滚:数据文件还原到实例出现故障之前所处的状态。
– 回退:已执行但尚未提交的更改会返回到初始状态。

Oracle Database 10g 会从实例故障自动进行恢复。DBA 需要执行的操作就是正常启动实例。
实例会装载控制文件,然后尝试打开数据文件。如果发现数据文件在关闭时没有进行同步,
则使用重做日志组中包含的信息将数据文件前滚到关闭时的状态,然后回退所有未提交的
事务处理(因为还原表空间也已前滚)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle检查点队列–实例崩溃恢复原理剖析 的相关文章

随机推荐

  • 类中的成员

    类中的成员 字段 方法 属性 1 字段 字段 普通字段 静态字段 1 class Mycalss 2 str 这是静态字段 3 def init self str1 4 self str1 str1 普通字段 5 实例化对象 6 a Myc
  • php提交表单显示错误,php – 在提交注册表单时使用jQuery显示错误

    你需要修好几件事情 gt 首先 处理注册过程的文件不应该是与表单相同的文件 gt 它纯粹用于处理数据 因此不能使用头 Location login php 直接重定向浏览器 这部分应该由你的JavaScript代码来处理 gt 您还需要告诉
  • 笔记--java sort() 方法排序

    背景 最近在刷一道算法题 字符串重新排序 时 发现自己有思路但是写代码的时候就无从下手了 而且看了答案之后还没看懂 关键就是基础不好 对于排序没有理解 虽然我学过常用的排序算法 但是都是理念 实践少 目的 从实践和原理出发 重点是从实践出发
  • 基于博弈搜索算法的智能五子棋设计

    基于博弈搜索算法的智能五子棋设计 0 引言 在智能过程中 搜索是必不可少的 是人工智能中的一个基本问题 这是因为人工智能研究的主要是那些没有成熟方法可依的问题领域 需要一步一步搜索求解 游戏中如何找到对自己有利的局面就属于这类问题 在游戏
  • SQL注入式攻击

    一 SQL注入式攻击 1 所谓SQL注入式攻击 就是攻击者把SQL命令插入到Web表单的输入域或页面请求的查询字符串 欺骗服务器执行恶意的SQL命令 2 在某些表单中 用户输入的内容直接用来构造 或者影响 动态SQL命令 或作为存储过程的输
  • CS-Stdio Display Builder

    Display Builder 1 操作界面编辑器和Runtime 2 在EPICS edd dm medm edm 想法上构建 3 与CS Studio BOY 兼容性非常好 4 大约2015年在CS Stdio Eclipse中开始 现
  • 【高阶】linux内核环形缓冲区ring buffer实现原理分析

    1 前言 最近项目中用到一个环形缓冲区 ring buffer 代码是由linux内核的kfifo改过来的 缓冲区在文件系统中经常用到 通过缓冲区缓解cpu读写内存和读写磁盘的速度 例如一个进程A产生数据发给另外一个进程B 进程B需要对进程
  • 非root用户安装expect

    非root用户安装expect 文章目录 非root用户安装expect 准备 tcl安装 expect安装 怎么卸载 看了很多教程 踩了很多坑 分享给需要的人 准备 参考资料 ubuntu安装expect 其实不用root权限的原理很简单
  • 设置VS 2013代码折叠

    设置VS 2013代码折叠 版本 VS2013 中文版 步骤 工具 T gt 选项 O gt 文本编辑器 gt C C gt 查看 gt 大纲语句块 设置为 True
  • JavaScript基础

  • matlab低通滤波器

    clc 清除命令窗口 clear 清除所有变量 close all 关闭所有的图形窗口 N 2 10 定义一个变量N 值为2的10次方 n 0 N 1 生成一个从0到N 1的序列 Fs 2000 采样频率 tn n 1 Fs 时间序列 Fn
  • 为什么需要单元测试?

    为什么需要单元测试 从产品角度而言 常规的功能测试 系统测试都是站在产品局部或全局功能进行测试 能够很好地与用户的需要相结合 但是缺乏了对产品研发细节 特别是代码细节的理解 从测试人员角度而言 功能测试和系统测试以及其他性能测试等等对测试人
  • Windows下忘记MySQL root密码解决方法

    Windows下忘记MySQL密码的解决办法网上好多好多 可是 我发现 如果采用Windows服务启动的时候 安装网上通过命令行修改root密码的方法行不通 经过实验 发现 Windows的服务运行的配置并不是在命令行下的配置 查看Wind
  • anaconda怎么运行python脚本_Anaconda运行python脚本 Anaconda方法教程

    你是否想了解Anaconda运行python脚本的操作 下面就是笔者带来的Anaconda运行python脚本的操作步骤 赶紧来看一下吧 相信对大家一定会有所帮助哦 Anaconda是使用 虚拟 环境里边运行Python 这样便于版本 包管
  • 面向对象的设计思想

    面向对象的设计思想 OO思想 Object Oriented 1 看到一个需求的时候不应该直接写代码 应该先考虑有哪些类 2 考虑类的时候 类一定是一类事务的描述 不能太局限 3 考虑类的时候需要考虑主要的类 也就是需要和业务 动作 事件紧
  • 声明指向unsigned int类型的对象的指针vptr_一步步分析:C语言如何面向对象编程...

    一 前言 在嵌入式开发中 C C 语言是使用最普及的 在C 11版本之前 它们的语法是比较相似的 只不过C 提供了面向对象的编程方式 虽然C 语言是从C语言发展而来的 但是今天的C 已经不是当年的C语言的扩展了 从2011版本开始 更像是一
  • c语言string函数的用法_C语言奇淫技巧,字符串的三种表示方法,不会用不是合格的程序员...

    1 在C语言中 是将字符串作为字符数组来处理的 字符串是逐个存放到数组元素中的 例如用一个一维的字符数组存放字符串 I am a boy 如下代码 char c 12 I a m a b o y 这个字符串的实际长度是11 数组长度是12
  • 【红队技术】第二节:信息收集

    https note youdao com s M5U3LWvw
  • 如何高效率提出问题?

    前言 我们总是对自己 不太熟悉 的东西 但是又迫切想知道其答案 所以总是 匆匆 的像他人提出问题 然而 我们发现一个现象 为什么大多数时候 我的问题总是很少引起别人的兴趣 言外之意是 我总是不能在 短时间 的得到一个 正确的答案 本篇根据笔
  • Oracle检查点队列–实例崩溃恢复原理剖析

    检查点队列 实例崩溃恢复原理剖析 什么叫检查点队列 检查点队列是将脏块连接起来 按照第一次脏的数据块依次往后串联起来 形成一个队列 检查点的作用是什么 检查点只是一个数据库事件 它存在的根本意义在于减少崩溃恢复时间 Oracle8i以前是没