redo(重做信息)是Oracle在在线(或归档)重做日志文件中记录的信息,万一出现失败时可以利用这些数据来“重放”(或重做)事务。
Oracle维护着两类重做日志文件:在线(online)重做日志文件和归档(archived)重做日志文件。
数据库所在主机掉电,导致实例失败,Oracle会使用在线重做日志将系统恰好恢复到掉电之前的那个时间点。
如果磁盘驱动器出现故障(这是一个介质失败),Oracle会使用归档重做日志以及在线重做日志将该驱动器上的数据备份恢复到适当的时间点。
归档重做日志文件实际上就是已填满的“旧”在线重做日志文件的副本
undo(撤销信息)是Oracle在undo段中记录的信息,用于取消或回滚事务。
redo与undo协作:
insert,updata,delete语句都会生成redo和undo。
提交和回滚处理:
commit之前数据库已经完成的工作:
1已经在SGA中生成了undo块。
2已经在SGA中生成了已修改数据块。
3已经在SGA中生成了对于前两项的缓存redo。
4取决于前三项的大小,以及这些工作花费的时间,前面的每个数据(或某些数据)可能已经刷新输出到磁盘。
5已经得到了所需的全部锁。
commit的工作:
1为事务生成一个SCN。SCN是Oracle使用的一种简单的计时机制,用于保证事务的顺序,并支持失败恢复。SCN还用于保证数据库中的读一致性和检查点。可以把SCN看作一个钟摆,每次有人COMMIT时,SCN都会增1.
2LGWR将所有余下的缓存重做日志条目写到磁盘,并把SCN记录到在线重做日志文件中。如果出现了这一步,即已经提交。事务条目会从V$TRANSACTION中“删除”,这说明我们已经提交。
3V$LOCK中记录这我们的会话持有的锁,这些所都将被释放,而排队等待这些锁的每一个人都会被唤醒,可以继续完成他们的工作。
4如果事务修改的某些块还在缓冲区缓存中,则会以一种快速的模式访问并“清理”。
rollback的工作:
1撤销已做的所有修改。其完成方式如下:从undo段读回数据,然后实际上逆向执行前面所做的操作,并将undo条目标记为已用。如果先前插入了一行,ROLLBACK会将其删除。如果更新了一行,回滚就会取消更新。如果删除了一行,回滚将把它再次插入。
2会话持有的所有锁都将释放,如果有人在排队等待我们持有的锁,就会被唤醒。
测量redo
mystat.sql统计初始值(如redo大小)保存在一个SQL*Plus变量中:
set verify off
column value new_val V
define S="&1"
set autotrace off
select a.name, b.value
from v$statname a, v$mystat b
where a.statistic# = b.statistic#
and lower(a.name) like '%' || lower('&S')||'%'
mystat2.sql脚本只是打印出该统计的初始值和结束值之差:
set verify off
select a.name, b.value V, to_char(b.value-&V,'999,999,999,999') diff
from v$statname a, v$mystat b
where a.statistic# = b.statistic#
and lower(a.name) like '%' || lower('&S')||'%'
执行:
@mystat "redo size"
@mystat2
关闭redo不是不生成日志,而是减少生成日志。
方法有:
1把NOLOGGING关键字潜在SQL命令中
2在段(索引或表)上设置NOLOGGING属性,从而隐式地采用NOLOGGING模式来执行操作。例如,可以把一个索引或表修改为默认采用NOLOGGING模式。这说明,以后重建这个索引不会生成日志(其他索引和表本身可能还会生成redo,但是这个索引不会);
可以采用nologging模式执行的操作。
1索引的创建和ALTER(重建)。
2表的批量INSERT(通过/*+APPEND */提示使用“直接路径插入“。或采用SQL*Loader直接路径加载)。表数据不生成redo,但是所有索引修改会生成redo,但是所有索引修改会生成redo(尽管表不生成日志,但这个表上的索引却会生成redo!)。
3LOB操作(对大对象的更新不必生成日志)。
4通过CREATE TABLE AS SELECT创建表。
5通过CREATE TABLE AS SELECT创建表。
临时表和redo/undo:
修改临时表中的一个块时,不会将这个修改记录到重做日志文件中。不过,临时表确实会生成undo,而且这个undo会计入日志。因此,临时表也会生成一些redo。
在临时表上的DML操作:
1INSERT会生成很少甚至不生成undo/redo活动。
2DELETE在临时表上生成的redo与正常表上生成的redo同样多。
3临时表的UPDATE会生成正常表UPDATE一半的redo。
undo生成的大小一般来讲,
INSERT生成的undo最少,因为Oracle为此需记录的只是要“删除”的一个rowid(行ID)。
UPDATE一般排名第二(在大多数情况下)。对于UPDATE,只需记录修改的字节。你可能只更新(UPDATE)了整个数据行中很少的一部分,这种情况最常见。因此,必须在undo中记录行的一小部分。
与加索引列的更新相比,对一个未加索引的列进行更新不仅执行得更快,生成的undo也会好得多。
DELETE生成的undo最多。对于DELETE,Oracle必须把整行的前映像记录到undo段中。
分享到:
相关推荐
"redo与undo"是数据库管理中的关键概念,尤其在事务处理和数据恢复中扮演着核心角色。本文将深入探讨redo与undo机制,以及它们在数据库操作中的应用。 redo,全称重做日志(Redo Log),是数据库系统用来记录事务对...
Oracle Redo 和 Undo Mechanism Oracle 中的 redo 和 undo 机制是数据库的核心组件,它们一起协作以确保数据库的事务一致性和可靠性。在本文中,我们将深入探讨 redo 和 undo 机制的工作原理和协作机制。 Undo ...
本文将深入探讨“C# undo/redo框架”的核心概念、设计模式以及如何实现。 1. **命令模式**: 撤销/重做框架通常基于命令模式设计。命令模式是一种行为设计模式,将请求封装为一个对象,使发出请求与执行请求解耦。...
与REDO日志类似,每个RAC实例都有自己的UNDO段,可以通过`undo_tablespace`参数指定。UNDO数据存储在共享存储中,确保在一致性读取和恢复过程中,即使某个节点出现故障,其他节点仍然可以访问所需的UNDO信息。这保证...
在编程领域,撤销(Undo)和重做(Redo)功能是用户界面中常见的操作,它们允许用户取消或恢复最近的更改。在C#中,我们可以利用.NET框架提供的事件驱动和面向对象特性来实现这样的功能。这篇实验主要探讨了如何在...
- **处理撤销/重做**:当用户选择“撤销”时,从undo堆栈弹出最新的undo对象,使用该对象恢复到之前的状态,并将这个undo对象推入redo堆栈。同样,当用户选择“重做”时,从redo堆栈弹出最新状态并应用。 4. **...
本工程用vs2008打开,但需要qt库的支持,需要先安装qt-in-vs2008,才可通过编译。或者直接将里面的代码拷贝出来,然后在自己的环境中编译也行。代码中应用了QUndoCommand来实现撤销与反撤销操作。
Oracle_Undo与Redo的通俗 Oracle中的Undo和Redo是两个非常重要的概念,它们都是Oracle数据库中事务管理和恢复机制的关键组件。Undo和Redo都是为了确保数据库的一致性和可靠性。 什么是REDO? REDO记录transaction...
Oracle redo undo 机制详解 Oracle redo undo 是 Oracle 数据库中的一种机制,用于确保事务的可恢复性和撤销性。下面是对 redo undo 机制的详细解释。 redo 机制 redo 机制是 Oracle 数据库中的一种机制,用于...
在IT行业中,"Redo"和"Undo"功能是用户界面设计中的重要组成部分,尤其是在文本编辑器、图形编辑软件或任何允许用户进行可逆操作的应用程序中。它们为用户提供了一种方便的方式来撤销或恢复之前的改动,增加了用户...
GIS软件中的Undo与Redo功能是编辑操作的重要组成部分,它们允许用户撤销和恢复之前的编辑行为。本文深入分析了GIS软件中Undo与Redo操作的设计与实现,其主要内容包括Undo与Redo操作的原理、机制、流程以及实现方法。...
在IT行业中,"redo undo"框架是用于实现撤销/重做功能的核心技术,常见于各种软件和应用程序中,如文本编辑器、图像处理软件、数据库系统等。它允许用户取消最近的操作并恢复先前的状态,提供了对用户交互的强大支持...
MySQL为什么需要binlog、redo log和undo log的知识点总结 MySQL数据库管理系统需要binlog、redo log和undo log三个重要的日志系统,以确保数据的一致性和持久性。下面是对这些日志系统的详细解释: 为什么需要分层...
针对一个window窗体实现了undo/redo功能,包括textBox,checkBox, listBox, comboBox, radioButton以及按钮焦点变化的实现。可能有些小bug思路仅供参考。完整的工程文件,VS打开即可运行,欢迎评论~ 详细说明参见...
### 多步Undo/Redo实现详解 #### 一、引言 在现代软件开发中,尤其是图形编辑或文档编辑应用程序中,Undo/Redo功能是用户体验的重要组成部分。它不仅提高了用户的工作效率,还能增强软件的易用性。在本篇文章中,...
cpp文件 undo redo 原型设计 部分代码 class Command { public: virtual BOOL UnDo() = 0; virtual BOOL ReDo() = 0; };
在Element增删改处 添加 IOperationStack .DO(); 方法,即可将Element的操作过程保存到操作堆 自行对Element的变化进行记录,以便在IOperation 中Redo Undo中使用
- undo log在事务开始前生成,与redo log一起用于保护事务持久化。 - binlog在事务提交时一次性记录所有SQL。 2-4、**删除策略**: - redo log在数据持久化后可重用其空间,采用循环写入。 - undo log在事务提交后...
在软件开发中,多级撤销/重做(Multiple Level Undo/Redo)是用户体验中的一个关键特性,尤其在文本编辑器、图像处理软件或者任何允许用户进行一系列可逆操作的应用中。这一功能允许用户在执行一系列操作后,通过...