Oracle——redo+undo总结

《Oracle------redo》

重做日志文件(redo log file)对数据库来说至关重要,他们是数据库的事务日志;

Oracle数据库维护着两类重做日志文件:在线重做日志文件(redo)和 归档重做日志文件(archive log),(归档重做日志文件实际上就是已填满的“旧”在线重做日志文件的副本)

这两类重做日志文件都是用于恢复的:

①:如果数据库所在主机掉电,导致实例失败,Oracle会使用在线重做日志将系统恢复到恰好在掉电之前的那个提交点;

②:如果磁盘驱动器出现故障(这是介质失败),Oracle会使用归档重做日志以及在线重做日志,以及之前的一个备份,将原在此驱动器上的数据恢复到某个时间点;

每个Oracle数据库都至少有两个在线重做日志,每个组中至少有一个成员(重做日志文件),在线重做日志组会以循环的方式使用;

Redo log的日志状态分为4种:

current:指的是当前日志文件,该日志文件是活动的,当前正在被使用的,进行崩溃恢复时,Current日志文件是必须的;

ACTIVE:是活动的非当前日志,可以已经完成归档也可能没有归档,在Crash恢复时会被用到;

inactive:非活动日志,在实例恢复时不再需要,但是在介质恢复时可能会用到,此状态的日志也可能没有被归档。

unused:该日志从未被写入,这类日志可能是刚被添加到数据库或者在resetlogs之后被重置。

《Oracle----undo》

REDO是为了重新实现你的操作,而UNDO相反,是为了撤销你做的操作,比如你得一个TRANSACTION执行失败了或你自己后悔了,则需要用ROLLBACK命令回退到操作之前。回滚是在逻辑层面实现而不是物理层面,因为在一个多用户系统中,数据结构,blocks等都在时时变化,比如我们INSERT一个数据,表的空间不够,扩展了一个新的EXTENT,我们的数据保存在这新的EXTENT里,其它用户随后也在这EXTENT里插入了数据,而此时我想ROLLBACK,那么显然物理上讲这EXTENT撤销是不可能的,因为这么做会影响其他用户的操作。所以,ROLLBACK是逻辑上回滚,比如对INSERT来说,那么ROLLBACK就是DELETE了。

注意:redo是用于在失败时恢复事务,undo则用来取消一条语句或一组语句的作用。与redo不同,undo是存储在数据库内部一组特殊的段中,称为undo段

1、insert:

第一条insert into t 语句会同时生成redo和undo,它锁生成的undo信息足以使insert小时,而redo信息则足以让这个insert再次发生;我们可以看到,块缓冲区里面存放着修改完的undo块、索引块、和表数据块,所有的这些块都被重做日志缓冲区中相应条目所保护;

2、update

update 生成的undo量更大,比insert要大,这是因为由于update需要保存数据修改前的映像;update语句还放在重做日志缓冲区中;

3、delete:

delete会生成undo,块被修改,并把redo发送到重做日志缓冲区;

4、commit

当事务提交时,Oracle会把重做日志缓冲区刷新输出到磁盘;

注意:

insert生成的undo最少;(因为Oracle只是记录了一个rowid)

delete生成的undo最多;(因为Oracle必须把整行的删除前映像记录到undo段中)

(索引的维护也是很高的,比如要更新有索引的列 那么会生成好几倍的undo)

commit的开销主要来自两方面:

第一:客户端与数据库直接往返通信量将会显著增大

第二:每次提交,都必须等待redo写至磁盘(在这种情况下,就会出现log file sync的等待事件)

执行commit时,剩下的工作:

1、为事务生成一个SCN号

2、LGWR将所有未写入磁盘的重做日志条目写至磁盘,并把SCN记录到在线重做日志文件中;

3、v$lock中会记录着我们的回话锁,这些锁都将被释放,而排队等待这些锁的会话都会被唤醒,从而可以继续完成他们的工作;

4、如果事务修改的某些块还在缓冲区缓存中,Oracle就会以一种快速的模式访问并清理;

redo  与 undo 日志的主要区别:

1、undo日志:在恢复时取消未完成事务的影响,忽略已经提交的事务

2、redo日志:忽略未完成的事务,重做已经提交事务的改变。

