什么是REDO
REDO记录transaction logs分为online和archived以恢复为目的
比如机器停电那么在重起之后需要online redo logs去恢复系统到失败点
比如磁盘坏了需要用archived redo logs和online redo logs区恢复数据
比如truncate一个表或其他的操作想恢复到之前的状态同样也需要
什么是UNDO
REDO 是为了重新实现你的操作而UNDO相反是为了撤销你做的操作比如你得一个TRANSACTION执行失败了或你自己后悔了则需要用 ROLLBACK命令回退到操作之前回滚是在逻辑层面实现而不是物理层面因为在一个多用户系统中数据结构blocks等都在时时变化比如我们 INSERT一个数据表的空间不够扩展了一个新的EXTENT我们的数据保存在这新的EXTENT里其它用户随后也在这EXTENT里插入了数据而此时我想ROLLBACK那么显然物理上讲这EXTENT撤销是不可能的因为这么做会影响其他用户的操作所以ROLLBACK是逻辑上回滚比如对INSERT来说那么ROLLBACK就是DELETE了
COMMIT 以前常想当然地认为一个大的TRANSACTION(比如大批量地INSERT数据)的COMMIT会花费时间比短的TRANSACTION长而事实上是没有什么区别的
因为ORACLE在COMMIT之前已经把该写的东西写到DISK中了
我们COMMIT只是
产生一个SCN给我们TRANSACTIONSCN简单理解就是给TRANSACTION排队以便恢复和保持一致性
REDO写REDO到DISK中(LGWR这就是log file sync)记录SCN在ONLINE REDO LOG当这一步发生时我们可以说事实上已经提交了这个TRANSACTION已经结束(在V$TRANSACTION里消失了)
SESSION所拥有的LOCK(V$LOCK)被释放
Block Cleanout(这个问题是产生ORA: snapshot too old的根本原因) ROLLBACK ROLLBACK和COMMIT正好相反ROLLBACK的时间和TRANSACTION的大小有直接关系因为ROLLBACK必须物理上恢复数据 COMMIT之所以快是因为ORACLE在COMMIT之前已经作了很多工作(产生UNDO修改BLOCKREDOLATCH分配) ROLLBACK慢也是基于相同的原因
UNDO表空间用于存放UNDO数据当执行DML操作时Oracle <;会将这些操作的旧数据写入UNDO段管理UNDO数据不仅可以使用回滚段还可以使用UNDO表空间
UNDO数据的作用当用户执行DML操作修改数据时UNDO数据被存放在UNDO段而新数据则被存放到数据段中如果事务操作存在问题就需要回退事务以取消事物变化
例如执行完UPDATE emp SET sal= WHERE empno=后发现应该修改雇员的工资而不是此时应该执行ROLLBACK语句
读一致性
用户检索数据时ORACLE总是使用户只能看到被提交过的数据这是由Oracle自动提供的当用户修改数据但是没有提交时另外一个用户使用select语句查找该值时该值就是从undo表空间中取得的
事务恢复
事务恢复是例程恢复的一部分它是由Oracle Server自动完成的如果在数据库运行过程中出线历程失败那么当启动Oracle Server时后台进程SMON会自动执行例程恢复执行例程恢复时Oracle会重做所有未应用的记录然后打开数据库回退未提交事务
倒叙查询
倒叙查询用于取得某一特定时间点的数据库数据
UNDO_MANAGEMENT
使用初始化参数用于指定UNDO数据的管理方式如果使用自动管理模式必须设置该参数为AUTO此时采用UNDO表空间管理UNDO数据如果使用手工管理模式必须设置该值为MANUAl此时采用回滚段管理UNDO数据
UNDO_TABLESPACE
用于指定例程所要使用的UNDO表空间使用自动UNDO管理模式时通过配置该参数可以指定例程所要使用的UNDO表空间
使用RAC结构时必须为每个例程配置一个独立的UNDO表空间
UNDO_RETENTION
该参数用于控制UNDO数据的最大保留时间其默认值为秒该值时倒叙查询可以查看到的最早时间点
UNDO表空间上不能建立任何数据对象