redo--> undo-->datafile
insert一条记录时,表跟undo的信息都会放进 redo 中,在commit 或之前, redo 的信息会放进硬盘上。 故障时, redo 便可恢复那些已经commit 了的数据。
redo->
每次操作都先记录到redo日志中,当出现实例故障(像断电),导致数据未能更新到数据文件,则数据库重启时须redo,重新把数据更新到数据文件。
undo->
记录更改前的一份copy,但你系统rollback时,把这份copy重新覆盖到原来的数据
redo->记录所有操作,用于恢复(redo records all the database transaction used for recovery)
undo->记录所有的前印象,用于回滚(undo is used to store uncommited data infor used for rollback)
redo->已递交的事务,实例恢复时要写到数据文件去的
undo->未递交的事务.
redo的原因是:每次commit时,将数据的修改立即写到online redo中,但是并不一定同时将该数据的修改写到数据文件中。因为该数据已经提交,但是只存在联机日志文件中,所以在恢复时需要将数据从联机日志文件中找出来,重新应用一下,使已经更改数据在数据文件中也改过来!
undo的原因是:在oracle正常运行时,为了提高效率,加入用户还没有commit,但是空闲内存不多时,会由DBWR进程将脏块写入到数据文件中,以便腾出宝贵的内存供其它进程使用。这就是需要UNDO的原因。因为还没有发出commit语句,但是oracle的dbwr进程已经将没有提交的数据写到数据文件中去了。
undo 也是datafile,可能dirty buffer 没有写回到磁盘里面去。
只有先redo apply 成功了,才能保证undo datafile 里面的东西都是正确的,然后才能rollback 。
做redo的目的是使系统恢复到系统崩溃前(关机前)的状态,再进行undo是保证系统的一致性。
不做redo,系统就不会知道之前的状态,undo就无从谈起 。
所以instance crash recovery 的时候总是先rollforward,再rollback
undo
回退段中的数据是以“回退条目”方式存储。
回退条目=块信息(在事务中发生改动的块的编号)+在事务提交前存储在块中的数据
在每一个回退段中oracle都为其维护一张“事务表”
在事务表中记录着与该回退段中所有回退条目相关的事务编号(事务SCN&回退条目)
redo
重做记录由一组“变更向量”组成。
每个变更变量中记录了事务对数据库中某个块所做的修改。
当用户提交一条commit语句时,LGWR进程会立刻将一条提交记录写入到重做日志文件中,然后再开始写入与该事务相关的重做信息。
事务提交成功后,Oracle将为该事备生成一个系统变更码(SCN)。事务的SCN将同时记录在它的提交记录和重做记录中。
commit 的开销存在两个因素:
A. 显然会增加与数据库的往返通信。如果每个记录都提交,生成的往返通信量就会大得多。
B. 每次提交时,必须等待redo写至磁盘。这会导致“等待”。在这种情况下,等待成为“日志文件同步”(log file sysnc)
提交事务(COMMIT)前完成的工作:
#在SGA区的回退缓存中生成该事务的回退条目。在回退条目中保存有该事务所修改的数据的原始版本。
#在SGA区的重做日志缓存中生成该事务的重做记录。重做记录中记载了该事务对数据块所进行的修改,并且还记载了对回退段中的数据块所进行的修改。缓存中的重做记录有可能在事务提交之前就写入硬盘中。
#在SGA区的数据库缓丰中记录了事务对数据库所进行的修改。这些修改也有可能在事务提交之前就写入硬盘中。
提交事务(COMMIT)时完成的工作:
#在为该事务指定的回退段中的内部事务表内记录下这个事务已经被提交,并且生成一个惟一的SCN记录在内部事务表中,用于惟一标识这个事务。
#LGWR后进进程将SGA区重做日志缓存中的重做记录写入联机重做日志文件。在写入重做日志的同时还将写入该事务的SCN。
#Oracle服务进程释放事务所使用的所有记录锁与表锁。
#Oracle通知用户事务提交完成。
#Oracle将该事务标记为已完成。
注意
在oracle工作期间,LGWR并非缓存着你所做的所有工作;实际上,随着你的工作的进行,LGWR会在后台曾量式地刷新输出重做日志缓冲区的内容到在线重做日志文件中,这样做是为了避免COMMIT等待很长时间来一次性刷新输出所有的redo。直到commit执行,LGWR才将所有余下的缓存重做日志条目写至磁盘,并把SCN记录到在线重做日志文件中。这一部就是真正的COMMIT,此时事务条目会从V$TRANSACTION中删除,这说明我们已经提交。
rollback 回退事务完成的工作:
·Oracle通过使用回退段中的回退条目,撤销事务中所有SQL语句对数据库所做的修改。
·Oracle服务进程释放事务所使用的所有锁
·Oracle通知事务回退成功。
·Oracle将该事务标记为已完成
举个例子:
insert into a(id) values(1);(redo)
这条记录是需要回滚的。
回滚的语句是delete from a where id = 1;(undo)
试想想看。如果没有做insert into a(id) values(1);(redo)
那么delete from a where id = 1;(undo)这句话就没有意义了。
现在看下正确的恢复:
先insert into a(id) values(1);(redo)
然后delete from a where id = 1;(undo)
系统就回到了原先的状态,没有这条记录了。
分享到:
相关推荐
Oracle_Undo与Redo的通俗 Oracle中的Undo和Redo是两个非常重要的概念,它们都是Oracle数据库中事务管理和恢复机制的关键组件。Undo和Redo都是为了确保数据库的一致性和可靠性。 什么是REDO? REDO记录transaction...
在 Oracle 中,Undo 和 Redo 是两个不同的概念。Undo 代表撤销操作,而 Redo 代表重做操作。它们都是 Oracle 数据库中用于维护数据一致性的机制。 1.1. Undo 与 Redo 的区别 Undo 和 Redo 的主要区别在于它们的...
DML操作总是作为事务的一部分进行,可以使用ROLLBACK命令进行回退,或者使用COMMIT命令提交。Undo数据就是在数据被修改前的原始副本,记录了每次事务处理前的状态,至少会保留到事务结束。 Undo数据存储在Undo表...
### Oracle Undo 概述 在Oracle数据库中,`Undo`起着至关重要的作用,它确保了事务能够被正确地回退或撤销。本文将详细探讨`Undo`的概念、其工作原理以及如何影响Oracle数据库的性能。 ### Undo 的作用 #### 保证...
本文将深入探讨 Oracle 10g 的核心组成部分,包括实例(Instance)、数据库(Database)及其物理结构,重点分析日志缓冲区的写入机制以及“前滚”、“回滚”的概念。 #### 二、Oracle 10g 的实例与数据库 ##### ...
在系统崩溃或异常情况下,Oracle的重做日志(Redo Log)和undo段保证了事务的持久性。 五、索引 索引是提高查询性能的关键。Oracle支持B树索引、位图索引、函数索引等多种类型的索引。其中,B树索引适用于频繁的...
- **回滚与提交**:事务可以通过提交(Commit)操作使其更改成为永久性的,或者通过回滚(Rollback)操作撤销其更改。 - **日志与恢复**:为了确保数据的完整性和持久性,Oracle数据库使用重做日志(Redo Log)和...
1. 日志管理:redo log、undo log的概念及作用,理解redo日志切换和归档。 2. 数据库实例启动与关闭:理解SHUTDOWN和STARTUP命令,学习在不同模式下关闭和启动数据库。 3. 监控工具:使用V$视图进行性能分析,了解...
Oracle数据库提供了多种事务机制,包括Commit机制、Rollback机制、Savepoint机制等。 版本机制是指在数据库中对数据的版本进行管理,以避免多个用户对数据的修改不一致。Oracle数据库提供了多种版本机制,包括行...
- **Commit & Rollback**:讲解了提交和回滚的操作方法。 #### 十、故障诊断与优化 - **Diagnosing Problems**:介绍了诊断问题的方法。 - **View Extents**:提供了查看范围的方法。 - **Identify Space Deficits...
Oracle的redo log和undo log记录了所有事务的更改,保证了数据的可恢复性。在进行数据更新时,了解这些日志的作用和管理方式,有助于理解数据库行为。 综上所述,Oracle数据更新是一个涉及多个层面的复杂过程,包括...
另一方面,事务级临时表的数据则仅在事务期间有效,一旦事务提交(commit)或回滚(rollback),临时表中的数据也会被清除。由于每个会话只能看到并修改自己的临时表数据,这使得临时表不需要进行数据操纵语言(DML...
事务的提交流程包括检查事务结构、执行实际的事务提交(如InnoDB层的`trx_commit`和`trx_commit_low`函数),以及根据配置决定是否将redo log写入磁盘。这个过程可能涉及日志的刷盘策略,如`flush_log_at_trx_commit...
2. **数据提交与回滚**:在数据库操作中,`commit`语句用来保存更改,而`rollback`用于撤销未提交的更改。`savepoint`是在事务中设置的一个点,可以在之后的部分回滚到这个点,而不是全部回滚。 3. **SQL通配符搜索...
事务可以通过`BEGIN`、`COMMIT`、`ROLLBACK`等命令来管理。 #### 二、Redo 日志 Redo日志是在系统发生故障时用于恢复数据的重要机制之一。它记录了事务执行过程中对数据库所做的所有更改。 ##### Redo日志生成...
【MySQL事务剖析1】 在数据库管理系统中,事务是确保数据一致性的重要机制。事务是一组数据库操作,这些操作被视为一个逻辑工作单元,要么全部执行,要么全部不执行,以保证数据的完整性和一致性。事务的引入解决了...
* 检查点技术、REDO和UNDO操作、运行记录优先原则 * 恢复的实现方法:Checkpoint、Log、Shadow Paging等 五、并发控制 * 并发操作带来的三个问题:读脏、不可重复读、幻影读 * 并发控制的技术:X锁、PX协议、PXC...
### Oracle 错误一览表详解 #### ORA-00001: Unique constraint violated - **描述**:当尝试插入或更新一个行时,违反了唯一性约束。 - **解决方法**:确保数据不违反任何唯一性约束,或者修改约束以适应数据。 #...
以MySQL为例,MySQL通过REDO日志和UNDO日志实现事务的持久性和回滚。REDO日志记录已提交事务的修改,用于系统崩溃后的恢复;UNDO日志则用于回滚未提交事务,保证原子性。MySQL的内存缓冲区提高了事务处理效率,将...
■Chapter 2: Redo and Undo ....................................................................................... 5 Basic Data Change ....................................................................