原文地址:http://blog.csdn.net/robinson1988/article/details/4681469
undo_retention:指定事物commit后undo 将要保存的时间(秒),在ORACLE10g中默认的是900秒。GUARANTEE : 保证undo_retention参数所设定的时间有效,这个是10g的新功能。SQL> ALTER TABLESPACE undotbs1 RETENTION GUARANTEE;
SQL> ALTER TABLESPACE undotbs1 RETENTION NOGUARANTEE;
在没有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满足最大允许的长时间查询。而不再需要用户手工调整。
对于这个功能,我问了 我们的新同事,他说 这个功能很少用,毕竟ORACLE没有强烈推荐,可能是一个过渡的,而且我们不知道它有没有什么BUG。
关于undo_retention和retention guarantee
undo_retention是用来设定undo数据在undo表空间的保存时间的,即使设定了undo_retention也不能保证不会出现"ora-1555 snapshot too old”错误,对于事务和查询来说,oracle更倾向于维护事务,即尽量保证不出现"ora-30036 unable to extend segment in undo tablespace "错误。不过对于DBA来说,有时成功的查询比成功的事务更重要,即尽量保证不出现"ora-1555"错误,这时除了指定undo_retention之外,还要对undo表空间指定retention guarantee,即执行命令"ALTER TABLESPACE UNDOTBS1 RETENTION GUARANTEE;"。以上命令只能在SQL*PLUS 中执行,不能在database control中设定。
以上。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/20335819/viewspace-709894/
,如需转载,请注明出处,否则将追究法律责任。