前边两篇文章我们测试了修改保留快照的时间、收缩索引空间等方法,但是效果不是太明显,视图、索引还是占用着大部分空间,
|
SQL> col SEGMENT_NAME for a30 SQL> set lines 999 SQL>
select * from (select
segment_name,PARTITION_NAME,segment_type,bytes/1024/1024 from
dba_segments where tablespace_name='SYSAUX' SEGMENT_NAME ------------------------------ ------------------------------ ------------------ --------------- WRH$_ACTIVE_SESSION_HISTORY I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST WRI$_OPTSTAT_HISTGRM_HISTORY I_WRI$_OPTSTAT_H_ST WRH$_ACTIVE_SESSION_HISTORY_PK
WRH$_ACTIVE_2065804525_25627 WRI$_OPTSTAT_HISTHEAD_HISTORY WRH$_SYSMETRIC_HISTORY I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST WRH$_SYSMETRIC_HISTORY_INDEX WRH$_EVENT_HISTOGRAM_PK |
查看了一下与统计信息相关的几个视图,发现记录还有一年之前的
|
SQL> select min(savtime),max(savtime) from WRI$_OPTSTAT_TAB_HISTORY; MIN(SAVTIME) --------------------------------------------------------------------------- MAX(SAVTIME) --------------------------------------------------------------------------- 26-MAY-13 09.01.04.793825 PM +08:00 25-DEC-13 10.42.55.676557 AM +08:00 SQL> select min(savtime),max(savtime) from WRI$_OPTSTAT_HISTGRM_HISTORY; MIN(SAVTIME) --------------------------------------------------------------------------- MAX(SAVTIME) --------------------------------------------------------------------------- 16-MAR-12 09.28.07.004180 PM +08:00 25-DEC-13 10.42.55.750147 AM +08:00 SQL> select min(savtime),max(savtime) from WRI$_OPTSTAT_HISTHEAD_HISTORY; MIN(SAVTIME) --------------------------------------------------------------------------- MAX(SAVTIME) --------------------------------------------------------------------------- 16-NOV-12 12.00.27.899822 AM +08:00 25-DEC-13 10.42.55.750147 AM +08:00 |
执行清除统计信息命令
|
SQL> exec dbms_stats.purge_stats(systimestamp - 500); PL/SQL procedure successfully completed. SQL> SQL> SQL> SQL> SQL> SQL> exec dbms_stats.purge_stats(systimestamp -300); PL/SQL procedure successfully completed. SQL> exec dbms_stats.purge_stats(systimestamp - 100); 。。。。。。。一直等啊等 |
通过上述方式呢,对于数据量较大的视图执行效果太缓慢,警告短暂挣扎,决定truncate
|
SQL> exec dbms_stats.alter_stats_history_retention(-1); PL/SQL procedure successfully completed. SQL> select dbms_stats.get_stats_history_retention from dual; GET_STATS_HISTORY_RETENTION --------------------------- SQL> truncate table sys.WRI$_OPTSTAT_HISTHEAD_HISTORY; Table truncated. SQL> truncate table sys.WRI$_OPTSTAT_HISTGRM_HISTORY; Table truncated. |
再次执行DBMS_STATS.PURGE_STATS清理就快多了
|
SQL> exec dbms_stats.purge_stats(sysdate-200); PL/SQL procedure successfully completed. SQL> exec dbms_stats.purge_stats(sysdate-100); PL/SQL procedure successfully completed. SQL> exec dbms_stats.purge_stats(sysdate-3); PL/SQL procedure successfully completed. SQL> exec dbms_stats.alter_stats_history_retention(3); PL/SQL procedure successfully completed. |
下面呢,就将跟统计相关的视图、索引进行整理,也就是move、rebuild,在分析一下
|
SQL> alter table sys.WRI$_OPTSTAT_HISTHEAD_HISTORY move tablespace sysaux; Table altered. SQL> alter index sys.I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST rebuild online; Index altered. SQL> alter index sys.I_WRI$_OPTSTAT_HH_ST rebuild online; Index altered. SQL>
alter table sys.WRI$_OPTSTAT_HISTGRM_HISTORY Table altered. SQL> alter index sys.I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST rebuild online; Index altered. SQL> alter index sys.I_WRI$_OPTSTAT_H_ST rebuild online; Index altered. SQL>
alter table sys.WRI$_OPTSTAT_IND_HISTORY Table altered. SQL> alter index sys.I_WRI$_OPTSTAT_IND_OBJ#_ST rebuild online; Index altered. SQL> alter index sys.I_WRI$_OPTSTAT_IND_ST rebuild online; Index altered. SQL>
alter table sys.WRI$_OPTSTAT_TAB_HISTORY Table altered. SQL> alter index sys.I_WRI$_OPTSTAT_TAB_OBJ#_ST rebuild online; Index altered. SQL> alter index sys.I_WRI$_OPTSTAT_TAB_ST rebuild online; Index altered. SQL> ALTER TABLE SYS.WRI$_OPTSTAT_OPR MOVE TABLESPACE SYSAUX; Table altered. SQL> ALTER TABLE SYS.WRI$_OPTSTAT_AUX_HISTORY MOVE TABLESPACE SYSAUX; Table altered. SQL> ALTER INDEX SYS.I_WRI$_OPTSTAT_AUX_ST REBUILD ONLINE; Index altered. SQL> ALTER INDEX SYS.I_WRI$_OPTSTAT_OPR_STIME REBUILD ONLINE; Index altered. SQL> EXEC dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'WRI$_OPTSTAT_HISTHEAD_HISTORY',cascade => TRUE); PL/SQL procedure successfully completed. SQL> EXEC dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'WRI$_OPTSTAT_HISTGRM_HISTORY',cascade => TRUE); PL/SQL procedure successfully completed. SQL> EXEC dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'WRI$_OPTSTAT_IND_HISTORY',cascade => TRUE); PL/SQL procedure successfully completed. SQL> EXEC dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'WRI$_OPTSTAT_TAB_HISTORY',cascade => TRUE); PL/SQL procedure successfully completed. SQL> EXEC dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'WRI$_OPTSTAT_OPR',cascade => TRUE); PL/SQL procedure successfully completed. SQL> EXEC dbms_stats.gather_table_stats(ownname => 'SYS',tabname => 'WRI$_OPTSTAT_AUX_HISTORY',cascade => TRUE); PL/SQL procedure successfully completed. |
待命令执行完成后,再次查看SYSAUX表空间空间详细使用状况,OPTSTAT表基本“消失”了,
|
SQL> col SEGMENT_NAME for a30 SQL> set lines 999 SQL>
select * from (select
segment_name,PARTITION_NAME,segment_type,bytes/1024/1024 from
dba_segments where tablespace_name='SYSAUX' SEGMENT_NAME ------------------------------ ------------------------------ ------------------ --------------- WRH$_ACTIVE_SESSION_HISTORY WRH$_ACTIVE_SESSION_HISTORY_PK
WRH$_ACTIVE_2065804525_25627 WRH$_SYSMETRIC_HISTORY WRH$_SYSMETRIC_HISTORY_INDEX WRH$_EVENT_HISTOGRAM_PK WRH$_EVENT_HISTOGRAM SYS_LOB0000006213C00038$$ WRH$_LATCH_MISSES_SUMMARY_PK WRH$_SQL_PLAN WRH$_LATCH_MISSES_SUMMARY |
乘胜追击,查看ASH相关视图中无效的数据,并delete掉
|
SQL> select count(*) ---------- SQL> delete 663769 rows deleted. |
查看wrh$_active_session_history分区情况时发现,占用数据空间最大的那个分区的数据应该为空才对啊,现在的快照只保留三天
|
---------- --------------------------------------------------------------------------- RETENTION --------------------------------------------------------------------------- ---------- 2065804525 +00000 01:00:00.0 +00003
00:00:00.0 |
好吧,直接将该分区truncate掉,其实该分区已没用,所有又drop了一下
|
SQL> alter table sys.wrh$_active_session_history truncate partition WRH$_ACTIVE_2065804525_25627 update global indexes; Table truncated. SQL> alter table sys.wrh$_active_session_history drop partition WRH$_ACTIVE_2065804525_25627 update global indexes; Table altered. |
再次查看SYSAUX表空间中数据分布情况
|
SQL> col SEGMENT_NAME for a30 SQL> set lines 999 SQL>
select * from (select
segment_name,PARTITION_NAME,segment_type,bytes/1024/1024 from
dba_segments where tablespace_name='SYSAUX' SEGMENT_NAME ------------------------------ ------------------------------ ------------------ --------------- WRH$_SYSMETRIC_HISTORY WRH$_SYSMETRIC_HISTORY_INDEX WRH$_EVENT_HISTOGRAM_PK WRH$_EVENT_HISTOGRAM SYS_LOB0000006213C00038$$ WRH$_LATCH_MISSES_SUMMARY_PK WRH$_SQL_PLAN WRH$_LATCH_MISSES_SUMMARY WRH$_ACTIVE_SESSION_HISTORY WRH$_SYSSTAT_PK |
查看表空间信息,SYSAUX已经倒数了
|
SQL> set pagesize 9999 SQL> set linesize 132 SQL> col TABLESPACE_NAME for a25 SQL> select TABLESPACE_NAME ------------------------- ---------- ---------- ---------- …………………….. SYSAUX ……… |
再查看一下有没有无效对象什么的:
|
SQL> select * from dba_indexes where status<>'VALID' AND STATUS<>'N/A'; no rows selected SQL> SELECT * FROM DBA_IND_PARTITIONS WHERE STATUS<>'USABLE' AND STATUS<>'N/A'; no rows selected SQL> SELECT * FROM DBA_IND_SUBPARTITIONS WHERE STATUS<>'USABLE'; no rows selected SQL> select * from dba_indexes where degree not in ('1','0','DEFAULT'); no rows selected |
后记:由于SYSAUX表空间下几个视图、索引数据量有点大,对于常规清除方法过于缓慢、效果更不明显,至于ASH中表WRH$_ACTIVE_SESSION_HISTORY怎么分区的,为什么过期数据没有自动清除,还需要观察一下,再跟踪几天看看。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/23524009/viewspace-1115955/ ,如需转载,请注明出处,否则将追究法律责任。