热门标签 | HotTags
当前位置:  开发笔记 > 运维 > 正文

Oracle恢复内部原理(实例恢复)

当Oracle内核发现一个实例死掉而对应线程在控制文件中的线程打开状态位还是开的时候会自动进行实例恢复。

当Oracle内核发现一个实例死掉而对应线程在控制文件中的线程打开状态位还是开的时候会自动进行实例恢复。

实例恢复用于恢复崩溃失败或者并行服务器环境中的实例失败,所以实例恢复既可以指崩溃恢复也可以指并行服务器环境中的实例恢复(只要有一个存活的实例就可以恢复其他一个或多个失败的实例)。

实例恢复的目标就是还原失败实例在数据缓冲区中的数据块并关闭还开着的线程。实例恢复只用联机归档日志和当前联机数据文件(不需要还原历史备份)。实例恢复一次只能恢复一个线程,它从该线程最近的线程检查点开始恢复直至线程的结束。

系列文章:Oracle恢复内部原理 ?where=nkey&keyword=19824

5.1 检测是否需要实例恢复

当Oracle内核发现一个实例死掉而对应线程在控制文件中的线程打开状态位还是开的时候会自动进行实例恢复。实例恢复在下面两种情形下自动进行:

1. 崩溃失败后第一次打开数据库。

2. 并行服务器个别实例(不是所有的)失败了。

在并行服务器环境中,存活的实例通过下列方法检测到一个或多个实例失败需要进行实例恢复:

1. 存活实例的一个前台进程在将数据文件中的块读入数据缓冲区时检测到“Invalid block lock” 。这个多发生在另一个实例已经将该块读入数据缓冲区并用锁保护了该块‘脏数据’,然后该实例失败了。

2. 存活实例的前台进程通知它的SMON进程查看失败的实例。

3. 存活实例可以申请死亡实例的线程打开标志锁从而发现该实例已经死亡。

存活实例的SMON进程得到一个死亡实例的列表和错误的数据块列表。注:当实例恢复结束后,,这些列表中的锁都会被清掉。

5.2 Thread-at-a-Time Redo Application

实例恢复同一时间只能处理一个线程,因此同一时间也只能恢复一个实例。在处理下一个线程之前,实例恢复会将每个线程的所有重做日志(从该线程的线程检查点开始到线程结束)应用到数据文件上。这个算法的正确性取决于同一时刻只有一个实例能修改数据缓冲中的块。在不同的实例修改同一块之间,该块会被写回磁盘。因此,实例恢复时从磁盘中读入数据缓存中块只需要某一个线程就够了,那个线程包含了该块最新的修改日志。

实例恢复总是能够只要该线程的联机日志就可以完成。崩溃恢复首先处理线程检查点最低的那个线程,按照线程检查点SCN递增的顺序进行恢复。保证了数据库检查点是由每个恢复过的线程推进的。

5.3 当前联机数据文件

检查点计数器用于校验数据文件是当前联机数据文件而不是历史备份。如果数据文件是从备份中还原出来的,则需要首先进行介质恢复。

当数据文件是从备份中还原出来的时候,即使只要联机重做日志就可以恢复,介质恢复仍然不可避免。理由是崩溃恢复在处理每个线程的时候都是应用该线程检查点以后的重做日志。崩溃恢复能够用这种重做算法是因为每个块只需要最多一个线程的重做日志。

然而,如果在还原的备份上进行恢复时,无法断定要哪些线程的重做日志。因此一次一个线程的算法在这种情况下不起作用。在备份上恢复需要将多个线程的重做合并。如把数据文件检查点后的所有重做日志,按照SCN递增的顺序合并各个线程中的重做日志。这种线程合并重做算法只有介质恢复才会用(见第6节)。

崩溃恢复如果使用线程合并重做算法恢复一个备份,即使数据文件的检查点跟数据库检查点一致,依然会失败。原因是在所有的线程中,崩溃恢复会丢失数据库检查点和最高的检查点之间的重做日志。相比之下,介质恢复会从数据文件检查点开始应用重做程序。而且,即使崩溃恢复也从数据文件检查点开始应用重做程序,还是会失败。因为它只会去找联机重做日志。而所有线程可能都已经将其重做日志归档了并重用了联机日志。

