最近发现测试环境中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;