查询的过程会在undo段中查找该数据块的前映像后,然后把前映像和current块合并形成了一个CR block,通过查询cr block就可以满足数据的一致性了。
CR block存在于sga的buffer cache中,在db cache里申请一个数据块(当前块),然后和对应的回滚段的前映像生成cr block。
关于undo的参数:
SQL> show parameter undo
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
undo_management string AUTO
undo_retention integer 900
undo_tablespace string UNDOTBS1
从11g开始oracle默认都是undo tablespace 自动管理,并且如果你没有指定undo_tablespace 这个参数,也就是说没有undo表空间,那么oracle就会把修改块的前镜像放到system表空间里面,并且会在alert日志里面告警:数据库 running without an undo tablespace。
下面重点解释 undo_retention
我们知道undo segments的extents 的状态共有四种,free ,active , inacitve, expired
SQL> select SEGMENT_NAME,TABLESPACE_NAME,STATUS from dba_undo_extents;
SEGMENT_NAME TABLESPACE_NAME STATUS
------------------------------ ------------------------------ ---------
_SYSSMU10_3534552179$ UNDOTBS1 EXPIRED
_SYSSMU10_3534552179$ UNDOTBS1 EXPIRED
_SYSSMU10_3534552179$ UNDOTBS1 UNEXPIRED
_SYSSMU10_3534552179$ UNDOTBS1 EXPIRED
_SYSSMU10_3534552179$ UNDOTBS1 EXPIRED
_SYSSMU10_3534552179$ UNDOTBS1 EXPIRED
_SYSSMU9_3683992930$ UNDOTBS1 EXPIRED
_SYSSMU9_3683992930$ UNDOTBS1 EXPIRED
_SYSSMU9_3683992930$ UNDOTBS1 EXPIRED
当没有可用的undo空间时,可以去覆盖inactive状态的区,这样就有可能报错ora-01555,不能一致读了,因为你的undo_retention 值是通过咨询你们当前业务的查询语句执行时间最长的那个时间来确定的,也就是说undo_retention > sql执行最长时间 ,因此你使用不使用GUARANTEE取决于你业务的需求。