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的关系:
1 我们将证明下面事实:
- oracle 中redo包括undo;
- checkpoint 会导致脏数据写入datafile;
- buffers 会被写入当前的undo 表空间
2 操作步骤:
3 详细实现:
- 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.
- 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.
- SQL> update test_undo_tab set txt = 'teststring_committed'
- where txt = 'teststring2';
- commit;
- [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
- [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 闪回版本号查询
---------------------------------------
Oracle 中UNDO与REDO的差别具体解释的更多相关文章
- Oracle中undo表空间的切换
查看操作系统: SQL> !cat /etc/redhat-releaseRed Hat Enterprise Linux Server release 7.4 (Maipo)查看数据库版本: ...
- Oracle中NVARCHAR2与VARCHAR2的差别
NVARCHAR2在计算长度时和字符集相关的: 比如数据库是中文字符集时以长度10为例, 1.NVARCHAR2(10)是能够存进去10个汉字的.假设用来存英文也仅仅能存10个字符. 2.而VARCH ...
- Oracle性能优化之oracle中常见的执行计划及其简单解释
一.访问表执行计划 1.table access full:全表扫描.它会访问表中的每一条记录(读取高水位线以内的每一个数据块). 2.table access by user rowid:输入源ro ...
- Java中Vector与ArrayList的差别具体解释
首先看这两类都实现List接口,而List接口一共同拥有三个实现类.各自是ArrayList.Vector和LinkedList.List用于存放多个元素,可以维护元素的次序,而且同意元素的反复. 3 ...
- 【知识点整理】Oracle中NOLOGGING、APPEND、ARCHIVE和PARALLEL下,REDO、UNDO和执行速度的比较
[知识点整理]Oracle中NOLOGGING.APPEND.ARCHIVE和PARALLEL下,REDO.UNDO和执行速度的比较 1 BLOG文档结构图 2 前言部分 2.1 导读和注意事项 ...
- Oracle Undo 和 Redo
1. REDO(重做信息) Redo log file(重做日志文件),是数据库的事务日志. Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文件 ...
- 转:C#中Undo/Redo的一个简易实现
一个比较常见的改进用户体验的方案是用Redo/Undo来取代确认对话框,由于这个功能比较常用,本文简单的给了一个在C#中通过Command模式实现Redo/Undo方案的例子,以供后续查询. clas ...
- Visio中的Undo和Redo
1.Visio默认Undo和Redo操作是可用的,Appliacation中的UndoEnabled标志Undo和Redo操作是否可用. m_Visio.Window.Application.Undo ...
- 记一次ORACLE的UNDO表空间爆满分析过程
这篇文章是记录一次ORACLE数据库UNDO表空间爆满的分析过程,主要整理.梳理了同事分析的思路.具体过程如下所示: 早上收到一数据库服务器的UNDO表空间的告警邮件,最早一封是7:55发出的(监控作 ...
随机推荐
- web前端处理订单待支付倒计时计算显示问题
在商城类项目的时候,有很多待支付的订单,有时候在订单列表页面会分别显示倒计时,就是页面会有很多倒计时的订单. 处理方法: 1.调用后端接口拿到所有的订单,获取所有的倒计时订单,获取到期时间(尽量时间戳 ...
- WPF 资源管理器 WPF Explorer
最近项目中有个功能是读取外部设备的中的文件,同时由于项目样式限制,因此需要需要简单实现一个Window资源管理器功能. 由于为了接下来工作更好地完善功能,因此先一步做了一个DEMO用于参照和不断的修正 ...
- 利用Aspose.Cells导出Datatable数据
面对一些的格式各样的到处数据的要求,自学了一点 Aspose.Cells中操作Excel知识,如下代码: /// <summary> /// DataTable导出Excel /// &l ...
- 13.javaweb xml标签库详解
一.XML标签简介 1, 作用 2, 标签分类 XPath 路径标记 查找节点元素示例 2.1<x:out> 2.2<x:parse> 操作示例:导入XML文件,解析,然后 ...
- 科学存储数据格式-HDF5
HDF数据格式 Hierarchical Data Format,可以存储不同类型的图像和数码数据的文件格式,并且可以在不同类型的机器上传输,同时还有统一处理这种文件格式的函数库.大多数普通计算机都支 ...
- ZBrush关于遮罩的一些操作
本文讨论使用ZBrush®软件如何在屏幕上创建遮罩和操纵遮罩. 1. 绘制遮罩 按下Ctrl键你就能够在你的模型上绘制遮罩(笔刷的笔划的开始和结束都必须在模型上),默认情况下,遮罩区域在模型上显示为一 ...
- javaee的toString的用法
toString方法返回该对象的字符串表示,如果不用toString则返回的是地址 package Xuexi; public class Person { private String name; ...
- 路飞学城Python-Day136
列举Http请求中常见的请求方式 根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET, POST 和 HEAD方法. HTTP1.1新增了五种请求方法:O ...
- windows系统下jenkins环境搭建与基本使用
一. windows 系统下搭建jenkins环境 1.1 jenkins环境搭建和构建job流程图 1.2 安装jdk JDK下载地址: http://www.oracle.com/technet ...
- 【JavaScript框架封装】使用Prototype给Array,String,Function对象的方法扩充
/* * @Author: 我爱科技论坛* @Time: 20180705 * @Desc: 实现一个类似于JQuery功能的框架* V 1.0: 实现了基础框架.事件框架.CSS框架.属性框架.内容 ...