oracle的undo管理有两种方式,自动管理和手动管理,可以使用 undo_management 参数来进行控制。当设置为auto时使用undo表空间的方式来自动管理undo段,如果设置为manual则使用rollback segment方式存储undo信息。
oracle9i 以后开始使用undo自动管理,手动管理方式只在特殊的场合下才会偶尔使用到。后面在介绍undo恢复时再做相应介绍。
说到自动管理,首先要介绍UNDO_RETENTION参数,这个参数用来指定undo 记录保存的最长时间,默认为900秒,可以动态的进行修改。这个参数不是指undo中的数据在undo表空间中一定要保存900秒,例如当一个新事务开始的时候,如果发现undo表空间已经被写满,则新事务的数据会自动覆盖已提交事务的数据,而不管这些数据是否已存放够900秒。同时也不是指undo_retention 中指定的时间一过,已经提交事务中的数据就立刻无法访问,通常它只是失效,只要没有被别的事务覆盖,它就会仍然存在,这时我们可以使用flashback 特性查看表在更新前不同时刻的数据。
因此UNDO表空间中的数据在不同时段就会有不同的状态显示,在dba_undo_extents 数据字典里记录了UNDO中每个区段的状态.
SQL> SELECT tablespace_name, status, SUM (bytes) / 1024 / 1024 "Bytes(M)"
FROM dba_undo_extents
GROUP BY tablespace_name, status;
TABLESPACE_NAME STATUS Bytes(M)
---------------- --------- ----------
UNDOTBS2 EXPIRED 1.4375
UNDOTBS2 UNEXPIRED .375
UNDOTBS2 ACTIVE .125
UNDOTBS1 EXPIRED 22
其中:
ACTIVE :未提交的回滚数据,该数据所关联的事务并未提交,用于实现读一致性,所以该数据不能被其它事务的数据所覆盖 。
UNEXPIRED:已经提交但未过期的回滚数据,该数据关联的事务已经提交,但是仍受到undo retention参数保持时间的影响,当undo表空间中没有可用的数据块时,这些数据块会直接被覆盖而进行重用。
EXPIRED: 事务已经提交,而且数据保存时间已经超过undo retention参数指定的时间,属于已经过期的数据.可以被随时重用。
需要说明的是,当设置表空间启动Guarantee特性时,UNEXPIRED类型的块就必须要等到undo_retention 指定时间过期后才能被重用。
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。




