深入浅出Oracle:Redo的作用

深入浅出Oracle:Redo的作用

Oracle通过Redo来保证数据库的事务可以被重演,从而使得在故障之后,数据可以被恢复。Redo对于Oracle数据库来说至关重要。

在数据库中,Redo的功能主要通过3个组件来实现:Redo Log Buffer、LGWR后台进程和Redo Log File(在归档模式下,Redo Log File最终会写出为归档日志文件)。

在Oracle的SGA中,存在一块共享内存,称为Redo Log Buffer,如图6-1所示。

图6-1  Oracle Instance

Redo Log Buffer位于SGA之中,是一块循环使用的内存区域,其中保存数据库变更的相关信息。这些信息以重做条目(Redo Entries)形式存储(Redo Entries也经常被称为Redo Records)。Redo Entries包含重构、重做数据库变更的重要信息,这些变更包括INSERT、UPDATE、DELETE、CREATE、ALTER或者DROP等。在必要的时候Redo Entries被用于数据库恢复。

Redo Entries的内容被Oracle数据库进程从用户的内存空间复制到SGA中的Redo Log Buffer之中。Redo Entries在内存中占用连续的顺序空间,由于Redo Log Buffer是循环使用的,Oracle通过一个后台进程LGWR不断地把Redo Log Buffer的内容写出到Redo Log File中。

当用户在Buffer Cache中修改数据时,Oracle并不会立即将修改数据写出到数据文件上,因为那样做效率会很低,到目前为止,计算机系统中最繁忙的部分是磁盘的I/O操作,Oracle这样做的目的是为了减少IO的次数,当修改过的数据达到一定数量之后,可以进行高效地批量写出。

大部分传统数据库(当然包括Oracle)在处理数据修改时都遵循no-force-at-commit策略。也就是说,在提交时并不强制写。那么为了保证数据在数据库发生故障时(例如断电)可以恢复,Oracle引入了Redo机制,通过连续的、顺序的日志条目的写出将随机的、分散的数据块的写出推延。这个推延使得数据的写出可以获得批量效应的性能提升。

同Redo Log Buffer类似,Redo Log File也是循环使用的,Oracle允许使用最少两个日志组。缺省情况下,数据库创建时会建立3个日志组。

SQL> select group#,members,status from v$log;
    GROUP#    MEMBERS STATUS
    ---------- ---------- ----------------
    1          1 INACTIVE
    2          1 CURRENT
    3          1 INACTIVE

当一个日志文件写满之后,会切换到另外一个日志文件,这个切换过程称为Log Switch。Log Switch会触发一个检查点,促使DBWR进程将写满的日志文件保护的变更数据写回到数据库。在检查点完成之前,日志文件是不能够被重用的。

由于Redo机制对于数据的保护,当数据库发生故障时,Oracle就可以通过Redo重演进行数据恢复。那么一个非常重要的问题是,恢复应该从何处开始呢?

如果读取的Redo过多,那么必然导致恢复的时间过长,在生产环境中,我们必需保证恢复时间要尽量得短。Oracle通过检查点(Checkpoint)来缩减恢复时间。回顾一下第1章中所提到的内容:检查点只是一个数据库事件,它存在的根本意义在于减少恢复时间。

当检查点发生时(此时的SCN被称为Checkpoint SCN)Oracle会通知DBWR进程,把修改过的数据,也就是此Checkpoint SCN之前的脏数据(Dirty Buffer)从Buffer Cache写入磁盘,在检查点完成后CKPT进程会相应地更新控制文件和数据文件头,记录检查点信息,标识变更。

在检查点完成之后,此检查点之前修改过的数据都已经写回磁盘,重做日志文件中的相应重做记录对于崩溃/实例恢复不再有用。如果此后数据库崩溃,那么恢复只需要从最后一次完成的检查点开始恢复即可。如果数据库运行在归档模式(所有生产数据库,都建议运行在归档模式),日志文件在重用之前必须写出到归档日志文件,归档日志在介质恢复时可以用来恢复数据库故障。

时间: 2024-08-29 20:05:31

深入浅出Oracle:Redo的作用的相关文章

oracle redo undo

