您的位置:首页 > 其它

SYSAUX 表空间历史统计数据过大的处理办法—--范例篇

2016-06-22 16:25 429 查看
【INTRO】

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不会降下来的。这时要手工处理。

【STEP BY STEP】

STEP1:>>清理SYSAUX下的历史统计信息
1)将历史统计信息保留时间设为无限:
exec dbms_stats.alter_stats_history_retention(-1);

2)truncate较大的TABLE:

truncate table sys.WRI$_OPTSTAT_HISTHEAD_HISTORY;

truncate table sys.WRI$_OPTSTAT_HISTGRM_HISTORY;

3)清理历史统计信息

exec dbms_stats.purge_stats(sysdate-101);

exec dbms_stats.purge_stats(sysdate-51);

exec dbms_stats.purge_stats(sysdate-5);

4)将历史统计信息保留时间设为10天

exec dbms_stats.alter_stats_history_retention(10);

5)将历史统计信息相关的表进行MOVE,并重建索引

alter table sys.WRI$_OPTSTAT_HISTHEAD_HISTORY move tablespace sysaux;

alter index sys.I_WRI$_OPTSTAT_HH_OBJ_ICOL_ST rebuild online;

alter index sys.I_WRI$_OPTSTAT_HH_ST rebuild online;

alter table sys.WRI$_OPTSTAT_HISTGRM_HISTORY move tablespace sysaux;

alter index sys.I_WRI$_OPTSTAT_H_OBJ#_ICOL#_ST rebuild online;

alter index sys.I_WRI$_OPTSTAT_H_ST rebuild online;

alter table sys.WRI$_OPTSTAT_IND_HISTORY move tablespace sysaux;

alter index sys.I_WRI$_OPTSTAT_IND_OBJ#_ST rebuild online;

alter index sys.I_WRI$_OPTSTAT_IND_ST rebuild online;

alter table sys.WRI$_OPTSTAT_TAB_HISTORY move tablespace sysaux;

alter index sys.I_WRI$_OPTSTAT_TAB_OBJ#_ST rebuild online;

alter index sys.I_WRI$_OPTSTAT_TAB_ST rebuild online;

ALTER TABLE SYS.WRI$_OPTSTAT_OPR MOVE TABLESPACE SYSAUX;

ALTER TABLE SYS.WRI$_OPTSTAT_AUX_HISTORY MOVE TABLESPACE SYSAUX;

ALTER INDEX SYS.I_WRI$_OPTSTAT_AUX_ST REBUILD ONLINE;

ALTER INDEX SYS.I_WRI$_OPTSTAT_OPR_STIME REBUILD ONLINE;

6)对MOVE表的统计信息进行收集

EXEC dbms_stats.gather_table_stats(ownname => ‘SYS’,tabname => ‘WRI$_OPTSTAT_HISTHEAD_HISTORY’,cascade => TRUE);

EXEC dbms_stats.gather_table_stats(ownname => ‘SYS’,tabname => ‘WRI$_OPTSTAT_HISTGRM_HISTORY’,cascade => TRUE);

EXEC dbms_stats.gather_table_stats(ownname => ‘SYS’,tabname => ‘WRI$_OPTSTAT_IND_HISTORY’,cascade => TRUE);

EXEC dbms_stats.gather_table_stats(ownname => ‘SYS’,tabname => ‘WRI$_OPTSTAT_TAB_HISTORY’,cascade => TRUE);

EXEC dbms_stats.gather_table_stats(ownname => ‘SYS’,tabname => ‘WRI$_OPTSTAT_OPR’,cascade => TRUE);

EXEC dbms_stats.gather_table_stats(ownname => ‘SYS’,tabname => ‘WRI$_OPTSTAT_AUX_HISTORY’,cascade => TRUE);

STEP2>> 清理SYAUX下的无效ASH信息

1)检查是否有无效的ASH信息

select count(*) from sys.wrh$_active_session_history a where not exists (select 1

from sys.wrm$_snapshot b where a.snap_id = b.snap_id and a.dbid = b.dbid and a.instance_number = b.instance_number);

2)清理无效的ASH信息

Delete from sys.wrh$_active_session_history a where not exists (select 1 from sys.wrm$_snapshot b where a.snap_id = b.snap_id and a.dbid = b.dbid and a.instance_number = b.instance_number);

3)对ASH表清理后的碎片整理

alter table sys.wrh$_active_session_history enable row movement;

alter table sys.wrh$_active_session_history shrink space cascade;

alter table sys.wrh$_active_session_history disable row movement;

4)收集碎片整理后表的统计信息

EXEC dbms_stats.gather_table_stats(ownname => ‘SYS’,tabname => ‘WRH$_ACTIVE_SESSION_HISTORY’,cascade => TRUE);

3)检查表空间可收缩的的位置

select a.FILE#,a.NAME,a.BYTES / 1024 / 1024 mb,ceil(HWM * A.BLOCK_SIZE) / 1024 / 1024 RESIZETO,‘ALTER DATABASE DATAFILE ”’ || A.NAME || ”’ RESIZE ‘ ||(trunc(CEIL(HWM * A.BLOCK_SIZE) / 1024 / 1024)+20) || ‘M;’ RESIZECMD from v$datafile a,(SELECT C.file_id, MAX(C.block_id
+ C.blocks – 1) HWM

FROM DBA_EXTENTS C GROUP BY FILE_ID) B WHERE A.FILE# = B.FILE_ID AND a.tablespace=’SYSAUX’ORDER BY 5;

STEP3>> SYSAUX清理后的检查

1)清理后的无效INDEX检查

select * from dba_indexes where status<>‘VALID’ AND STATUS<>‘N/A’;

SELECT * FROM DBA_IND_PARTITIONS WHERE STATUS<>‘USABLE’ AND STATUS<>‘N/A’;

SELECT * FROM DBA_IND_SUBPARTITIONS WHERE STATUS<>‘USABLE’;

上面语句应均无数据返回,如有则对这些INDEX进行重建

2)清理后的INDEX并行度检查

select * from dba_indexes where degree not in (‘1’,’0’,’DEFAULT’);

至此,SYSAUX表空间OPTSTAT数据量过大清理完毕。

参考资料: METALINK doc 287679.1 http://pingshx.itpub.net/post/39434/500045 http://www.vmcd.org/2011/10/sysaux-%e8%a1%a8%e7%a9%ba%e9%97%b4%e9%97%ae%e9%a2%98%e8%a7%a3%e5%86%b3/

E.O.F

2012-08-25
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: