Oracle Undo Redo(转)

转贴:

http://www.cuug.com/xueyuanzhuanqu/jishuwenzhang/201108/jishuwenzhang-245.html

http://paul0407.blogspot.tw/2008/01/oracle-redoundorollback-segment.html

http://blog.csdn.net/robinson_0612/article/details/5731158

Oracle Undo Redo

Redo

redo 记录 transaction logs,分为 online 和 archived。以恢复为目的。
比如,机器停电,那么在重起之后需要 online redo logs 去恢复系统到失败点。
比如,磁盘坏了,需要用 archived redo logs 和 online redo logs 区恢复数据。
比如,truncate 一个表或其他的操作,想恢复到之前的状态,同样也需要。

Redo就是重作,当我们使用DML命令(Update、Delete、Insert)对数据进行修改后,Oracle会将我们对数据修改的操作及数据本身写入Redo Log Buffer,Oracle会找适当的时机(*注1)将Redo Log Buffer内的东西写入Redo Log Files,由于Redo Log Files是循环写入的,所以在异动频繁的状态下会很快被盖掉,如果想要将这些异动的记录保留下来,就请开启Oracle Archiving Mode,这样Oracle作Log Switch时,就会将Redo Log Files内容另存一份成为Archive Log Files

Undo
redo 是为了重新实现你的操作,而 undo 相反,是为了撤销你做的操作,比如一个 transaction 执行失败了或你自己后悔了,则需要用 rollback 命令回退到操作之前。rollback 是在逻辑层面实现而不是物理层面,因为在一个多用户系统中,数据结构、blocks 等都在时时变化,比如我们 insert 一个数据,表的空间不够,扩展了一个新的 extent,我们的数据保存在这新的 extent里,其它用户随后也在这 extent 里插入了数据,而此时我想 rollback,那么显然物理上讲这 extent 撤销是不可能的,因为这么做会影响其他用户的操作。所以,rollback 是逻辑上回滚,比如对? insert 来说,那么 rollback 就是 delete 了。
commit 以前,常想当然地认为,一个大的 transaction(比如大批量地 insert 数据)的 commit 会花费时间比短的 transaction 长。而事实上是没有什么区别的,因为 oracle 在 commit 之前已经把该写的东西写到 disk 中了,我们 commit 只是

  1. 产生一个 SCN 给我们 transaction,SCN 简单理解就是给 transaction 排队,以便恢复和保持一致性。
  2. redo 写 redo 到 disk 中(LGWR,这就是log file sync),记录 SCN 在 online redo log,当这一步发生时,我们可以说事实上已 经提交了,这个 transaction 已经结束(在v$transaction里消失了)
  3. session 所拥有的 lock(v$lock)被释放。
  4. Block Cleanout(这个问题是产生ORA-01555: snapshot too old的根本原因) rollback 和 commit 正好相反,rollback 的时间和 transaction 的大小有直接关系。因为 rollback 必须物理上恢复数据。commit 之所以快,是因为 oracle 在 commit 之前已经作了很多工作(产生 undo,修改 block,redo,latch 分配),rollback 慢也是基于相同的原因。
  • ?undo 表空间 用于存放 undo 数据。当执行DML操作时,Oracle 会将这些操作的旧数据写入 undo 段。管理 undo 数据不仅可以使用回滚段,还可以使用 undo 表空间。
  • undo 数据的作用:当用户执行 DML 操作修改数据时,undo 数据被存放在 undo 段,而新数据则被存放到数据段中,如果事务操作存在问题,就需要回退事务,以取消事物变化。
    例如:执行完 “UPDATE emp SET sal=1000 WHERE empno=7788” 后,发现应该修改雇员7963的工资,而不是7788.此时应该执行 rollback 语句。
  • 读一致性
    用户检索数据时,oracle 总是使用户只能看到被提交过的数据,这是由 Oracle 自动提供的。当用户修改数据,但是没有提交时,另外一个用户使用 select 语句查找该值时,该值就是从 undo 表空间中取得的。
  • 事务恢复
    事务恢复是例程恢复的一部分,它是由 Oracle Server 自动完成的。如果在数据库运行过程中出线历程失败,那么当启动OracleServer时,后台进程 SMON 会自动执行例程恢复。执行例程恢复时,Oracle会重做所有未应用的记录。然后打开数据库,回退未提交事务。
  • 倒叙查询
    倒叙查询用于取得某一特定时间点的数据库数据。
  • undo_management
    使用初始化参数用于指定 undo 数据的管理方式。如果使用自动管理模式,必须设置该参数为 auto,此时采用 undo 表空间管理 undo数据;如果使用手工管理模式,必须设置该值为 manual,此时采用回滚段管理 undo 数据。
  • undo tablespace
    用于指定例程所要使用的 undo 表空间。使用自动 undo 管理模式时,通过配置该参数可以指定例程所要使用的 undo 表空间。
    使用 RAC 结构时,必须为每个例程配置一个独立的 undo 表空间。
  • undo_retention
    该参数用于控制 undo 数据的最大保留时间,其默认值为900秒,该值时倒叙查询可以查看到的最早时间点。
  • undo 表空间上不能建立任何数据对象。

