有时候检查"v$rollstat"视图,发现回滚段标记为FULL,当一个回滚段标记为FULL后,新的事务不能使用该回滚段,在FULL状态被清除前,该回滚段中的所有的事务都必须完成,即事务要么全部提交或者回退。
如果不可能提交或者回退所有事务,临时的解决办法如下:
A. 将回滚段脱机,然后再联机,就可以清除FULL状态,如果有大量的事务需要回退,可能会需要花很长的时间。
Alter rollback segment offline;
Alter rollback segment online;
B. 为回滚段所在的表空间添加一个数据文件,以便此回滚段可以扩展。当前*current* txn事务可以继续(导致回滚段状态变成FULL的当前事务),回滚段的状态可以再次回到ONLINE。
如果你等不及让FULL状态清除掉,重启数据库可以清除回滚段的状态。其他可能的临时措施是,使用事务设置。这里假设仍然使用FULL的回滚段。
Set transaction use rollback segment ;
当full状态的回滚段中的所有事务完成后(提交或者回滚),FULL的状态就清除了,并且此回滚段可以环绕。当回滚段中的活动事务数量为0的时候,FULL的状态也可以被清除。
有时候回滚段还运行着的活动事务,阻止我们环绕并重用回滚段中的已经分配的区,某些事务需要很长的时间才能完成,它阻止对回滚空间的重用,卡在那里,除非此事务和所有的事务全部完成,否则回滚段保持FULL。
可以查看v$transaction,来看看到底是什么事务。
我们来看下面的统计:
Rollback segemnt Status Exist extents Current extent Current block Transactions
---------------- ---------- ------------- -------------- ------------- ------------
R02 FULL 360 192 33 2
SYSTEM ONLINE 5 0 7 0
IBSRB01 ONLINE 1,605 720 19 3
R04 ONLINE 421 364 4 3
R03 ONLINE 358 193 16 2
R01 ONLINE 548 166 13 2
R02状态是FULL,但是它只用了已分配360个区中的192个。回滚段中有两个事务,使用其他的查询发现这两个事务都是INACTIVE,那么R02的状态怎么会是FULL?
因为回滚段的使用方式是循环使用的,当你的非活动事务正在使用"extend 193",我们就无法再进入其中,即使194-360没有被使用。因此回滚段当然就是FULL,对于新的事务来说不能使用此回滚段,除非它不是FULL。
注意:
当事务完成后,回滚段分配的区并不会马上释放,只有当头从一个区移到下一个区的时
候,才会执行收缩。
来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/195785/viewspace-464505/,如需转载,请注明出处,否则将追究法律责任。
转载于:http://blog.itpub.net/195785/viewspace-464505/