Oracle恢复内部原理:重做日志

重做日志描述了对数据块的所有变更。这一节主要描述数据库打开的时候写日志时的一些操作。

3.1  原子修改

数据库最基础的操作就是以原子的方式修改数据块。前台进程想修改一个或几个数据块时,首先得获取对数据缓冲区中包含该块的缓存的一个排它访问权限。然后构建改变向量。重做日志缓冲区中分配空间保存重做记录。重做缓冲区位于SGA中,LGWR进程定时将重做日志缓冲区中的重做记录写入到重做日志文件中以释放空间。当重做日志满了的时候,LGWR就要做日志切换。注意在重做日志缓冲区中分配空间的同时也会在重做日志文件中分配空间。重做日志缓冲区空间分配后前台进程负责构建重做记录,此后才能修改数据缓冲区中的数据块。然后当重做日志缓冲区中的重做记录写到重做文件中才算数据库变更完成。恢复保证重做日志中记录的变更都会应用到数据文件中(除非是不完全恢复)。

3.2  写日志优先

写日志优先是一个缓冲区执行协议,用来协调写脏数据到数据文件中和写重做日志记录到重做日志文件的顺序。根据写日志优先协议,在DBWR进程将脏数据写入到数据文件中之前,LGWR进程必须先将对应的重做日志记录写入到重做日志文件中。

注意,写日志优先协议跟提交时写日志协议是独立的(见3.3)。

同时注意,写日志优先协议只适用于将那些在数据缓冲区中的脏数据写入到数据文件这种情形,不适用于直接路径写(如由直接路径读导致的)。

写日志优先协议保证了数据文件中没有一种变更在重做日志文件中没有记录,不惜以失败为代价。

写日志优先协议还保证了所有数据块都在先写完重做日志并保证能够回滚的情况下才写到磁盘的,使得如果提交失败的时候可以回滚所有修改。这里的重做信息其实就是回滚段的重做信息。

写优先协议在数据库事务层保证事务的原子性起了很大作用。

3.3  事务提交

事务提交时会分配一个SCN并且建立一个包含那个SCN提交的重做日志记录。当事务所有的重做记录(包括commit对应的重做记录)都写到磁盘上的重做日志文件中时,commit过程才算结束。因此commit会强制日志刷新到磁盘上——至少截止到commit的重做记录,这就是通常说的log- force-at-commit。

恢复就是设计成这样,在事务commit的时候只需刷新重做记录到重做日志,而不用刷新该事务修改的所有脏数据,为的是在即使失败的情况下也能保证事务持久性。这就是通常说的no-datablock-force-at-commit。

3.4  线程检查点事件

线程检查点事件发生时,会将该线程的重做记录中SCN小于指定值的重做记录保护的脏数据都刷新到数据文件中。完成后,该线程在控制文件中的线程检查点结构会被更新。

线程检查点事件开始时,首先是得到一个SCN,初始化一个检查点结构。然后该实例的数据缓冲区中所有脏数据都被打上做检查点的标识。DBWR分阶段将这些标识的脏数据写入到数据文件中。当所有脏数据都写入到数据文件中时,检查点结构中的SCN被更新为前面得到的SCN,然后用该检查点更新该线程在控制文件中的检查点记录。

一个线程检查点事件可能会或者不会推进数据库检查点。当只有一个打开的线程时,新的线程检查点也同时是新的数据库检查点。如果有多个打开的线程,并且当前线程就是数据库检查点所联机程,当前线程的检查点事件会推进数据库检查点。因为新的检查点SCN是最近分配的,很有可能比其他打开状态的线程的检查点SCN要大,数据库检查点SCN将推进到新的最小的线程检查点SCN。不过如果当前线程原有检查点不是数据库检查点,那么该线程的检查点事件不会推进数据库检查点。

数据库检查点推进时,每个数据文件头部的检查点计数也会增长。并且,每个数据文件只要不是在热备份中或者没有更高的检查点SCN(如新增的数据文件或者刚恢复的数据文件),数据文件头部的检查点都会推进到跟新的数据库检查点一致,数据文件头将写入磁盘。同时,数据文件在控制文件中的记录的检查点SCN也会更新为新的数据库检查点SCN。

时间: 2024-12-03 23:13:27

Oracle恢复内部原理:重做日志的相关文章

Oracle恢复内部原理简介

Oracle 7 v7.2 恢复大纲 作者:Andrea Borr  & Bill Bridge 版本:1                May 3, 1995 本文概述了Oracle 7.2版本如何进行数据库恢复.本文读者应当熟悉Oracle 7.2的管理指南.相比于管理指南,本文目的是为了更详细描述Oracle恢复用到的算法.数据结构以及一些技术细节. 一.简介 Oracle数据库提供了下列两类失败模式下的数据库恢复: 1.  实例失败:丢失了Oracle数据缓存中的数据或者内存中的数据 2

Oracle恢复内部原理:重置日志RESETLOGS

