查看sysaux表空間使用排行
select SEGMENT_NAME,BYTES/1024/1024/1024 DGD from dba_segments where tablespace_name='SYSAUX' ORDER BY DGD DESC;
I_WRI$_OPTSTAT_H_ST
WRI$_OPTSTAT_HISTGRM_HISTORY
I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST
這問題是由最近一個數據庫SYSAUX使用空間過多引出來的.
SM/OPTSTAT是用於存儲老的統計信息,10G之前,當對表/字段/索引做了相應的統計信息之后,新的統計信息就會覆蓋老的統計信息,也就是說的無法直接找回統計信息,要找回,只能事先通過dbms_stats導出來。10G就不必了,它會自動的存到相應的表里,而這些表是存在sysaux的,但這也引出了一個問題:如果這些表的數據不斷的增長,而不把老的數據刪除的話,sysaux遲早會暴了的。默認的情況下,系統會為SM/OPTSTAT保留31天的記錄,可以通過dbms_stats.get_stats_history_retention來確定。這里的統計信息跟AWR是有區別的, AWR默認保留7天. SM/OPTSTAT保留的時間可以通過dbms_stats.alter_stats_history_retention來控制。如果SM/OPTSTAT確實占用了比較多的空間,要刪除某個時間前的記錄可以用:dbms_stats.purge_stats. 這個SP其實只從存儲歷史統計信息的表里刪除記錄,這樣的話,就會出現一種情況,刪除了大量的數據,但這些表占用的空間並沒有釋放,也就是HWM不會降下來的。這時要手工處理,順便說一下用於存儲SM/OPTSTAT相關信息的表是由腳$ORACLE_HOME/rdbms/admin/catost.sql來創建的.下面是測試:
SQL> show parameter sga_target
NAME TYPE VALUE
------------------------------------ ----------- ------------------------------
sga_target big integer 0
SQL> select dbms_stats.get_stats_history_availability from dual;
GET_STATS_HISTORY_AVAILABILITY
---------------------------------------------------------------------------
10-APR-10 11.15.35.339756000 PM -04:00
SQL> select dbms_stats.get_stats_history_retention from dual;
GET_STATS_HISTORY_RETENTION
---------------------------
31
SQL> select * from v$sysaux_occupants where occupant_name='SM/OPTSTAT';
OCCUPANT_NAME OCCUPANT_DESC SCHEMA_NAM MOVE_PROCE MOVE_PROCEDURE_DESC SPACE_USAGE_KBYTES
-------------- ---------------------------------------------------- ---------- ---------- ---------------------------------------- ------------------
SM/OPTSTAT Server Manageability - Optimizer Statistics History SYS *** MOVE PROCEDURE NOT APPLICABLE *** 68416
SQL> select sum(SPACE_USAGE_KBYTES) from v$sysaux_occupants;
SUM(SPACE_USAGE_KBYTES)
-----------------------
175168
SQL> select owner,segment_name,sum(bytes)/1024/1024 from dba_extents where segment_name in (
2 'WRI$_OPTSTAT_TAB_HISTORY','I_WRI$_OPTSTAT_TAB_OBJ#_ST','I_WRI$_OPTSTAT_TAB_ST','WRI$_OPTSTAT_IND_HISTORY','I_WRI$_OPTSTAT_IND_OBJ#_ST'
,'I_WRI$_OPTSTAT_IND_ST','WRI$_OPTSTAT_HISTHEAD_HISTORY','I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST','I_WRI$_OPTSTAT_HH_ST','WRI$_OPTSTAT_HISTGRM_HISTORY'
3 4 ,'I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST','I_WRI$_OPTSTAT_H_ST','WRI$_OPTSTAT_AUX_HISTORY','I_WRI$_OPTSTAT_AUX_ST','WRI$_OPTSTAT_OPR'
5 ,'I_WRI$_OPTSTAT_OPR_STIME','OPTSTAT_HIST_CONTROL$')
6 group by owner,segment_name
7 order by 3;
OWNER SEGMENT_NAME SUM(BYTES)/1024/1024
------------------------------ --------------------------------------------------------------------------------- --------------------
SYS OPTSTAT_HIST_CONTROL$ .015625
SYS WRI$_OPTSTAT_AUX_HISTORY .0625
SYS I_WRI$_OPTSTAT_AUX_ST .0625
SYS WRI$_OPTSTAT_OPR .0625
SYS I_WRI$_OPTSTAT_OPR_STIME .0625
SYS I_WRI$_OPTSTAT_IND_ST .1875
SYS I_WRI$_OPTSTAT_TAB_ST .1875
SYS I_WRI$_OPTSTAT_IND_OBJ#_ST .25
SYS I_WRI$_OPTSTAT_TAB_OBJ#_ST .3125
SYS WRI$_OPTSTAT_TAB_HISTORY .3125
SYS WRI$_OPTSTAT_IND_HISTORY .3125
SYS I_WRI$_OPTSTAT_HH_ST 2
SYS I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST 3
SYS WRI$_OPTSTAT_HISTHEAD_HISTORY 4
SYS I_WRI$_OPTSTAT_H_ST 13
SYS WRI$_OPTSTAT_HISTGRM_HISTORY 17
SYS I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST 26
17 rows selected.
從這里可以看出,總共使用了175M sysaux,其中SM/OPTSTAT占用68M.
SQL> exec dbms_stats.purge_stats(sysdate-1);
PL/SQL procedure successfully completed.
SQL> select dbms_stats.get_stats_history_availability from dual;
11-MAY-10 10.22.53.000000000 PM -04:00
把之前的歷史數據清空了.
SQL> select owner,segment_name,sum(bytes)/1024/1024 from dba_extents where segment_name in (
2 'WRI$_OPTSTAT_TAB_HISTORY','I_WRI$_OPTSTAT_TAB_OBJ#_ST','I_WRI$_OPTSTAT_TAB_ST','WRI$_OPTSTAT_IND_HISTORY','I_WRI$_OPTSTAT_IND_OBJ#_ST'
,'I_WRI$_OPTSTAT_IND_ST','WRI$_OPTSTAT_HISTHEAD_HISTORY','I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST','I_WRI$_OPTSTAT_HH_ST','WRI$_OPTSTAT_HISTGRM_HISTORY'
3 4 ,'I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST','I_WRI$_OPTSTAT_H_ST','WRI$_OPTSTAT_AUX_HISTORY','I_WRI$_OPTSTAT_AUX_ST','WRI$_OPTSTAT_OPR'
5 ,'I_WRI$_OPTSTAT_OPR_STIME','OPTSTAT_HIST_CONTROL$')
group by owner,segment_name
6 7 order by 3;
OWNER SEGMENT_NAME SUM(BYTES)/1024/1024
------------------------------ --------------------------------------------------------------------------------- --------------------
SYS OPTSTAT_HIST_CONTROL$ .015625
SYS WRI$_OPTSTAT_AUX_HISTORY .0625
SYS I_WRI$_OPTSTAT_AUX_ST .0625
SYS WRI$_OPTSTAT_OPR .0625
SYS I_WRI$_OPTSTAT_OPR_STIME .0625
SYS I_WRI$_OPTSTAT_IND_ST .1875
SYS I_WRI$_OPTSTAT_TAB_ST .1875
SYS I_WRI$_OPTSTAT_IND_OBJ#_ST .25
SYS I_WRI$_OPTSTAT_TAB_OBJ#_ST .3125
SYS WRI$_OPTSTAT_TAB_HISTORY .3125
SYS WRI$_OPTSTAT_IND_HISTORY .3125
SYS I_WRI$_OPTSTAT_HH_ST 2
SYS I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST 3
SYS WRI$_OPTSTAT_HISTHEAD_HISTORY 4
SYS I_WRI$_OPTSTAT_H_ST 13
SYS WRI$_OPTSTAT_HISTGRM_HISTORY 17
SYS I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST 26
17 rows selected.
SQL> select * from v$sysaux_occupants where occupant_name='SM/OPTSTAT';
OCCUPANT_NAME OCCUPANT_DESC SCHEMA_NAM MOVE_PROCE MOVE_PROCEDURE_DESC SPACE_USAGE_KBYTES
-------------- ---------------------------------------------------- ---------- ---------- ---------------------------------------- ------------------
SM/OPTSTAT Server Manageability - Optimizer Statistics History SYS *** MOVE PROCEDURE NOT APPLICABLE *** 68416
SQL> select sum(SPACE_USAGE_KBYTES) from v$sysaux_occupants;
SUM(SPACE_USAGE_KBYTES)
-----------------------
175168
這里可以看出purge完后,這些空間並沒有釋放.
SQL> show user
USER is "SYS"
SQL> alter table WRI$_OPTSTAT_HISTGRM_HISTORY shrink space;
alter table WRI$_OPTSTAT_HISTGRM_HISTORY shrink space
*
ERROR at line 1:
ORA-10631: SHRINK clause should not be specified for this object
SQL> alter table WRI$_OPTSTAT_HISTGRM_HISTORY enable row movement;
Table altered.
SQL> alter table WRI$_OPTSTAT_HISTGRM_HISTORY shrink space;
alter table WRI$_OPTSTAT_HISTGRM_HISTORY shrink space
*
ERROR at line 1:
ORA-10631: SHRINK clause should not be specified for this object
報這個錯誤的原因是由於這張表有函數索引:
SQL> select owner,index_name from dba_indexes where table_name='WRI$_OPTSTAT_HISTGRM_HISTORY';
SYS I_WRI$_OPTSTAT_H_ST
SYS I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST
SQL> select index_owner,index_name from dba_ind_expressions where table_name='WRI$_OPTSTAT_HISTGRM_HISTORY';
SYS I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST
SYS I_WRI$_OPTSTAT_H_ST
只能用move來降HWM了,做完這個操作,要對相應的index重建.
SQL> alter table WRI$_OPTSTAT_HISTGRM_HISTORY move;
Table altered.
SQL> alter index I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST rebuild online;
Index altered.
SQL> alter index I_WRI$_OPTSTAT_H_ST rebuild online;
Index altered.
SQL> select * from v$sysaux_occupants where occupant_name='SM/OPTSTAT';
OCCUPANT_NAME OCCUPANT_DESC SCHEMA_NAM MOVE_PROCE MOVE_PROCEDURE_DESC SPACE_USAGE_KBYTES
-------------- ---------------------------------------------------- ---------- ---------- ---------------------------------------- ------------------
SM/OPTSTAT Server Manageability - Optimizer Statistics History SYS *** MOVE PROCEDURE NOT APPLICABLE *** 12736
SQL> select sum(SPACE_USAGE_KBYTES) from v$sysaux_occupants;
SUM(SPACE_USAGE_KBYTES)
-----------------------
119488
SQL> select owner,segment_name,sum(bytes)/1024/1024 from dba_extents where segment_name in (
2 'WRI$_OPTSTAT_TAB_HISTORY','I_WRI$_OPTSTAT_TAB_OBJ#_ST','I_WRI$_OPTSTAT_TAB_ST','WRI$_OPTSTAT_IND_HISTORY','I_WRI$_OPTSTAT_IND_OBJ#_ST'
,'I_WRI$_OPTSTAT_IND_ST','WRI$_OPTSTAT_HISTHEAD_HISTORY','I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST','I_WRI$_OPTSTAT_HH_ST','WRI$_OPTSTAT_HISTGRM_HISTORY'
3 4 ,'I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST','I_WRI$_OPTSTAT_H_ST','WRI$_OPTSTAT_AUX_HISTORY','I_WRI$_OPTSTAT_AUX_ST','WRI$_OPTSTAT_OPR'
5 ,'I_WRI$_OPTSTAT_OPR_STIME','OPTSTAT_HIST_CONTROL$')
6 group by owner,segment_name
7 order by 3;
OWNER SEGMENT_NAME SUM(BYTES)/1024/1024
------------------------------ --------------------------------------------------------------------------------- --------------------
SYS OPTSTAT_HIST_CONTROL$ .015625
SYS WRI$_OPTSTAT_AUX_HISTORY .0625
SYS I_WRI$_OPTSTAT_OPR_STIME .0625
SYS I_WRI$_OPTSTAT_AUX_ST .0625
SYS WRI$_OPTSTAT_OPR .0625
SYS I_WRI$_OPTSTAT_IND_ST .1875
SYS I_WRI$_OPTSTAT_TAB_ST .1875
SYS I_WRI$_OPTSTAT_IND_OBJ#_ST .25
SYS I_WRI$_OPTSTAT_TAB_OBJ#_ST .3125
SYS WRI$_OPTSTAT_IND_HISTORY .3125
SYS WRI$_OPTSTAT_TAB_HISTORY .3125
SYS I_WRI$_OPTSTAT_H_ST .4375
SYS I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST .5625
SYS WRI$_OPTSTAT_HISTGRM_HISTORY .625
SYS I_WRI$_OPTSTAT_HH_ST 2
SYS I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST 3
SYS WRI$_OPTSTAT_HISTHEAD_HISTORY 4
17 rows selected.
從總體上看:sysaux釋放了56M, 這正是SM/OPTSTAT釋放出來的。測試時碰到一問題,當SGA是自動管理時,purge時會被MMON進程阻塞的。
部分轉載自:https://blog.csdn.net/wu_wei_jie/article/details/6331911?locationNum=13&fps=1