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 files
Protect Against    Inconsistent reads in multiuser systems    Data loss

简单看来,UNDO主要记录怎样撤销事务和保证读一致性;REDO则是负责数据库前滚(重做)。保护数据不丢失。

二 以下我们来通过实例说明undo 和 redo的关系:

1 我们将证明下面事实:

- oracle 中redo包括undo;

- checkpoint 会导致脏数据写入datafile;

- buffers 会被写入当前的undo 表空间

2 操作步骤:

- 创建1个undo表空间:undotbs2

- 创建1个表空间:test_undo

- 在表空间test_undo创建表:test_undo_tab (txt char(1000))

- 向表test_undo_tab插入2条记录txt – teststring1, teststring2。运行手工checkpoint操作

- 手工日志切换、切换undo 表空间

- 更新teststring1为teststring_uncommitted而且不提交

- 新开一个session 更新 teststring2为teststring_uncommitted而且提交

- 检查update前后的值都被记录在当前redo log中

- 检查undo 表空间不包括更新之前的值

- 进行手工checkpoint,这样undo信息将被写入磁盘

- 检查undo 表空间包括更新前的值

3 详细实现:

 - 查找当前undo表空间

SQL> show parameter undo_tablespace

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS1

- 创建Undo表空间 undotbs2:

SQL> create undo tablespace undotbs2 datafile ‘/u01/app/oracle/undotbs2.dbf‘
  2  size 100m;

Tablespace created.

- 创建表空间 test_undo

SQL> create tablespace test_undo datafile ‘/u01/app/oracle/test_undo.dbf‘
  2  size 128k;

Tablespace created.

- 创建測试表 test_undo_tab:

SQL> create table test_undo_tab(txt char(1000)) tablespace test_undo;

Table created.

SQL> insert into test_undo_tab values (‘teststring1‘);

1 row created.

SQL> insert into test_undo_tab values (‘teststring2‘);

1 row created.

SQL> commit;

- 运行手工检查点。将以上改变写入数据文件:

SQL> alter system checkpoint;

System altered.

- 设置undotbs2为当前undo表空间:

SQL> alter system set undo_tablespace=undotbs2;

System altered.

SQL> show parameter undo_tablespace;

NAME                                 TYPE        VALUE
------------------------------------ ----------- ------------------------------
undo_tablespace                      string      UNDOTBS2

- 进行日志切换使当前日志不包括字符串teststring

SQL> alter system switch logfile;

System altered.

- 查找当前日志

SQL> col member for a30
SQL> select member, l.status from v$log l, v$logfile f
  2  where l.group# = f.group#
  3  and l.status = ‘CURRENT‘;

MEMBER                         STATUS
------------------------------ ----------------
/u01/app/oracle/oradata/orcl/r CURRENT
edo02.log

- 更新測试表中一行而且不提交

SQL> update test_undo_tab set txt = ‘teststring_uncommitted‘
  2  where txt = ‘teststring1‘;

1 row updated.

- 新开一个session 更新另外一行而且提交

SQL>  update test_undo_tab set txt = ‘teststring_committed‘
      where txt = ‘teststring2‘;
      commit;

- 查看这时候的redo log应该包括redo 和 undo (提交的和未提交的数据信息)

[[email protected] ~]$  strings /u01/app/oracle/oradata/orcl/redo02.log | grep teststring
teststring_uncommitted
teststring1                                                          

teststring_committed                                                 

teststring2

- 检查当前数据文件应该是不包括更新后的数值(仅仅有更新前数据)由于还未触发检查点

[[email protected] ~]$ strings /u01/app/oracle/test_undo.dbf | grep teststring

teststring2
teststring1

- 此时触发检查点

SQL> alter system checkpoint;

- 再次检查数据文件发现数据已为最新值(提交的和未提交的值)