3、undo日志:先将修改后的数据写到磁盘——写commit到磁盘

4、redo日志:先写commit到磁盘——将修改后的数据写到磁盘

5、undo日志:要求数据在事务结束后立即写到磁盘,可能增加磁盘IO数

6、redo日志:要求我们在事务提交和日志记录刷新以前将所有修改过的块保留在缓冲区,可能增加事务需要的平均缓冲区数

《临时表和redo、undo》

在12C之前:

临时表的数据块不会生成redo,因此,临时表的操作不是可恢复的。不过临时表会生成undo,而且这个undo会计入日志,因此,临时表也会生成一些redo;临时表可以有约束,也可以这么说:正常表有的一切临时表都可以有;

临时表的DML操作,有如下特点:

1、insert会生成很少甚至不生成undo  redo

2、临时表的update会生成永久表update大约一半的redo

3、delete在临时表上生成的redo与永久表上生成的redo同样多;

(临时表delete会生成很多redo,所以要避免进行delete操作,可以truncate;可以使用临时表进行insert和select操作)

在12C之后:

从Oracle12C起,我们可以通过设置temp_undo_enabled来将临时表的undo放在临时表空间中,由于临时表空间的任何数据变更都不会生成redo,所以当这个参数设置为TRUE时,任何临时表上的DML都会生产很少甚至不会产生redo;

(temp_undo_enabled的默认值是FALSE,如果将其改为TRUE的话,那临时表生成的redo量与12C版本之前是一样的)

ORA-01555: snapshot too old: -----这个错误是非常典型的错误:(它算的上是一个安全的错误,唯一的影响就是收到这个错误的查询无法继续处理)

产生这个错误的原因:

1、undo段太小,不足以支撑系统上执行的工作

2、程序夸commit获取数据

3、块清除

4、commit提交太频繁

解决的方法参考:

1、适当的设置参数undo_retention(要大于运行时间最长的事务所需的时间),我们可以通过v$undostat 来确定长时查询的持续时间,另外,请在磁盘上预留足够的空间,因为为了确保undo_retention,undo段可能也会有所增长;

2、使用手动undo管理时加大或增加更多的undo段,(不建议采用这种方法,强烈建议采用自动undo管理方式)

3、减少查询的运行时间(调优)。调优sql语句、

4、收集相关对象的统计信息。

时间: 2024-10-13 16:02:34

Oracle——redo+undo总结的相关文章

oracle redo undo

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

Oracle 中UNDO与REDO的区别详解

    学习设计模式已经有段时间了,初接触设计模式,尽管例子简单.生动,但还是感觉很是抽象.今天又学习了设计模式中的装饰模式,也就是装饰模式让自己对模式略有所懂,装饰模式最大的特点就是把所有需要的功能都按正确的顺序串联起来进行控制.这里需要强调的是"顺序",也就是说这种装饰是建立在一定的顺序之上的,而且这种顺序是由人为控制的:不同于建造者模式,它的顺序是固定不变的. **概念     动态地给一个对象添加一些额外的职责,就增加的功能来说,装饰模式比生成子类更为灵活. **结构图    

记一次ORACLE的UNDO表空间爆满分析过程

这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作业是15分钟一次),从告警邮件分析,好像是UNDO表空间突然一下子被耗尽了. DB Tablespace Allocated Free Used % Free % Used 192.168.xxx.xxx:1521 UNDOTBS1 16384 190.25 16193.75 1.16 99 使用一

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 中UNDO与REDO的差别具体解释

一 为了更清楚的看出2者差别,请看下表: UNDO                                                                   REDO Record of How to undo a change How to reproduce a change Used for Rollback, Read-Consistency Rolling forward DB Changes Stored in Undo segments Redo log

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

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

【Oracle】undo损坏,无备份非常规恢复

客户的一个测试环境,主机异常断电,启动后发现undo文件损坏,无法启动,在open阶段报错如下: Errors in file /u01/app/oracle/diag/rdbms/cdrdb/CDRDB/trace/CDRDB_ora_4109.trc: ORA-01122: database file 3 failed verification check ORA-01110: data file 3: '/u01/app/oracle/oradata/CDRDB/undotbs01.dbf

oracle redo 重做日志文件

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