某客户数据库的版本为11.2.0.3,如下所示:
SQL> select * from v$version;
BANNER
Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production
PL/SQL Release 11.2.0.3.0 - Production
CORE 11.2.0.3.0 Production
TNS for IBM/AIX RISC System/6000: Version 11.2.0.3.0 - Production
NLSRTL Version 11.2.0.3.0 - Production
数据库使用的UNDO表空间为UNDOTBS1,且为自动管理,如下所示:
SQL> show parameter undo_management
NAME TYPE VALUE
undo_management string AUTO
SQL> show parameter undo_tablespace
NAME TYPE VALUE
undo_tablespace string UNDOTBS1
某日,业务程序运行时突然出现ORA-1628错误,数据库警告日志如下所示:
Fri Jun 07 16:25:48 2013
ORA-1628: max # extents 32765 reached for rollback segment _SYSSMU985_640904372$
Fri Jun 07 16:58:14 2013
ORA-1628: max # extents 32765 reached for rollback segment _SYSSMU1496_3116906519$
进一步检查dba_undo_extents视图发现,_SYSSMU985_640904372 和 S Y S S M U 149 6 3 116906519 和_SYSSMU1496_3116906519 和SYSSMU14963116906519回滚段中的区数量确实已经达到了32765个,如下所示:
SQL> select SEGMENT_NAME,count() from dba_undo_extents where TABLESPACE_NAME=‘UNDOTBS1’
2 group by SEGMENT_NAME order by 2;
SEGMENT_NAME COUNT()
。。。。。。
_SYSSMU985_640904372$ 32765
_SYSSMU1496_3116906519$ 32765
检查_SYSSMU985_640904372回滚段中的每个区大小,发现每个区大小只有64k,这在区大小分配方式为系统分配下是极为不正常的,如下所示:
SQL> select EXTENT_MANAGEMENT,ALLOCATION_TYPE from dba_tablespaces where TABLESPACE_NAME=‘UNDOTBS1’;
EXTENT_MAN ALLOCATIO
LOCAL SYSTEM
SQL> select distinct BYTES from dba_undo_extents where SEGMENT_NAME=’_SYSSMU985_640904372’;
BYTES
65536
由于回滚段_SYSSMU985_640904372 中 每 个 区 的 大 小 只 有 64 k , 所 以 整 个 回 滚 段 大 小 只 有 2 G 不 到 , 如 下 所 示 : S Q L > s e l e c t B Y T E S / 1024 / 1024 / 1024 f r o m d b a s e g m e n t s w h e r e S E G M E N T N A M E = S ′ Y S S M U 98 5 6 40904372 中每个区的大小只有64k,所以整个回滚段大小只有2G不到,如下所示: SQL> select BYTES/1024/1024/1024 from dba_segments where SEGMENT_NAME='_SYSSMU985_640904372 中每个区的大小只有64k,所以整个回滚段大小只有2G不到,如下所示:SQL>