undo段及区的状态和使用
undo表空间的作用
什么时候Oracle使用undo表空间?----开启一个事务的时候
如何使用?
假如delete一条记录,首先oracle将修改前的数据放入undo表空间中的undo段中。
undo表空间的作用一:将修改前的数据放入undo表空间的undo段中,需要时进行回滚。
在这个基础上,为什么要将修改前的数据放入undo表空间呢?
第一,手工回滚,事务可以回滚,如果修改的数据有误,可以将数据进行回滚到未修改之前的样子。
第二,自动回滚,一个事务如果还未完成,所在会话‘死掉了’,那么就需要自动回滚。
事务需要回滚,就是将事务修改前的数据恢复回来。原数据在undo表空间中。
oracle可以避免读到未提交的数据,如何实现读的数据一定是修改完的数据呢?需要用到undo表空间 。
undo表空间的作用二:构造CR块,达到一致性读的目的。保证ORACLE读的数据一致性。
undo表空间的作用三:实例崩溃恢复----回滚
实例恢复的步骤:
前滚:构造脏块
回滚:事务回滚----undo
undo段中的区的状态
free expired inactive active
查看undo segment状态
select usn,xacts,rssize/1024/1024/1024,hwmsize/1024/1024/1024,shrinks from v$rollstat order by rssize;
一个事务开始了,选择段,当这个段所对应的区用完后,事务还未结束,那么Oracle会再分配一个区给这个段继续使用,一直到这个事务执行完毕,但是不提交。这个工程是自操作的。一直不提交事务,这时undo的状态就是active。这时事务提交,状态为inactive。按照正常来讲,事务提交后,为undo段分配的区是可以进行覆盖了。因为提交了就不能回滚了,那么undo中的数据是无意义的,就可以被覆盖了。
但是oracle为了某个功能实现,oracle是希望已经提交的事务所对应的回滚表空间中的回滚段中的区尽量再保持一段时间。也就是说Oracle希望inactive区再保存一段时间。
保存的时间是通过参数undo_retention — 单位 秒,默认900秒,undo段尽可能的保留15分钟,15分钟以后,这个区的状态就会变成expired(过期)。过期以为这可以覆盖了。
expired状态的区时间长也会释放。
显示undo区信息
select extent_id,bytes,status fromdba_undo_extents where segment_name='_SYSSMU1$';
假如说将inactive的区至少保留900秒,那么就要设置undo_retention状态为guarantee
alter tablespace undotbs1 retention guarantee