如果使用了命令STARTUP RECOVER ,崩溃恢复会因为数据文件需要介质恢复而失败。此时在数据库打开之前会自动调用RECOVER DATABASE进行介质恢复。

5.4 检查点

实例恢复不会尝试应用数据文件检查点之前的重做日志(数据文件头部的检查点SCN不能决定是否需要实例恢复)。

实例恢复读取从数据文件检查点之后到线程结束之际的重做日志,找到该线程分配的最大的SCN。用于关闭线程和推进线程检查点。实例恢复结束后也会推进数据文件检查点和检查点计数器。

5.5 崩溃恢复完成

崩溃恢复完成时,所有数据文件的联机模糊位,热备份模糊位,介质恢复模糊位都将被清除掉,然后在重做日志中写入一笔特殊的重做记录,标记崩溃恢复的结束。这条记录用于通知介质恢复在恢复时何时可以清除数据文件的联机模糊位和热备份模糊位。


推荐阅读
  • 1:有如下一段程序:packagea.b.c;publicclassTest{privatestaticinti0;publicintgetNext(){return ... [详细]
  • 本文介绍如何解决在 IIS 环境下 PHP 页面无法找到的问题。主要步骤包括配置 Internet 信息服务管理器中的 ISAPI 扩展和 Active Server Pages 设置,确保 PHP 脚本能够正常运行。 ... [详细]
  • 本文详细探讨了KMP算法中next数组的构建及其应用,重点分析了未改良和改良后的next数组在字符串匹配中的作用。通过具体实例和代码实现,帮助读者更好地理解KMP算法的核心原理。 ... [详细]
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • Søren Kierkegaard famously stated that life can only be understood in retrospect but must be lived moving forward. This perspective delves into the intricate relationship between our lived experiences and our reflections on them. ... [详细]
  • 计算机网络复习:第五章 网络层控制平面
    本文探讨了网络层的控制平面,包括转发和路由选择的基本原理。转发在数据平面上实现,通过配置路由器中的转发表完成;而路由选择则在控制平面上进行,涉及路由器中路由表的配置与更新。此外,文章还介绍了ICMP协议、两种控制平面的实现方法、路由选择算法及其分类等内容。 ... [详细]
  • 本文将介绍如何使用 Go 语言编写和运行一个简单的“Hello, World!”程序。内容涵盖开发环境配置、代码结构解析及执行步骤。 ... [详细]
  • 线性Kalman滤波器在多自由度车辆悬架主动控制中的应用研究
    本文探讨了线性Kalman滤波器(LKF)在不同自由度(2、4、7)的车辆悬架系统中进行主动控制的应用。通过详细的仿真分析,展示了LKF在提升悬架性能方面的潜力,并总结了调参过程中的关键要点。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • C++实现经典排序算法
    本文详细介绍了七种经典的排序算法及其性能分析。每种算法的平均、最坏和最好情况的时间复杂度、辅助空间需求以及稳定性都被列出,帮助读者全面了解这些排序方法的特点。 ... [详细]
  • 本文介绍如何利用动态规划算法解决经典的0-1背包问题。通过具体实例和代码实现,详细解释了在给定容量的背包中选择若干物品以最大化总价值的过程。 ... [详细]
  • 本文详细探讨了Java中的24种设计模式及其应用,并介绍了七大面向对象设计原则。通过创建型、结构型和行为型模式的分类,帮助开发者更好地理解和应用这些模式,提升代码质量和可维护性。 ... [详细]
  • 本文介绍了Java并发库中的阻塞队列(BlockingQueue)及其典型应用场景。通过具体实例,展示了如何利用LinkedBlockingQueue实现线程间高效、安全的数据传递,并结合线程池和原子类优化性能。 ... [详细]
  • 题目描述:给定n个半开区间[a, b),要求使用两个互不重叠的记录器,求最多可以记录多少个区间。解决方案采用贪心算法,通过排序和遍历实现最优解。 ... [详细]
  • 深入理解C++中的KMP算法:高效字符串匹配的利器
    本文详细介绍C++中实现KMP算法的方法,探讨其在字符串匹配问题上的优势。通过对比暴力匹配(BF)算法,展示KMP算法如何利用前缀表优化匹配过程,显著提升效率。 ... [详细]
author-avatar
黑糖老姜茶
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有