[[email protected] ~$ strings /u01/app/oracle/test_undo.dbf|grep teststring

teststring_committed                                                                                                               ,
teststring_uncommitted

- 最后检查Undotbs2表空间发现包括更新前的数值

[[email protected] ~]$ strings /u01/app/oracle/undotbs2.dbf | grep teststring

teststring2
teststring1

- 清理创建的对象

SQL>drop tablespace test_undo including contents and datafiles;
    alter system set undo_tablespace=undotbs1;
    drop tablespace undotbs2 including contents and datafiles;

三 进一步探讨:

Let’s see what will happen if undo is stored in redo logs only.

假设仅将undo信息存储于redo logs会怎么样?

A redo log can be reused once changes protected by it have been written to datafiles (and archivelogs if database is in archivelog mode).

It implies that if I make a change and do not commit it

- Change is written to a redo log  假设我改变的数据而没提交。此时改变将记录到redo log

- checkpoint takes place  检查点发生

- uncommitted change is written to datafile  后未提交的数据写入了数据文件

- I decide to rollback the change  这时我打算回滚

- If redo log has not been overwritten  假设redo log没被覆盖

. search entire redo log for the undo and then rollback  那么搜素整个redo log进行回滚操作

else (redo log has been overwritten)

. undo information is not available for rollback.    否则将无法回滚,undo信息已丢失!

One might argue that if somehow a redo log is not allowed to be overwritten until it contains active undo, we might be able to manage with undo stored in redo logs only. This solution is not feasible as

- size of redo logs will grow enormously large very soon as thet contain both undo and redo (a user might decide not to end a transaction for months)

- to rollback a change, enormous amount of data in redo logs (both redo and undo) will have to be searched leading to degraded performance

- there will be contention on redo logs as they are being used for both

. writing redo and undo

. reading to rollback a change

有人或许会争论:那就不同意redo log 覆盖undo 信息直到包括新的undo,这样redo log将变得异常大从而影响系统性能!

Hence, undo information has to be stored separately from redo and is used for rolling back uncommited transactions . The undo stored in undo buffers/undo tablespace is additionally used for

- read consistency   读一致性

- flashback query      闪回查询

- flashback version query   闪回版本号查询

Reference: http://oracleinaction.com/undo-and-redo-in-oracle/

http://oraclenz.wordpress.com/2008/06/22/differences-between-undo-and-redo/

---------------------------------------

Dylan    Presents.

时间: 2024-10-21 23:05:56

Oracle 中UNDO与REDO的差别具体解释的相关文章

Oracle 中UNDO与REDO的区别详解

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

Oracle中NVARCHAR2与VARCHAR2的差别

NVARCHAR2在计算长度时和字符集相关的: 比如数据库是中文字符集时以长度10为例, 1.NVARCHAR2(10)是能够存进去10个汉字的.假设用来存英文也仅仅能存10个字符. 2.而VARCHAR2(10)的话,则仅仅能存进5个汉字,英文则能够存10个. 注:二者字节上线都是4000.注意大小设置不要溢出.

Java中Vector与ArrayList的差别具体解释

首先看这两类都实现List接口,而List接口一共同拥有三个实现类.各自是ArrayList.Vector和LinkedList.List用于存放多个元素,可以维护元素的次序,而且同意元素的反复. 3个详细实现类的相关差别例如以下: 1.ArrayList是最经常使用的List实现类,内部是通过数组实现的,它同意对元素进行高速随机訪问.数组的缺点是每一个元素之间不能有间隔,当数组大小不满足时须要添加存储能力.就要讲已经有数组的数据拷贝到新的存储空间中.当从ArrayList的中间位置插入或者删除

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

[知识点整理]Oracle中NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较 1  BLOG文档结构图 2  前言部分 2.1  导读和注意事项 各位技术爱好者,看完本文后,你可以掌握如下的技能,也可以学到一些其它你所不知道的知识,~O(∩_∩)O~: ① 系统和会话级别的REDO和UNDO量的查询 ② NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较(重点)   Tips: ① 本文

Oracle中IMU技术和redo private strand技术

oracle030 oracle030 Oracle中IMU技术和redo private strand技术 3.图解Oracle IMU机制 select * from v$sysstat where name like '%IMU%'; STATISTIC#, NAME,       CLASS, VALUE, STAT_ID 312     IMU commits     128     393     1914489094 313     IMU Flushes     128    

转: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'

Visio中的Undo和Redo

1.Visio默认Undo和Redo操作是可用的,Appliacation中的UndoEnabled标志Undo和Redo操作是否可用. m_Visio.Window.Application.UndoEnabled = True 2.Visio中启动事务,结束事务 Dim vsoTextShape As Visio.Shape Dim UndoScopeID1 As Long UndoScopeID1 = m_Visio.Window.Application.BeginUndoScope("添加

oracle中delete、truncate、drop的区别

oracle中delete.truncate.drop的区别 标签: deleteoracletable存储 2012-05-23 15:12 7674人阅读 评论(0) 收藏 举报  分类: oracle(2)  版权声明:本文为博主原创文章,未经博主允许不得转载. 一.delete 1.delete是DML,执行delete操作时,每次从表中删除一行,并且同时将该行的的删除操作记录在redo和undo表空间中以便进行回滚(rollback)和重做操作,但要注意表空间要足够大,需要手动提交(c

oracle 中的临时表

临时表: 除了永久表,oracle还可以建立临时表来保存 session私有的data,这些data只存在于一个事务或者session的持续存在的期间内. CREATE GLOBAL TEMPORARY TABLE  语句建立了一个临时表,该临时表可以是事务级别,也可以是session级别. 对于事务级别的临时表,data存在于事务的持续期间.对于session级别的临时,data存在于session的持续期间.临时表中的data 对各自的session的是私有的.每个session 只能看到并