Oracle 重做(Redo)日志介绍

2024-02-14 16:08
文章标签 oracle 日志 介绍 重做 redo

本文主要是介绍Oracle 重做(Redo)日志介绍,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. Redo的作用

Oracle通过 Redo 来保证数据库的事务可以被重演,从而使得在故障之后,数据可以被 恢复。Redo对于Oracle 数据库来说至关重要。本文地址:http://blog.csdn.net/sunansheng/article/details/51918724

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

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 INACTIVE2          1 INACTIVE3          1 CURRENT4          1 INACTIVE


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

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

如果读取的Redo 过多,那么必然导致恢复的时间过长,在生产环境中,我们必需保证恢 复时间要尽量得短。Oracle 通过检查点(Checkpoint )来缩减恢复时间。检查点只是一个数据库事件,它存在的根本意义在于减少恢复时间。 当检查点发生时(此时的 SCN 被称为Checkpoint SCN )Oracle会通知 DBWR进程,把修 改过的数据,也就是此 Checkpoint SCN 之前的脏数据(Dirty Buffer )从 Buffer Cache 写 入磁盘,在检查点完成后 CKPT进程会相应地更新控制文件和数据文件头,记录检查点信息, 标识变更。

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

这篇关于Oracle 重做(Redo)日志介绍的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/708971

相关文章

C#使用StackExchange.Redis实现分布式锁的两种方式介绍

《C#使用StackExchange.Redis实现分布式锁的两种方式介绍》分布式锁在集群的架构中发挥着重要的作用,:本文主要介绍C#使用StackExchange.Redis实现分布式锁的... 目录自定义分布式锁获取锁释放锁自动续期StackExchange.Redis分布式锁获取锁释放锁自动续期分布式

SQL中redo log 刷⼊磁盘的常见方法

《SQL中redolog刷⼊磁盘的常见方法》本文主要介绍了SQL中redolog刷⼊磁盘的常见方法,将redolog刷入磁盘的方法确保了数据的持久性和一致性,下面就来具体介绍一下,感兴趣的可以了解... 目录Redo Log 刷入磁盘的方法Redo Log 刷入磁盘的过程代码示例(伪代码)在数据库系统中,r

redis过期key的删除策略介绍

《redis过期key的删除策略介绍》:本文主要介绍redis过期key的删除策略,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录第一种策略:被动删除第二种策略:定期删除第三种策略:强制删除关于big key的清理UNLINK命令FLUSHALL/FLUSHDB命

Java程序进程起来了但是不打印日志的原因分析

《Java程序进程起来了但是不打印日志的原因分析》:本文主要介绍Java程序进程起来了但是不打印日志的原因分析,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Java程序进程起来了但是不打印日志的原因1、日志配置问题2、日志文件权限问题3、日志文件路径问题4、程序

Java使用SLF4J记录不同级别日志的示例详解

《Java使用SLF4J记录不同级别日志的示例详解》SLF4J是一个简单的日志门面,它允许在运行时选择不同的日志实现,这篇文章主要为大家详细介绍了如何使用SLF4J记录不同级别日志,感兴趣的可以了解下... 目录一、SLF4J简介二、添加依赖三、配置Logback四、记录不同级别的日志五、总结一、SLF4J

python logging模块详解及其日志定时清理方式

《pythonlogging模块详解及其日志定时清理方式》:本文主要介绍pythonlogging模块详解及其日志定时清理方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地... 目录python logging模块及日志定时清理1.创建logger对象2.logging.basicCo

Qt spdlog日志模块的使用详解

《Qtspdlog日志模块的使用详解》在Qt应用程序开发中,良好的日志系统至关重要,本文将介绍如何使用spdlog1.5.0创建满足以下要求的日志系统,感兴趣的朋友一起看看吧... 目录版本摘要例子logmanager.cpp文件main.cpp文件版本spdlog版本:1.5.0采用1.5.0版本主要

Pytest多环境切换的常见方法介绍

《Pytest多环境切换的常见方法介绍》Pytest作为自动化测试的主力框架,如何实现本地、测试、预发、生产环境的灵活切换,本文总结了通过pytest框架实现自由环境切换的几种方法,大家可以根据需要进... 目录1.pytest-base-url2.hooks函数3.yml和fixture结论你是否也遇到过

Oracle数据库常见字段类型大全以及超详细解析

《Oracle数据库常见字段类型大全以及超详细解析》在Oracle数据库中查询特定表的字段个数通常需要使用SQL语句来完成,:本文主要介绍Oracle数据库常见字段类型大全以及超详细解析,文中通过... 目录前言一、字符类型(Character)1、CHAR:定长字符数据类型2、VARCHAR2:变长字符数

SpringBoot日志配置SLF4J和Logback的方法实现

《SpringBoot日志配置SLF4J和Logback的方法实现》日志记录是不可或缺的一部分,本文主要介绍了SpringBoot日志配置SLF4J和Logback的方法实现,文中通过示例代码介绍的非... 目录一、前言二、案例一:初识日志三、案例二:使用Lombok输出日志四、案例三:配置Logback一