undo相关概念及初始化参数

长平狐 发布于 2013/09/17 15:11
阅读 186
收藏 0

1.UNDO:

是为了保证数据库中多个用户间的读一致性和能够回退事务,ORACLE提供一种机制,能够为变更的数据构造一种前镜像berore image数据(保存修改之前的旧值),以保证能回滚或撤销对数据库所作的修改,同时为数据恢复以及一致性读服务。ORACLE自动管理的撤销undo表空间,automatic undo management,AUM

如修改某条数据update emp set sal=9999 where empno=7788;这时,在事务开始时,需要在回滚表空间获得一个事务槽,会有REDO信息,分配空间,创建前镜像,有REDO信息。此后事务修改才能进行,此时仍有REDO信息,ORACLE以此来保证事务可以回滚。


2.DML操作产生的REDO与UNDO对比

REDO只记录少量信息,用来重演事务。UNDO中也只记录少量精简信息,用来撤销事务。

UNDO:

对于INSERT操作,回滚段只需要记录插入记录的ROWID,如果回退,只需要将记录根据ROWID删除即可 。

对于UPDATA操作,回滚段只需要记录被更新字段的旧值即可(前镜像),回退时通过旧值覆盖新值即可完成回滚

对于DELTEE操作,ORACLE必须记录整行数据,在回滚时,通过反向操作恢复删除的数据。

REDO:

一.redo日志中需要保存undo和操作本身产生的redo

二.insert时生成undo量最小,所以相应的redo数据也最少
三.update时undo中需要保存修改字段的原数据,所以undo量会较insert操作增加,相应的redo数据也会增加

四.delete时虽然本身产生的redo量最少,但undo量最大,所以产生的redo也最大

五.当update修改字段数与总字段数相等时,undo量与delete操作相当,redo最大

相同数据量的数据操作:

INSERT产生最少REDO;UPDATA首先的REDO居中;DELETE产生最多REDO。

DELETE产生UNDO最多,UPDATE次之,INSERT产生UNDO最少。


3、UNDO的产生--对一条UPDATE语句的解析

回滚段在UNDO表空间中分配,其数据在BUFFER CACHE内存中管理方式与用户数据一致,同样按照相同规则写出到UNDO表空间的数据文件上,UNDO表空间中存储空间同样按照SEGMENT来分配和使用。

ORACLE通过锁定机制实现数据库的并发控制,通过多版本multi-versioningmodel模型进行并发数据访问,实现读取和写入的分离,使得写入不阻塞读取,读取不阻塞修改。

ORACLE内部使用SCN作为数据库时钟,查询结果集就是根据SCN判断,每个数据头都会记录一个提交SCN,当数据更改提交后,提交SCN同时被修改。通过此SCN在查询时进行一致性读判断。


例如:如在T1时刻,EMP中的SCOTT用户SAL为3000.此时查询selectsal from emp where ename=’SCOTT’;3000

在T2时刻修改SAL。Update empset sal=sal+1000 where ename=’SCOTT’;  执行但不COMMIT

在T3时刻查询select sal from emp where ename=’SCOTT’ 结果为3000(当前SESSION在修改未提交时查询的结果为修改后的,其它用户SESSION查询到的是ORACLE通过回滚段构造前镜像来返回结果——一致性读

在T4时刻,COMMIT T2时的数据修改

在T5时刻,查询select sal from emp where ename=’SCOTT’ 结果为4000


4.UNDO管理的相关参数

undo_management    用来定义数据库使用的回滚段是否使用自动管理模式,AUTO表示自动管理,MANUAL手工管理

undo_suppress-errors    表示当使用自动管理模式时,如使用不再支持的操作比如为事务指定回滚段是否返回出错消息。TRUE不返回出错消息,操作无效但可以继续。FALSE时操作不能继续。

undo_tablespace      用来定义自动管理模式时,当前使用哪个UNDO表空间。

undo_retention      表示自动管理模式下,当回滚段非激活inactive后,事务提交后UNDO信息保留的时间,单位是秒。默认900秒——11G,即保证15分钟内的数据可恢复。当回滚段空间足够时,可以不只恢复15分钟。但当回滚段空间不够时,UNDO信息可能会被覆盖。

通过UNDO_RETENTION参数解决:

如果设置为0,ORACLE启用自动调整以满足最找运行查询的需要。

指定UNDO表空间必须满足UNDO_RETENTION的限制即强制事务提交后必须保留最少900秒:alter tablespace undotbs1 retentionguarantee|noguarantee;

ORACLE11G通过RMAN UNDO备份优化,在备份UNDO表空间时,提交事务的UNDO信息不备份,极大缩小备份文


5.GUARANTEE参数

undo_retention:指定事物commit后undo 将要保存的时间(秒),在ORACLE10g中默认的是900秒。
 GUARANTEE: 保证undo_retention参数所设定的时间有效,即不会因UNDO表空间不足在900秒内被覆盖。这个是10g的新功能。

SQL> ALTER TABLESPACE undotbs1 RETENTION  GUARANTEE;
SQL> ALTER TABLESPACE undotbs1 RETENTION  NO GUARANTEE;

在没有guarantee的保证下,ORACLE并不能保证能够将undo信息存储900秒,如果undo表空间不足,那么ORACLE将忽略undo_retention的设置,直接覆盖掉以前的undo,这个时候有可能会产生ORA-01555错误。如果undo表空间空间足够,那么undo将会保存很长一段时间,直到undo表空间达到maxsize,这个时候才会覆盖undo信息,而且ORACLE会从最古老的undo信息开始覆盖。

ORACLE推荐我们将undo 表空间中的datafile 设定MAXSIZE ,不要让它一直自动扩展,如果ORACLE获得了自动扩展的能力,那么旧的undo不会被覆盖,到后来undo表空间会越来越大,越来越大,直到将磁盘空间耗尽。

在有guarantee的保证下,ORACLE将会保证undo信息能够保存到undo_retention设定的值之后才被覆盖,如果这个时候同时执行了很多事物,将undo表空间耗完了,那么那个事物会失败,会报ORA-30036 错误,所以使用guarantee一定要慎用,如果非要使用guarantee,那么尽量将undo 表空间设大 一点。

Oracle10g开始,如果你设置UNDO_RETENTION为0,那么Oracle启用自动调整以满足最长运行查询的需要。当然如果空间不足,那么Oracle满足最大允许的长时间查询。而不再需要用户手工调整。



原文链接:http://blog.csdn.net/q947817003/article/details/11352911
加载中
返回顶部
顶部