一 为了更清楚的看出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 (提交的和未提交的数据信息)

[oracle@dylan ~]$  strings /u01/app/oracle/oradata/orcl/redo02.log | grep teststring
teststring_uncommitted
teststring1 teststring_committed teststring2

- 检查当前数据文件应该是不包含更新后的数值(只有更新前数据)因为还未触发检查点

[oracle@dylan ~]$ strings /u01/app/oracle/test_undo.dbf | grep teststring

teststring2
teststring1


- 此时触发检查点

SQL> alter system checkpoint;

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

[oracle@dylan ~$ strings /u01/app/oracle/test_undo.dbf|grep teststring

teststring_committed                                                                                                               ,
teststring_uncommitted



- 最后检查Undotbs2表空间发现包含更新前的数值
[oracle@dylan ~]$ 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   闪回版本查询






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













---------------------------------------
Dylan    Presents.



Oracle 中UNDO与REDO的区别详解的更多相关文章

  1. 基于python中staticmethod和classmethod的区别(详解)

    例子 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 class A(object):   def foo(self,x):     print "executing foo ...

  2. DOS批处理中%cd%与%~dp0的区别详解

    转载:https://www.jb51.net/article/105325.htm DOS批处理中%cd%与%~dp0的区别详解     Windows下批处理中%cd%和%~dp0都能用来表示当前 ...

  3. Oracle 中UNDO与REDO的差别具体解释

    一 为了更清楚的看出2者差别,请看下表:                                               UNDO                             ...

  4. oracle中的exists 和 in 用法详解

    以前一直不知道exists和in的用法与效率,这次的项目中需要用到,所以自己研究了一下.下面是我举两个例子说明两者之间的效率问题. 前言概述: “exists”和“in”的效率问题,涉及到效率问题也就 ...

  5. C#中struct和class的区别详解

    本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...

  6. Java中的==和equals的区别详解

    1.基础知识 (1)String x = "hello"; (2)String x = new String ("hello"); 第1种方式的工作机制是,首先 ...

  7. C#中struct和class的区别详解 (转载)

    本文详细分析了C#中struct和class的区别,对于C#初学者来说是有必要加以了解并掌握的. 简单来说,struct是值类型,创建一个struct类型的实例被分配在栈上.class是引用类型,创建 ...

  8. 深入Oracle的left join中on和where的区别详解

    -- from http://blog.itpub.net/30175262/viewspace-1472060/ 今天遇到一个求某月所有天数的统计结果,如果某日的结果是0也需要显示出来,即: 日期 ...

  9. C#中struct与class的区别详解

    转自:http://blog.csdn.net/justlovepro/archive/2007/11/02/1863734.aspx 有这么几点不同: 1.struct 是值类型,class是对象类 ...

  10. Lua中ipairs和pairs的区别详解

    迭代器for遍历table时,ipairs和pairs的区别: 区别一:ipairs遇到nil会停止,pairs会输出nil值然后继续下去 区别二: , b = , x = , y = , " ...

随机推荐

  1. Shell-获取终端输入-read

  2. [转帖]5. Tikv安装部署

    5. Tikv安装部署 5.1. 概述 TiDB 是 PingCAP 公司自主设计.研发的开源分布式关系型数据库,是一款同时支持在线事务处理与在线分析处理 (Hybrid Transactiona ...

  3. [转帖]《Linux性能优化实战》笔记(十五)—— 磁盘IO的工作原理

    前一篇介绍了文件系统的工作原理,这一篇来看看磁盘IO的工作原理 一. 磁盘 1. 按存储介质分类 磁盘是可以持久化存储的设备,根据存储介质的不同,常见磁盘可以分为两类:机械磁盘和固态磁盘. 机械磁盘, ...

  4. [转帖]Jmeter性能测试:高并发分布式性能测试

    一.为什么要进行分布式性能测试 当进行高并发性能测试的时候,受限于Jmeter工具本身和电脑硬件的原因,无法满足我们对大并发性能测试的要求.基于这种场景下,我们就需要采用分布式的方式来实现我们高并发的 ...

  5. [转帖]金仓数据库KingbaseES误删除系统超级用户(superuser)权限的恢复方式

    https://blog.csdn.net/arthemis_14/article/details/129879269 在使用KingbaseES数据库的时候,系统默认存在一个跟系统初始化用户同名的S ...

  6. 时间片 线程切换 指令周期 流水线 TPS的初步了解

    时间片 线程切换 指令周期 流水线 TPS的初步了解 情况说明 Redis 单线程提供服务, 可以支撑十万级别的TPS 通过以个非常简单的测试 redis-benchmark -c 50 -n 500 ...

  7. 混沌测试平台 Chaos Mesh

    混沌测试平台 Chaos Mesh Chaos Mesh 是PingCap团队研发的一款用于测试kubernetes环境的工具.通过人为地在集群中注入故障来检测集群对故障的处理以及恢复能力.更详细信息 ...

  8. 【小测试】rust中的数组越界——好吧,这下证明rust不是零成本抽象了吧

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 1.编译期发现的数组越界 在数组下标是常量的情况下,编译期 ...

  9. 【一文搞定】Linux、Mac、Windows安装Docker与配置教程!

    目录 一.Windows 安装 1.1 安装与启用 Hyper-V 1.2 安装 WSL 1.3 Docker Desktop 官方下载 1.4 安装Docker Desktop 二.MacOS 安装 ...

  10. vim 从嫌弃到依赖(16)——宏

    终于到了我第二喜欢的vim功能了(当然了,最喜欢的是.命令).我原本计划在介绍完.命令之后介绍宏,以便让各位小伙伴们能了解到vim对于重复操作进行的强大的优化.但是由于宏本身跟寄存器息息相关,所以还是 ...