Undo就是取消之前作的,8i以前(含8i)的Rollback Segment,在9i改叫Undo Segment;当我们进行事务时,Oracle会利用Undo Segment来存放异动前后的数据,在事务未Commit前,其他使用者可以在这里查询旧数据,如果事务失败或取消,Oracle就可以很快的将由回复原先的数据,在9i提供了Flashback Query可以让我们查询事务Commit以前的数据(能查多久以前的数据?看Undo Tablespace有多大、UNDO_RETENTION设多少),到了10g,我们甚至可以回复已经Commit的事务(利用Flashback Query中的Undo SQL命令)。

Undo(9i之后称) = rollback(9i之前称)
差异差在 9i 之后的 Undo 有 ASM (系统自动管理UNDO)
早期的 rollback 空间是要自已设定,不足时就会完蛋,
后期交由Oracle管理。
之所以他要你保留是因为在早期,有很多人的Code会操作
指定rollback之后下SQL,当有比较大的SQL时就用比较大的
rollback空间,如果你不延用,程序很有可能需要大改,
如果你的SQL并未指定rollback,这就没差了。

原文:大专栏  Oracle Undo Redo(转)

原文地址:https://www.cnblogs.com/chinatrump/p/11490935.html

时间: 2024-10-10 10:11:15

Oracle Undo Redo(转)的相关文章

Oracle Undo tablespace恢复(无备份)

Oracle Undo tablespace恢复 系统环境:   操作系统:RedHat EL55   Oracle:  Oracle 11gR2   Oracle 9i后,采用了undo tablespace管理undo数据,实现undo的自动管理,本案例演示了undo表空间被破坏后如何恢复:如果有备份,通过备份恢复非常容易,但在没有备份的情况下,就需要采用非常规手段来恢复了,呵呵. 1.案例应用环境 undo表空间undo segments: 14:34:44 [email protecte

undo/redo功能的原理和思路

一些具有操作记录的系统,如店铺装修.富文本编辑等,都具有undo/redo功能,可实现界面操作过程的撤销和恢复,简述开发undo/redo功能的原理和思路. undo是将用户上一步做的操作对程序造成的改动恢复到改动之前,而redo操作是指重新实现这种改动. undo/redo操作的实现方式分为两类:记录数据和记录操作. 记录数据是指将信息编辑窗口打开时,保存原始数据,然后记录用户每次操作后的结果数据,这里的数据是指信息编辑窗口中所有可能发生变动的数据.做undo操作时程序将用户上一步操作前的数据

【转载】MySQL 日志 undo | redo

本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atomicity)  事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作.如果在执行的过程中发生  了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过. - 原理  Undo Log的原理很简单,为了满

InnoDB undo, redo,binlog,data什么时候写?

undo:相当于数据修改前的备份 redo: 相当于数据修改后的备份,为了保证事务的持久化,redo会一直写 Undo + Redo事务的简化过程  假设有A.B两个数据,值分别为1,2.  A.事务开始.  B.记录A=1到undo log.  C.修改A=3.  D.记录A=3到redo log.  E.记录B=2到undo log.  F.修改B=4.  G.记录B=4到redo log.  H.将redo log写入磁盘.  I.事务提交 - Undo + Redo事务的特点  A. 为

第15章 oracle undo表空间管理

2015-10-23 目录 参考资料 [1] 林树泽.Oracle 11g R2 DBA操作指南[M].北京:清华大学出版社,2013 [2] Oracle undo 表空间管理 [3] undo表空间概述 [4] Oracle UNDO表空间的管理 [5] Oracle的UNDO表空间管理总结 [6] UNDO表空间的管理 [7] UNDO表空间的管理 [8] 监控和管理Oracle UNDO表空间的使用 [9] 谈谈undo表空间

iOS: 为画板App增加 Undo/Redo(撤销/重做)操作

这个随笔的内容以上一个随笔为基础,(在iOS中实现一个简单的画板),上一个随笔实现了一个简单的画板: 今天我们要为这个画板增加Undo/Redo操作,当画错了一笔,可以撤销它,或者撤销之后后悔了,还可以还原.而且我们要通过晃动手机来触发Undo/Redo的选择. 这个demo使用NSUndoManager实现Undo/Redo操作,NSUndoManager 的实现原理是它作为一个记录器,每次数据变化,我们要用这个记录器记录一个相反的操作,当需要undo的时候,它通过执行这个相反的操作就可以实现

转:C#中Undo/Redo的一个简易实现

一个比较常见的改进用户体验的方案是用Redo/Undo来取代确认对话框,由于这个功能比较常用,本文简单的给了一个在C#中通过Command模式实现Redo/Undo方案的例子,以供后续查询. class Program { static void Main(string[] args) { var cmds = new CommandManager(); while (true) { var key = Console.ReadKey(true); if (key.KeyChar >= '0'

[转]MySQL日志——Undo | Redo

本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atomicity)  事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作.如果在执行的过程中发生  了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过. - 原理  Undo Log的原理很简单,为了满

MySQL undo redo

本文是介绍MySQL数据库InnoDB存储引擎重做日志漫游 00 – Undo LogUndo Log 是为了实现事务的原子性,在MySQL数据库InnoDB存储引擎中,还用Undo Log来实现多版本并发控制(简称:MVCC). - 事务的原子性(Atomicity)  事务中的所有操作,要么全部完成,要么不做任何操作,不能只做部分操作.如果在执行的过程中发生  了错误,要回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过. - 原理  Undo Log的原理很简单,为了满