暂无图片
暂无图片
3
暂无图片
暂无图片
暂无图片

由ORA-1691引发的超大SYSAUX表空间整理

原创 猫瞳映月 2020-02-25
2208

(1) 在大数据量插入的时候的日志报错:
Mon Jul 09 04:01:02 CST 2012
ORA-1691: unable to extend lobsegment SYS.SYS_LOB0000008983C00004$$ by 128 in tablespace SYSAUX
ORA-1691: unable to extend lobsegment SYS.SYS_LOB0000008983C00004$$ by 8192 in tablespace SYSAUX

看看数据文件有多大!天32G的SYSAUX!
-rw-r----- 1 oracle oinstall 32G 08-24 13:24 sysaux01.dbf

ORA-1688: unable to extend table SYS.WRHACTIVESESSIONHISTORYpartitionWRH_ACTIVE_SESSION_HISTORY partition WRH_ACTIVE_358854564_1851 by 128 in
tablespace SYSAUX
ORA-1688: unable to extend table SYS.WRHACTIVESESSIONHISTORYpartitionWRH_ACTIVE_SESSION_HISTORY partition WRH_ACTIVE_358854564_1851 by 128 in
tablespace SYSAUX

(2) 初步查看错误信息
[oracle@dmdb ~]$ oerr ora 1688
01688, 00000, “unable to extend table %s.%s partition %s by %s in tablespace %s”
// *Cause: Failed to allocate an extent of the required number of blocks for
// table segment in the tablespace indicated.
// *Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or more
// files to the tablespace indicated.
[oracle@dmdb ~]$ oerr ora 1691
01691, 00000, “unable to extend lob segment %s.%s by %s in tablespace %s”
// *Cause: Failed to allocate an extent of the required number of blocks for
// LOB segment in the tablespace indicated.
// *Action: Use ALTER TABLESPACE ADD DATAFILE statement to add one or more
// files to the tablespace indicated.
################################################
(3)可以看到下面两个表是把SYSAUX撑大的源头
SELECT us.SEGMENT_NAME,us.SEGMENT_TYPE,bytes/1024/1024/1024 GB,us.TABLESPACE_NAME,ul.table_name
FROM user_segments us,user_lobs ul
WHERE us.SEGMENT_NAME = ul.SEGMENT_NAME AND ul.table_name = ‘MGMT_BPEL_CONFIGFILES_UPLOAD’;

OWNER SEGMENT_NAME SEGMENT_TYPE MB


SYS SYS_LOB0000008983C00004$$ LOBSEGMENT 29212
SYS SYS_LOB0000003717C00007$$ LOBSEGMENT 3062

(4)查看dba_LOBS 看到是如下两个表
TABLE_NAME SEGMENT_NAME


WRHSQLTEXTSYSLOB0000008983C00004_SQLTEXT SYS_LOB0000008983C00004WRI WRI_ADV_OBJECTS SYS_LOB0000003717C00007$$

##############################################################参考文章 是因为BUG导致WRH$_SQLTEXT表数据没用自动删除。
http://blog.csdn.net/lwei_998/article/details/6532443

这样以后解决:
SQL> truncate table WRH$_SQLTEXT;

这篇文章也很好
http://wenku.baidu.com/view/daf642728e9951e79b89278c.html
2972 rows selected.
回收方式:参考:
http://space.itpub.net/7199859/viewspace-193116

##############################################################
自己尝试回收32G的sysaux表空间:

根据BLOCK_ID 定位对象,删除然后根据元数据DDL重建

select max(BLOCK_ID) from dba_extents where tablespace_name=‘SYSAUX’;
select segment_name,segment_type,owner from dba_extents where tablespace_name=‘SYSAUX’ and BLOCK_ID=4194177;
SQL> drop table wrh$_latch purge;
然后根据元数据DDL重建

(5)批量删除:尝试缩小至5G 经过计算 5G/8k=655360 所以要重新清理大于BLOCK_ID=655360的对象:

select segment_name,segment_type,owner from dba_extents where tablespace_name=‘SYSAUX’ and BLOCK_ID>655360;

SEGMENT_NAME SEGMENT_TYPE OWNER



WRIADVRECOMMENDATIONSTABLESYSWRI_ADV_RECOMMENDATIONS TABLE SYS WRI_ADV_ACTIONS TABLE SYS
WRIADVRATIONALETABLESYSWRI_ADV_RATIONALE TABLE SYS WRI_ADV_RATIONALE TABLE SYS
WRIOPTSTATTABHISTORYTABLESYSWRI_OPTSTAT_TAB_HISTORY TABLE SYS WRI_OPTSTAT_IND_HISTORY TABLE SYS
WRIOPTSTATHISTHEADHISTORYTABLESYSWRI_OPTSTAT_HISTHEAD_HISTORY TABLE SYS WRI_OPTSTAT_HISTHEAD_HISTORY TABLE SYS
SCHEDULEREVENTLOGTABLESYSWRH_EVENT_LOG TABLE SYS WRH_BG_EVENT_SUMMARY TABLE SYS
WRHENQUEUESTATTABLESYSWRH_ENQUEUE_STAT TABLE SYS WRH_SHARED_POOL_ADVICE TABLE SYS
WRIADVPARAMETERSPKINDEXSYSIWRI_ADV_PARAMETERS_PK INDEX SYS I_WRI_OPTSTAT_IND_OBJ#_ST INDEX SYS
I_WRIOPTSTATINDSTINDEXSYSIWRI_OPTSTAT_IND_ST INDEX SYS I_WRI_OPTSTAT_HH_OBJ_ICOL_ST INDEX SYS
#######

SQL> select ‘drop table’||’ ‘||segment_name||’ purge;’ from dba_extents where tablespace_name=‘SYSAUX’ and
SEGMENT_TYPE=‘TABLE’ and BLOCK_ID>655360 ;

drop table WRIADVRECOMMENDATIONSpurge;droptableWRI_ADV_RECOMMENDATIONS purge; drop table WRI_ADV_ACTIONS purge;
drop table WRIADVRATIONALEpurge;droptableWRI_ADV_RATIONALE purge; drop table WRI_OPTSTAT_TAB_HISTORY purge;
drop table WRIOPTSTATINDHISTORYpurge;droptableWRI_OPTSTAT_IND_HISTORY purge; drop table WRI_OPTSTAT_HISTHEAD_HISTORY purge;
drop table WRIOPTSTATHISTHEADHISTORYpurge;droptableSCHEDULER_OPTSTAT_HISTHEAD_HISTORY purge; drop table SCHEDULER_EVENT_LOG purge;
drop table WRHBGEVENTSUMMARYpurge;droptableWRH_BG_EVENT_SUMMARY purge; drop table WRH_ENQUEUE_STAT purge;
drop table WRH$_SHARED_POOL_ADVICE purge;

alter index WRI$_ADV_PARAMETERS_PK rebuild;

(6)之后使用PLSQL查看表的元数据,然后执行重新创建的脚本即可。
这样就可以把SYSAUX表空间缩小到5G大小对应655360个8K块了。
SQL> alter database datafile ‘/home/oracle/product/oradata/dmdb1/sysaux01.dbf’ resize 5g;

Database altered

大家可以使用同样的办法使得SYSAUX缩小到500M以下,只不过手动麻烦些,希望大家有更好的办法。

「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论