首页 > 数据库技术 > 详细

Oracle Undo Redo(转)

时间:2019-09-09 13:10:33      阅读:546      评论:0      收藏:0      [点我收藏+]

标签:rollback   可能   blog   通过   个数   所有   

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(转)


Oracle Undo Redo(转)

标签:rollback   可能   blog   通过   个数   所有   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 bubuko.com 版权所有 鲁ICP备09046678号-4
打开技术之扣,分享程序人生!
             

鲁公网安备 37021202000002号