Usage and Storage Management of SYSAUX tablespace occupants SM/AWR, SM/ADVISOR, SM/OPTSTAT and SM/OTHER ( Doc ID 329984.1 )
按照下面的方法進行處置:
- 首先通過手動的方式,刪除老舊的 optimizer statistics 相關信息。
SQL> exec dbms_stats.purge_stats (DBMS_STATS.PURGE_ALL)
- 手動刪除之后,您可以根據需要減少保存期間。
・現在保存期間的確認方法
SQL> select DBMS_STATS.GET_STATS_HISTORY_RETENTION from dual;
默認是 31 天。
・變更保存期間的方法
(例) 變更保存期間為10天
SQL> connect /as sysdba
SQL> exec DBMS_STATS.ALTER_STATS_HISTORY_RETENTION (10);
※ 如果是RAC環境的話,需要在所有的節點上執行。
另,
使用下面的命令來刪除老舊的 optimizer statistics 相關信息,內部使用的
TRUNCATE 語句。一般來說不會有任何的風險。建議您可以在業務空閑的時候
執行這個語句。
SQL> exec dbms_stats.purge_stats (DBMS_STATS.PURGE_ALL)
OPTSTAT 相關聯的 Segment 都是以 WRI$_OPTSTAT, I_WRI$_OPTSTAT 或者 OPTSTAT 開頭的。
根據您提供的信息,SM/OPTSTAT 里面占比比較大的都是 OPTSTAT 相關的一些內部 INDEX。
SYSAUX 一直在慢慢變大的原因,應該是在日常的運行過程中產生的索引碎片化所導致的。
(4) Space usage by non-AWR components (> 500K)
COMPONENT MB SEGMENT_NAME SEGMENT_TYPE
NON_AWR 24,429.0 SYS.I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST INDEX
NON_AWR 16,192.0 SYS.I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST INDEX
NON_AWR 12,500.0 SYS.I_WRI$_OPTSTAT_HH_ST INDEX
NON_AWR 6,884.0 SYS.I_WRI$_OPTSTAT_H_ST INDEX
......
--------#########################################################
這個時候雖然刪除了數據,但空間還沒有回收,如何回收空間呢?
沒有釋放空間是因為“purge_stats”用delete的方式刪除數據,雖然數據沒了,但是HWM還沒降下來,查看OPTSTAT使用哪些表,然后降低其高水位即可。
SQL> SELECT s.object_name from dba_objects s where s.object_name like '%OPTSTAT%' and s.object_type='TABLE';
再結合如下sql判斷哪個表大,然后就move哪個表
SQL> select a.table_name,a.num_rows from dba_tables a where a.tablespace_name='SYSAUX' and a.table_name like '%OPTSTAT%';
再用如下語句查出相關表的索引,因為move表,索引會失效,需要重建索引
SQL> select i.index_name,i.table_name,i.status,i.table_owner
from dba_indexes i,dba_objects s
where i.table_name=s.object_name
and s.object_name like '%OPTSTAT%'
and s.object_type='TABLE';
降低HWM
alter table WRI$_OPTSTAT_TAB_HISTORY move;
alter table WRI$_OPTSTAT_OPR move;
alter table WRI$_OPTSTAT_IND_HISTORY move;
重建索引
alter index I_WRI$_OPTSTAT_TAB_OBJ#_ST rebuild online;
alter index I_WRI$_OPTSTAT_TAB_ST rebuild online;
alter index I_WRI$_OPTSTAT_IND_OBJ#_ST rebuild online;
如果索引rebuild不成功,就要create index
用如下語句生成DDL語句
SQL> set long 4000
SQL> select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_IND_OBJ#_ST','SYS') from dual;
參考文檔:[ID 329984.1], [ID 452011.1],[ID 454678.1]