重置日志选项用于下列情形后的第一次打开数据库的时候: 不完全恢复 基于备份控制文件的恢复 CREATE CONTROLFILE...RESETLOGS 重置日志的最主要的作用就是丢弃不完全恢复中没有使用的重做日志并保证后续的恢复不再需要.为此,重置日志选项将所有联机日志和归档日志都做废掉.副作用就是此前的所有备份对将来的恢复都没有用了. 重做日志选项还初始化了控制文件中关于联机日志和重做线程的内容,清除了当前存在的联机重做日志的内容,如果联机日志文件不存在就创建,并重置了所有线程的日志序号. 8

Oracle恢复内部原理:各式各样的恢复特性

10.1  并行恢复(v7.1) 并行恢复的目标是用计算和I/O的并行机制减少崩溃恢复.单实例恢复和介质恢复的时间.当多个磁盘上多个数据文件同时进行恢复时能有效的降低恢复时间. 10.1.1  并行恢复架构 并行恢复分区做两件事: 1. 读重做日志. 2. 应用改变向量. 步骤1不适合并行,重做日志必须按顺序读取,然后在介质恢复中合并.因此这个任务由一个进程完成:读重做日志的进程 步骤2很适合并行,因此应用改变向量的任务就委托给一组重做程序的从属进程.重做日志读取进程将改变向量发送给重做程序从属

Oracle恢复内部原理:块修复

块修复是最简单的恢复,在数据库正常操作过程中由系统自动做的,用户几乎感觉不到. 7.1  块修复初始化和操作 前台进程在修改一个缓冲区的时候调用重做程序在该缓冲区上应用改变向量时因为前台进程僵死或者触发一个错误而导致缓冲区的状态不一致,块修复就是用来修复这种缓冲区的状态.修复的过程包括:(i)从磁盘上读取该块:(ii)用当前线程的重做日志重新构建该缓冲区的一致版本:(iii)将修复的块写回磁盘.如果块修复第一次失败了,会再尝试第二次,然后将该块标识为逻辑损坏(将该块的序号置为0),然后触发一个块

Oracle恢复内部原理:实例恢复

实例恢复用于恢复崩溃失败或者并行服务器环境中的实例失败,所以实例恢复既可以指崩溃恢复也可以指并行服务器环境中的实例恢复(只要有一个存活的实例就可以恢复其他一个或多个失败的实例). 实例恢复的目标就是还原失败实例在数据缓冲区中的数据块并关闭还开着的线程.实例恢复只用联机归档日志和当前联机数据文件(不需要还原历史备份).实例恢复一次只能恢复一个线程,它从该线程最近的线程检查点开始恢复直至线程的结束. 5.1  检测是否需要实例恢复 当Oracle内核发现一个实例死掉而对应线程在控制文件中的线程打开状

Oracle恢复内部原理:恢复相关的 V$ 视图

V$视图包含了内核维护在内存中的数据结构的信息,可以通过有SYS权限的DBA帐号访问.下面是这些跟恢复相关的V$视图汇总: 9.1  V$LOG 包含了控制文件中的日志组信息: GROUP# THREAD# SEQUENCE# SIZE_IN_BYTES MEMBERS_IN_GROUP ARCHIVED_FLAG STATUS_OF_ GROUP (unused, current, active, inactive) LOW_SCN LOW_SCN_TIME 9.2  V$LOGFILE 包含

Oracle恢复内部原理:介质恢复

介质恢复用在丢失或损坏数据文件或者丢失了控制文件的情形.介质恢复将还原的数据文件恢复成当前数据文件.还能够恢复数据文件异常脱机时没有来得及做检查点操作丢失的变更.介质恢复使用归档日志和联机日志.跟实例恢复不同的是,介质恢复必须由命令显式调用. 6.1  什么时候做介质恢复 由5.3节知道,数据文件如果是还原的备份,在打开前都要进行介质恢复,即使是应用联机日志就可以恢复的.另外一种情形就是数据文件异常脱机没有做检查点操作.不做介质恢复数据库是无法打开的,需要介质恢复的数据文件也不能联机.数据库没有

Oracle恢复内部原理:热备份

热备份指在数据文件正在使用的时候对其进行复制.复制的过程中,DBWR也在进行,因此备份可能得到一些"不一致"的备份: 一些数据块可能比其他块的时间要早 一些数据块的SCN可能比数据文件头部的SCN还要早 一些块可能包含了一个重做记录的部分更新,其他的部分可能在这个数据文件上或者其他数据文件上 一些数据块可能会被损坏,因为块的头部和尾部是在不同的时间复制的. 上面的这种复制方式得到的备份集在还原后和介质恢复的时候是没有用的.介质恢复时会从数据文件上的开始热备SCN(见4.1中第二步)直至

Oracle恢复内部原理:基础数据结构

基础数据结构 2.1  控制文件 控制文件包含了数据库中所有其他文件的状态信息. 控制文件包含了如下几类数据: A.      数据库信息记录(一条) B.      数据文件记录(每个数据文件一条) C.      线程记录(每个线程一条.注:每个实例一个线程) D.      日志文件记录(每个日志文件一条) E.       文件名记录(每个数据文件或者日志文件成员一条) F.       日志历史记录(每个已经完成的日志文件一条) 控制文件的被后面文档引用到的字段如下,后面是引用该字段的