undo的作用是:解决oracle多用户读写一致性,以及操作可撤销或者回滚。
1.undo表空间是从10g开始进行自动管理的,几个参数如下:
undo_management:回滚段手动管理还是自动管理
undo_tablespace:为undo单独定义的表空间;在自动管理模式下,使用哪个表空间
undo_retention:在自动管理模式下,回滚段在非活动状态下,回滚段中的数据被覆盖前,系统的保留时间(秒)。
2.回滚段存储的内容
insert操作:只记录插入记录的rowid,回滚时,只需要根据该rowid删除记录即可
update操作:记录要更新字段的镜像,回滚时,通过该镜像,覆盖之前的值
delete操作:完整地记录一条数据,回滚时,通过一个反向操作恢复数据。
通过上面比较,delete的花销最大。所以,一个批量删除失败,回滚会花销比较长的时间。同时,回滚的操作
还要记录redo日志。
3.oracle读写一致性
用户A、B;一个在update,一个在select;
如果(1):Ty< T<Tz<Tx , 即在查询中,数据有更新;但在update 的commit前,查询结束;虽然有update操作,但select依然
可以通过回滚段的数据镜像查询出结果,这样数据就保持了读取一致性。
如果(2):Ty< T<Tx<Tz ,在查询中,数据有更新;但在update 的commit前,查询还未结束;这就导致select的查询回滚段的数据
镜像有可能被覆盖,进而查询失败;oracle提示ora-01555错误。
oracle为解决ora-01555问题:
从10g 开始,oracle 对undo_retention 参数进行了调整。默认情况下,这个参数是启用的。oracle自动调整回滚段数据保留时间;
当然,如果undo表空间不足,系统自动满足长时间的查询,而不需要手动调整。
同时,oracle还对undo表空间增加了guaratee控制,即用户可以指定undo表空间必须满足undo_retention 限制。
>alter tablespace undotbs1 retention guaratee;