oracle redo与undo_笔记9:undo段确实太小
undo段确实太小
一种场景是:你的系统中事务很小。正因如此,只需分配非常少的undo段空间。
如果如此设置undo段大小,使得很有可能在执行查询期间重用这些undo段,而且查询要访问被修改的数据,那就极有可能不断地遭遇ORA-01555错误。在这种情况下,必须把UNDO_RETENTION参数设置得高一些,让Oracle负责确定要保留多少undo。(这是一种推荐的方法,这比自行得出最佳的undo大小更容易一些)。或者重新设置undo段的大小,让它们更大一些(或者有更多的undo段)。你要配置足够的undo,在长时间运行的查询期间应当能够维持。
对于Oracle Database 9i和以上版本,管理系统中的undo有下面两种方法。
.自动undo管理(Automatic undo management):采用这种方法,通过UNDO_RETENTION参数告诉Oracle要把undo保留多长时间。Oracle会根据并发工作负载来确定要创建多少个undo段,以及每个undo段应该多大。数据库甚至在运行时可以在各个undo段之间重新分配区段,以满足DBA设置的UNDO_RETENTION目标。这是undo管理的推荐方法。
.手动undo管理(Manual undo management):采用这种方法的话,要由DBA来完成工作。DBA要根据估计或观察到的工作负载,确定要手动地创建多少个undo段。DBA根据事务量(生成多少undo)和长时间运行查询的长度来确定这些undo段应该多大。
在手动undo管理的情况下,DBA要确定有多少个undo段,以及各个undo段有多大,这就产生了一个容易混淆的问题。undo段从来不会因为查询而扩大,只有INSERT、UPDATE和DELETE才会让undo段增长。
对于这个问题,唯一的解决方案只能是适当地设置手动undo段的大小。第二种建议也同样适用。只要能让查询运行得更快,就应该尽力为之。如果自查询开始以来生成的undo从未被覆盖,就可以避免ORA-01555。
在自动undo管理的情况下,从ORA-01555角度看,问题则要容易得多。无需自行确定undo空间有多大并完成预分配,DBA只要告诉数据库运行时间最长的查询需要多长时间,并把这个值设置在UNDO_RETENTION参数中。Oracle会努力保证至少在这段时间内保留undo。如果已经分配了足够的空间可以扩展,Oracle就会扩展undo段,而不是回绕,从而满足UNDO_RETENTION保持时间的要求。
使用手动undo管理时,还要记住重要的一点,遇到ORA-01555错误的可能性是由系统中最小的undo段指示的(而非最大的回滚段,也并非平均大小的回滚段)。增加一个“大”undo段不能解决这个问题。处理查询时只会让最小的回滚段回绕,这个查询就有可能遇到ORA-01555错误。使用遗留的回滚段时主张回滚段的大小要相等,以上就是原因所在。
本文来源 我爱IT技术网 http://www.52ij.com/jishu/5271.html 转载请保留链接。
- 评论列表(网友评论仅供网友表达个人看法,并不表明本站同意其观点或证实其描述)
-
