undo的存在是为了四个目的:
原子性:保证事务的统一提交或回滚.
一致性:保证查询的结果不出现脏数据,即是在查询过程中,某些数据被修改了,查询出来的结果依然是开始查询时应该有的结果.
隔离性:俩会话之间互相不可见未提交或未回滚的数据.
闪回: 保证数据的安全.
1.undo的三个参数.
undo_tablespace:指定运行的undo表空间.
undo_management:undo表空间的管理方式.
undo_retention:undo表空间保留的时间.
2.undo的三种状态.
active:活动状态,即未提交或未回滚的事务,这个状态的撤消段是绝对不能被覆盖的.
expire:过期状态,即标识这个状态的回滚段已经提交,并且已经超过了undo_retention的保留时间,可以随时被覆盖.
unexpired:未过期状态,即标识这个状态的回滚段已经提交,但是未超过undo_retention的保留时间.这种情况下,如果undo表空间设置为guarantee,那么当撤消表空间的过期段不够时,不会覆盖unexpire状态的撤消段,就会出现事务失败,ORA-30036错误,如果undo表空间设置为unguarantee,那么当撤消表空间的过期段不够时,会强行覆盖unexpire的段,来保证事务的成功执行,这样可能会导致出现ORA-01555错误,因为保留的旧数据被覆盖掉了,如果一个查询的时间正好undo_retention的时间一致,那么就会导致快照过旧.
3.undo的2个报错ORA-01555/ORA-30036.
ORA-01555:快照过旧,导致原因是撤消段的数据被覆盖,但是查询时需要用到该数据,通常是由于undo_retention设置时间不够长或者撤消表空间不够大导致.
ORA-30036:不能扩展撤消段,导致原因是撤消表空间不够大导致.
4.undo的guarantee.
存放在dba_tablespaces表的retention字段中,在10g包括以后的版本中出现的参数,表示无论如何都会把已提交,未过期的数据保存到足够undo_retention的这个时间.
5.数据字典:
undo表空间的使用三种使用状态存放在dba_undo_extents表中.
v$undostat:存放undo使用率.
其实最终导致的错误的就是撤消表空间不够大,所以只要出现这类问题都基本可以归咎与撤消表空间的设置不合理.但是存在一种特殊情况就是使用人数由于某些爆炸性原因突增,达到之前前所未有的高度.