云贝教育 |【技术文章】undo_retention的具体意义
作者:刘晓峰
原文链接:http://www.tdpub.cn/Blog/detail/id/1355.html
关于UNDO_RETENTION的解释
1.首先查询当前环境的值
结果是15分钟
2.在我们执行一些命令前,我们执行一下查询,看看当前undo信息
3.现在我们执行一行INSERT,写入1m数据,然后不做rollback或者commit
接着查询
可以看到,所谓的活跃ACTIVE的UNDO,就是待commit或者rollback的UNDO信息。这部分UNDO是不能重用覆盖的
4.修改UNDO_RETENTION
然后查询状态
发现未过期和过期的UNDO大小没有发生变化,与我期望的结果不一致
这里直接给出结论,
被commit或者rollback的回滚段,会被标记为未过期(UNEXPIRED ),
未过期的数据,超过UNDO_RETENTION指定的时间,则被标记为过期(EXPIRED)
重用的顺序是过期,然后是未过期,因为我的undo max空间是2g,且不可扩展,如果没有可用的undo,则数据库会报错
5.跟踪当前undosize,提交后再跟踪
可以看到active已经变成了未过期的undo,不过我们期望等待1秒后,UNEXPIRED会变成EXPIRED,这里未出现
先复原参数
6.解释GUARANTEED RETENTION
前面我们说过,UNDO_RETENTION口头承诺,900秒内不会把当前undo的清理优先级升高,所以一旦undo不够
就会覆盖未过期的undo,使用GUARANTEED RETENTION,保证不重用未过期的undo(疑问点,保证不重用,又没有可用空间,会怎么样)
我当前是no guarantee retention
7.解释快照过旧问题
在1:00的时候,我执行了select,而1:01有人修改了数据,那么我就要去undo里面查询,如果我的查询时间很长
导致查询所在的undo被重用了,则报错ora-01555,因为找不到undo了,无法进行一致性查询
怎么解决呢,增加UNDO_RETENTION,并指定UNDO_RETENTION尽量超过你的长时查询,同时还要保证undo段大小尽量较大
不过既然核心是长时查询,所以你应该首先优化你的sql代码
8.undo动态视图
如果有unxpstealcnt不为0的数据,请增加GUARANTEED RETENTION
如果有ssolderrcnt不为0的数据,请增加undo尺寸,或者设置自动扩展(风险就是undo会非常大,占据非常多的磁盘空间)
9.继续分析UNDO_RETENTION
修改隐藏参数_undo_autotune 仍然不能实现
10.总结
UNDO RETENTION 标记过了多久,非过期的undo变成过期的undo,但是这两种undo都有可能被重写,因为undo一般大小固定,新undo覆写旧undo