事务在回滚的时候,drop掉相关的表。事务会停止回滚,相关的undo段会自动offline

最近发现测试环境中oracle的undo segment,大量的自动offline。排查了一下

结论:
在回滚的时候,如果将表做了drop table <> purge;操作。回滚会自动结束。涉及的undo segments会自动offline(不会立即offline);
测试过程中,offline中的undo回滚中的区,可以被online的undo segments使用。

测试。
1.将undo表空间使用完
SQL> insert into emp select * from emp;

14 rows created.

SQL> /

………………

SQL> /
insert into emp select * from emp
*
ERROR at line 1:
ORA-30036: unable to extend segment by 8 in undo tablespace 'UNDOTBS1'

SQL>
2.kill会话,自动回滚
3.另起一个会话,产生大量的事务,消耗undo。发现offline中的extent被使用

SQL> select SEGMENT_NAME,EXTENT_ID,BYTES from dba_extents where segment_name in (select SEGMENT_NAME from dba_rollback_segs where STATUS='OFFLINE')

SEGMENT_NAME EXTENT_ID BYTES
--------------------------------------------------------------------------------- ---------- ----------
_SYSSMU12_3580111010$ 0 65536
_SYSSMU12_3580111010$ 1 65536
_SYSSMU12_3580111010$ 2 65536
_SYSSMU13_3093638253$ 0 65536
_SYSSMU13_3093638253$ 1 65536
_SYSSMU13_3093638253$ 2 65536
_SYSSMU13_3093638253$ 3 65536
_SYSSMU13_3093638253$ 4 65536
_SYSSMU13_3093638253$ 5 65536
_SYSSMU13_3093638253$ 6 65536
_SYSSMU13_3093638253$ 7 65536

SEGMENT_NAME EXTENT_ID BYTES
--------------------------------------------------------------------------------- ---------- ----------
_SYSSMU14_3308680137$ 0 65536
_SYSSMU14_3308680137$ 1 65536
_SYSSMU14_3308680137$ 2 65536
_SYSSMU15_4173493555$ 0 65536
_SYSSMU15_4173493555$ 1 65536
_SYSSMU16_3198972214$ 0 65536
_SYSSMU16_3198972214$ 1 65536
_SYSSMU17_3974766379$ 0 65536
_SYSSMU17_3974766379$ 1 65536
_SYSSMU17_3974766379$ 2 65536
_SYSSMU17_3974766379$ 3 65536

SEGMENT_NAME EXTENT_ID BYTES
--------------------------------------------------------------------------------- ---------- ----------
_SYSSMU17_3974766379$ 4 65536
_SYSSMU17_3974766379$ 5 65536
_SYSSMU18_289737016$ 0 65536
_SYSSMU18_289737016$ 1 65536

26 rows selected.

SQL> /

SEGMENT_NAME EXTENT_ID BYTES
--------------------------------------------------------------------------------- ---------- ----------
_SYSSMU12_3580111010$ 0 65536
_SYSSMU12_3580111010$ 1 65536
_SYSSMU13_3093638253$ 0 65536
_SYSSMU13_3093638253$ 1 65536
_SYSSMU14_3308680137$ 0 65536
_SYSSMU14_3308680137$ 1 65536
_SYSSMU15_4173493555$ 0 65536
_SYSSMU15_4173493555$ 1 65536
_SYSSMU16_3198972214$ 0 65536
_SYSSMU16_3198972214$ 1 65536
_SYSSMU17_3974766379$ 0 65536

SEGMENT_NAME EXTENT_ID BYTES
--------------------------------------------------------------------------------- ---------- ----------
_SYSSMU17_3974766379$ 1 65536
_SYSSMU18_289737016$ 0 65536
_SYSSMU18_289737016$ 1 65536

14 rows selected.

SQL>

 

处理方法:

1.执行下列语句,生成undo segment online语句。

select 'alter rollback segment "'||segment_name||'" online;' from dba_rollback_segs where owner<>'SYS'  and instance_num=2 and status<>'ONLINE';

2.设置"_smu_debug_mode"=4 。然后将段online

SQL> ALTER SYSTEM SET "_smu_debug_mode"=4  sid='*' SCOPE=MEMORY;

System altered.

SQL> alter rollback segment "_SYSSMU136_3870040108$" online;

3.执行完成后,设置"_smu_debug_mode"=0;

SQL> ALTER SYSTEM SET "_smu_debug_mode"=0  sid='*' SCOPE=MEMORY;

 

posted on 2018-06-11 14:46  erwadba  阅读(392)  评论(0编辑  收藏  举报

导航