`
足至迹留
  • 浏览: 485563 次
  • 性别: Icon_minigender_1
  • 来自: OnePiece
社区版块
存档分类
最新评论

<oracle-8> redo和undo

阅读更多
本章介绍oracle数据库中最重要的两部分数据:redo与undo。Redo是oracle在线(或归档)重做日志文件中记录的信息,万一出现失败时可以利用这些数据来“重放”事务。Undo是oracle在undo段中记录的信息,用于取消或回滚事务。
Redo和undo是DBA和开发人员都关心的主题,他们是DBA和开发人员之间的桥梁。但这里主要是面向开发人员。

8.1 什么是redo
重做日志文件(redo log file)对oracle数据库来说至关重要。他们是数据库的事务日志。Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文件。这两类重做日志文件都用于恢复。

如果数据库所在主机掉电,导致实例失败,oracle会使用在线重做日志将系统恰好恢复到掉电之前的那个提交点;如果磁盘驱动器出现故障,oracle会使用归档重做日志以及在线重做日志将该驱动器上的数据备份恢复到适当的时间点。另外,如果你不小心删除了一个表,或删除了某些重要的信息,然后提交了这个操作,那么可以恢复受影响数据的一个备份,并使用在线和归档重做日志文件把它恢复到这个“意外”发生前的时间点。

补充:随着oracle 10g的到来,现在还有了一种闪回技术(flashback).利用闪回技术,可以执行闪回查询(也就是说,查询过去某个时间点的数据),取消数据库表的删除,将表置回到以前某个时间的状态等等。因此现在使用备份和归档重做日志文件来完成传统恢复的情况越来越少。不过,执行恢复是DBA最重要的任务,而且DBA在数据库恢复方面绝对不能犯错。

每个oracle数据库都至少有两个在线重做日志组,每个组中至少有一个成员(重做日志文件)。这些在线重做日志组以循环方式使用。Oracle会先写组1中的日志文件,写到最后时将切换到组2,写满后会再切到组1。就像hotspot jvm中的新生代里的from survivor和to survivor一样来回切换。
数据库之所以成为数据库,是因为他有自己独有的一些特征,重做日志或事务日志就是其中重要的特性之一。重做日志可能是数据库中最重要的恢复结构,不过如果没有其他部分(如undo段,分布式事务恢复等),单靠重做日志什么也做不了。

8.2 什么是undo
从概念上讲,undo正好与redo相对。对数据执行修改时,数据库会生成undo信息,以便回到更改前的状态。万一执行的事务失败了或使用rollback请求回滚,就可以利用这些undo信息将数据放回到修改前的样子。Redo用于在失败时重放日志(即恢复事务),undo则用于取消一条语句或一组语句的作用。与redo不同,undo在数据库内部存储在一组特殊的段中,称为undo段。
Undo不是将数据库物理地恢复到执行语句或事务之前的样子,只是逻辑地恢复到原来的样子,数据结构和数据库块本身在回滚后可能大不相同。

8.3 redo和undo如何协作
尽管undo信息存储在undo表空间或undo段中,但也会受到redo的保护。也就是说会把undo数据当成表数据或索引数据一样,对undo的修改会生成一些redo,这些redo将记入日志。
Insert into语句会生成redo和undo,undo信息足以使insert消失,redo信息足以让这个插入再次发生。
Update语句与insert大体一样,不过update生成的undo量更大;由于存在update,所以需要保存一些“前”映像。Delete与update很类似。

8.3 提交和回滚处理
我们要知道重做日志文件对开发人员有什么影响。

8.3.1 commit做什么
Commit通常是一个非常快的操作,而不论事务大小如何。你可能认为一个事务越大(他影响的数据越多),commit需要的时间就越长。不是这样的,不论事务有多大,commit的影响时间一般都很平。
许多开发人员会人为限制事务的大小,分别提交,这是一种错误的观念。每次提交必须等待redo写至磁盘,这会导致等待,这种等待称为“日志文件同步”。
Commit大致会做的工作是:
(1) 为事务生成一个SCN(System Change Number, 系统改变号,后面还会讲到,oracle用来保证事务顺序并支持失败恢复的机制),每次commit,scn会增1。
(2) LGWR将所有余下的缓存重做日志条目写至磁盘,并把scn记录到在线重做日志文件中。这一步就是真正的commit,如果出现这一步,即已经提交。事务条目会从V$TRANSACTION中“删除”。
(3) V$lock中记录着会话持有的锁都将释放,排队等待这些锁的每一个人都会被唤醒。
(4) 如果事务修改的某些块还在缓冲区缓冲中,则会以一种快速的模式访问并清理。

8.3.2 rollback做什么
把commit改为rollback可能会得到完全不同的结果。回滚事件绝对是所修改数据量的一个函数。Rollback时要做以下工作:
(1) 撤销已做的所有修改。其完成方式如下:从undo段读回数据,然后逆向执行前面所做的操作,并将undo条目标记为已用。
(2) 会话持有的锁都将释放。
Commit只是将重做日志缓存区中剩余的数据刷新输出到磁盘,与rollback相比,commit做的工作非常少。回滚操作的开销很大。

8.4 分析redo
作为开发人员,应该能够测量你的操作生成了多少redo,这很重要。生成的redo越多,操作花费的时间就越长。这不光影响你自己的会话,还会影响每一个会话,redo管理是数据库中的一个串行点任何oracle实例都只有一个LGWR,最终所有事务都会归于LGWR。

8.4.1 测量redo
要查看生成的redo量相当简单。使用sql*plus内置特性autotrace。不过autotrace只能用于简单的DML.

8.4.2 能关掉重做日志生成程序吗
答案很简单:不能。不过有些情况下执行某些操作时确实可以不生成重做日志。

1. 在sql中设置NOLOGGING
有些sql语句和操作支持使用nologging子句。这并不是说这个对象的所有操作在执行时都不生成重做日志,而是说有些特定操作生成的redo会比平常少得多。

比如在archivelog模式数据库下创建大表,比如:create table t as select * from all_objects会生成大约88.2M日志,而用nologging模式(数据库的日志模式可以设置)只会生成108KB左右日志。必须非常谨慎使用nologging模式
关于nologging操作要注意以下几点:
(1) 事实上还是会生成一定数量的redo。这些redo的作用是保护数据字典,这是不可避免的。
(2) Nologging不能避免所有后续操作生成redo。
(3) 在一个archivelog模式的数据库上执行nologging操作后,必须尽快为受影响的数据文件建立一个新的基准备份,避免由于介质失败而丢失由nologging操作创建的数据。

2. 在索引上设置nologging
使用nologging选项有两种方法。就是把nologging关键字嵌在sql命令中;另一种方法是在段上设置nologging属性,从而隐式地采用nologging模式来执行某些操作。


3. Nologging小结
可以采用nologging模式执行以下操作:
(1) 索引的创建和修改(alter)
(2) 表的批量insert。表数据不生成redo,但是所有索引修改会生成redo。
(3) Lob操作(对大对象的更新不必生成日志)。
(4) 通过create table as select 创建表。
(5) 各种alter table操作。

8.4 临时表和redo/undo
临时表不会为他们的块生成redo。因此,对临时表的操作不是可恢复的。不过,临时表确实会生成undo,而且这个undo会记入日志。因此,临时表也会生成一些redo(因为会对undo生成)。
这样似乎很不好,不过没有你想象中那么糟。在临时表上运行的sql语句主要是insert和select。幸运的是,insert只生成极少的undo,select根本不生成undo。
关于临时表上的DML活动,有以下一般结论:
(1) insert会生成很少甚至不生成undo/redo活动。
(2) delete在临时表上生成的redo与在永久表上生成的redo一样多。
(3) 临时表的update会生成永久表update一半的redo。
所以使用truncate这个DDL删除表数据比delete要快,truncate不会生成undo。

8.5 分析undo
如果存在索引,这将显著地影响生成undo的量,因为索引是一种复杂的数据结构,可能会生成相当多的undo信息。
一般来讲,insert生成的undo最少,因为oracle为此所需记录的只是要删除的一个rowid;update一般排名第二,update只需记录修改的字节;一般delete生成的undo最多。对于delete,oracle必须把整行的前映像记录到undo段中。delete生成的redo也最多。

你会发现,与加索引列的更新相比,对一个未加索引的列进行更新不仅执行的更快,生成的undo也会少很多。这也是为什么“索引”并不是加的越多越好的原因之一。
0
1
分享到:
评论

相关推荐

    NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较

    BLOG_Oracle_lhr_【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较BLOG_Oracle_lhr_【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行...

    Oracle_Undo与Redo的通俗

    Oracle_Undo与Redo的通俗

    oracle_redo_undo

    oracle_redo_undo

    oracle的undo与redo

    oracle日志,Undo日志记录某数据被修改前的值,可以用来在事务失败时进行rollback;Redo日志记录某数据块被修改后的值,可以用来恢复未写入data file的已成功事务更新的数据。

    Oracle Core - Essential Internals for DBAs and Developers.(Jonathan Lewis)

    Oracle Core: Essential ...2. Redo and Undo 3. Transactions and Consistency 4. Locks and Latches 5. Caches and Copies 6. Writing and Recovery 7. Parsing and Optimizing 8. RAC and Ruin &lt;&lt;Amazon link&gt;&gt; ...

    ORACLE redo undo.docx

    Oracle redo undo的说明解释

    Oracle中如何对超大规模数据(如超过2亿条)直接用SQL语句入库?

    在实际生产环境下,有时需将超大... from tab的Oracle SQL方式直接执行将导致redo、undo日志暴增,使数据库容易假死。针对此问题,采用文中方法可完美解决,且对系统性能几乎无影响(不管是分区表还是普通堆表均可)。

    Oracle11g Memory&Storage Overview

    本ppt较为系统的介绍了Oracle11g的内存与存储管理,主要目录如下: 1.Memory Overview:  --SGA Parameters  --Automatic Shared Memory Management  --Oracle 11g参数设置建议  --Oracle Database Memory ...

    oracle undo

    如果说Redo是用来保证在故障时事务可以被恢复,那么Undo则是用来保证事务可以被回退或者撤销。 在修改操作中,对于回退段的操作存在多处,在事务开始时,首先需要在回滚段表空间获得一个事务槽,分配空间,然后创建...

    Oracle 9i 10g编程艺术:深入数据库体系结构

    然后讨论一些重要的数据库主题,如锁定、并发控制、事务、redo和undo,还会解释为什么了解这些内容很重要。最后,我们再来分析数据库这的物理结构,如表、索引和数据类型,并介绍哪些技术能最优地使用这些物理结构。

    linux系统给oracle数据库增加新的实例.pdf

    chmod 777 createdb.sql CREATE DATABASE exchange MAXINSTANCES 8 MAXLOGHISTORY 1 MAXLOGFILES 16 MAXLOGMEMBERS 3 MAXDATAFILES 100 DATAFILE '/u01/app/oracle/oradata/exchange/system01.dbf' size 100m reuse ...

    双数据库(Oracle+MySQL)大神级系列教程分享(实战超越OCP.OCM)

    双数据库(Oracle+MySQL)大神级系列教程分享1.3-11(实战超越OCP.OCM)

    Oracle常用技术资料合集.zip

    二、《Oracle数据库SQL执行计划的取得和解析》PPT(附SQL文件) 三、Oracle 常用脚本 2pc_clean.txt ash_sql_line_id.txt ash_top_sql_event.txt ash_used awr_db_time.txt awr_event_histogram.txt awr_metric_...

    【数据库维护】-oracle远程维护程序

    通过远程连接Oracle数据库的方式实现对数据库进行管理维护 功能列表: 1) 查询优化SQL所需的表、索引的统计信息... 8) 查询REDO日志切换速度。 9) 表空间自动添加数据文件(仅支持ASM)。 10) 生成SQL语句优化建议。

    操作系统崩溃,数据库全部文件都在时,数据库恢复方法.pdf

    /oracle/oradata/STAN CONTROL01.CTL CONTROL02.CTL CONTROL03.CTL INDX11.DBF INDX12.DBF INDX13.DBF INDX14.DBF REDO01.LOG REDO02.LOG REDO03.LOG TEMP01.DBF TEMP02.DBF TOOLS01.DBF UNDO01.DBF UNDO02.DBF USER...

    深入解析OracleDBA入门进阶与诊断案例 3/4

     针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识...

    深入解析OracleDBA入门进阶与诊断案例 2/4

     针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识...

    深入解析OracleDBA入门进阶与诊断案例 4/4

     针对数据库的启动和关闭、控制文件与数据库初始化、参数及参数文件、数据字典、内存管理、Buffer Cache与Shared Pool原理、重做、回滚与撤销、等待事件、性能诊断与SQL优化等几大Oracle热点主题,本书从基础知识...

    浅谈oracle存储结构

    oracle文件学习精华课件,美创公开课内容 参数文件、控制文件、redo、undo、数据文件等等均有详细阐述。

    Expert Oracle Database Architecture 2nd 原版PDF by Kyte

    The inspiration for the material contained in this book comes from my experiences developing Oracle software, and from working with fellow Oracle developers to help them build reliable and robust ...

Global site tag (gtag.js) - Google Analytics