sysaux表空间满与空间回收

Oracle10中表空间SYSAUX引入,oracle把统计信息存储在这里,这也是为了更好的优化system表空间,oracle的SM/AWR, SM/ADVISOR, SM/OPTSTAT,SM/OTHER的统计信息都存储在SYSAUX中。

查询SYSAUX表空间内各个分类项目占存储空间的比重:

SELECT occupant_name"Item",
 round(space_usage_kbytes/1024/1024,3)"Space Used (GB)",
 schema_name "Schema",
 move_procedure "MoveProcedure"
 FROM v$sysaux_occupants
 ORDER BY 2 Desc;

可以看到SM/OPTSTAT占了大部分空间。

SM/OPTSTAT:用于存储老版本的优化统计信息,在oracle10g中,在我们手动或自动更新统计信息使oracle选择了错误的执行计划。oracle10g是可以恢复旧版本的统计信息,这个统计信息默认保存31天

查询当前SM/OPTSTAT的统计信息的保存时间:

select dbms_stats.get_stats_history_retention from dual;

修改SM/OPTSTAT的统计信息的保存时间为10天:

exec dbms_stats.alter_stats_history_retention(10);

查看当前有效的统计数据是到什么时间的:

select DBMS_STATS.GET_STATS_HISTORY_AVAILABILITY from dual;

删除7天前的统计数据:

exec dbms_stats.purge_stats(sysdate-7);

这个时候虽然删除了数据,但空间还没有回收,如何回收空间呢?没有释放空间是因为“purge_stats”用delete的方式删除数据,虽然数据没了,但是HWM还没降下来,查看OPTSTAT使用哪些表,然后降低其高水位即可。

SELECT s.object_name from dba_objects s where s.object_name like '%OPTSTAT%' and s.object_type='TABLE'

再结合如下sql判断哪个表大,然后就move哪个表

select a.table_name,a.num_rows from dba_tables a where a.tablespace_name='SYSAUX' and a.table_name like '%OPTSTAT%'

再用如下语句查出相关表的索引,因为move表,索引会失效,需要重建索引

select i.index_name,i.table_name,i.status,i.table_owner
2 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 @TABLE_NAME move;#把@TABLE_NAME改为需要move的表

重建索引

alter index @INDEX_NAME rebuild online;#把@INDEX_NAME改为上步表关联的索引

如果索引编译不成功,就要create indexe
用如下语句生成DDL语句

set long 4000
select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_IND_OBJ#_ST','SYS') from dual;
select dbms_metadata.get_ddl('INDEX','I_WRI$_OPTSTAT_TAB_ST','SYS') from dual;

参考:

http://blog.sina.com.cn/s/blog_b56640170102xbj6.html

https://blog.51cto.com/dingren/1177052

https://www.cnblogs.com/husam/p/6604437.html

https://blog.csdn.net/robinson1988/article/details/5868742

发布了120 篇原创文章 · 获赞 561 · 访问量 52万+

猜你喜欢

转载自blog.csdn.net/yuan1164345228/article/details/105654260