redo--> undo-->datafile insert一条记录时, 表跟undo的信息都会放进 redo 中, 在commit 或之前, redo 的信息会放进硬盘上. 故障时, redo 便可恢复那些已经commit 了的数据. redo解释:在Oracle数据库中,执行数据修改操作后,并不是马上写入数据文件,而是首先生成重做信息,并写入SGA中的一块叫LOG_BUFFER的固定区域,LOG_BUFFER的空间并不是无限大,事实上它非常小,一般设置在3-5MB左右.LOG_BUFFER

The number of Oracle redo threads (2) is not the same as the number of checkpoint threads (1)

单实例数据库多日志线程,搭建ogg,启动抽取进程时提示一下错误: ERROR   OGG-00446  Oracle GoldenGate Capture for Oracle, extjms.prm:  The number of Oracle redo threads (2) is not the same as the number of checkpoint threads (1). EXTRACT groups on RAC systems should be created with

Oracle redo与undo 第二弹

首先看一下undo与redo的字面意思:   undo:撤销,也就是取消之前的操作.   redo:重做,重新执行一遍之前的操作. 什么是REDO REDO记录transaction logs,分为online和archived.以恢复为目的. 比如,机器停电,那么在重起之后需要online redo logs去恢复系统到失败点. 比如,磁盘坏了,需要用archived redo logs和online redo logs去恢复数据. 比如,truncate一个表或其他的操作,想恢复到之前的状态

Oracle——redo+undo总结

<Oracle------redo> 重做日志文件(redo log file)对数据库来说至关重要,他们是数据库的事务日志: Oracle数据库维护着两类重做日志文件:在线重做日志文件(redo)和 归档重做日志文件(archive log),(归档重做日志文件实际上就是已填满的"旧"在线重做日志文件的副本) 这两类重做日志文件都是用于恢复的: ①:如果数据库所在主机掉电,导致实例失败,Oracle会使用在线重做日志将系统恢复到恰好在掉电之前的那个提交点: ②:如果磁盘驱

oracle redo log的维护

Oracle online redo log是Oracle数据库中核心文件之一.在数据库操作中,只要有任何的数据块变化,都会生成相应的redo entry.redo entry首先保存在log buffer中,最后由lgwr进程写入到Redo log里面. Online Redo Log的维护和性能是影响Oracle工作的一个重要方面.本文从日常维护角度出发,介绍几个常见的场景处理方法. 1.Redo Log Group和Redo Log Group Member Redo Log在数据库中的作

Oracle redo 复杂度--oracle核心技术读书笔记三

一. 概述 我们知道,在oracle中,每修改一条数据都会生成一条重做数据(也就是redo,里面记录了修改后的内容).目的就是为了将修改的数据备份,方便今后重做.现在有一个问题.oracle中只要修改数据,都会生成redo,这些redo会存放在一个叫做重做日志缓冲区里面.如果同时多个回话在修改数据,都要往重做日志缓冲区写入内容,就存在为同一片内存区域竞争的问题.存在竞争,就存在开销,这篇文章大概介绍一下,oracle如何尽量降低这种开销. 二.  问题概述 oracle中不断地修改数据,源源不断

oracle redo 重做日志文件

以下易容翻译自oracle dba官方文档,不足之处还望指出. 管理重做日志文件 学习目标:1.解释重做日志文件的目的2.描述重做日志文件的结构3.学会控制日志切换与检查点4.多元化管理重做日志文件5.使用OMF管理重做日志文件 1.概念介绍:重做日志文件通过记录数据的所有改变情况对系统或介质故障提供恢复机制.1)重做日志文件以组的形式存在2)一个oracle数据库至少需要两组,每组至少有一文件3)在一组里的每一重做日志文件叫做成员The redo log files are used only

oracle redo日志维护

环境 OS:Red Hat Linux As 5 DB:10.2.0.1 1.添加日志组 alter database add logfile group 4 ('/u01/app/oracle/oradata/oracl/redo04.log') size 50m; 2.添加日志组(指定日志已经存在) alter database add logfile group 4 ('/u01/app/oracle/oradata/oracl/redo04.log') size 50m reuse; 3

oracle - redo 损坏或删除处理方法

OS: Oracle Linux Server release 5.7 DB: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production 数据库打开模式,非归档模式,非当前日志损坏 SQL> archive log list;Database log mode No Archive ModeAutomatic archival DisabledArchive destination USE_DB_RE