背景
经历了一次“oracle sysaux表空间异常爆满”,当时查资料几种解决思路,在此做个汇总方便后续查看。不严谨的地方欢迎大家指正
问题介绍
- sysaux表空间中占用空间的组件
set line 800
col occupant_name for a30
col occupant_desc for a60
select occupant_name,occupant_desc,space_usage_kbytes/1024 usage_mb
from v$sysaux_occupants order by space_usage_kbytes desc;
occupant_name occupant_desc usage_mb
------------------------------ ------------------------------------------------------------ ----------
sm/optstat -->优化器统计信息 server manageability - optimizer statistics history 23922.25
- sysaux 表空间
表空间名 表空间大小(m) 已使用空间(m) 使用比 空闲空间(m) 最大块(m)
------------------------------ ------------- ------------- -------- ----------- ----------
sysaux 32720 32673.31 99.86% 46.69
由此可以看到sm/optstat组件占比 sysaux 空间:73%
sm/optstat简介
sm/optstat是用于存储老的统计信息。
(1)10g之前,当对表/字段/索引做了相应的统计信息之后,新的统计信息就会覆盖老的统计信息,也就是说的无法直接找回统计信息,要找回,只能事先通过dbms_stats导出来。
(2)10g之后,就不必了,它会自动的存到相应的表里,而这些表是存在sysaux的,但这也引出了一个问题:如果这些表的数据不断的增长,而不把老的数据删除的话,sysaux迟早会被撑爆。
默认的情况下,系统会为sm/optstat保留31天的记录,可以通过dbms_stats.get_stats_history_retention 来确定。
sql> select dbms_stats.get_stats_history_retention from dual;
get_stats_history_retention
---------------------------
31
sm/optstat保留的时间可以通过dbms_stats.alter_stats_history_retention来控制。
-- 将历史统计信息保留时间设为无限:
sql> exec dbms_stats.alter_stats_history_retention(-1);
-- 将历史统计信息保留时间设为7天
sql> exec dbms_stats.alter_stats_history_retention(7);
-- 查看历史统计信息保留时间
sql> select dbms_stats.get_stats_history_availability from dual;
get_stats_history_availability
---------------------------------------------------------------------------
04-nov-22 10.00.07.354209000 pm 08:00
如果sm/optstat确实占用了比较多的空间,要删除某个时间前的记录可以用:dbms_stats.purge_stats
-- 清理3天前的历史统计信息
sql> exec dbms_stats.purge_stats(sysdate-3);
pl/sql procedure successfully completed.
这个sp其实只从存储历史统计信息的表里删除记录,这样的话,就会出现一种情况,删除了大量的数据,但这些表占用的空间并没有释放,也就是hwm不会降下来的。这时要手工处理
处理方案
方案一:来自(文档 id 1055547.1)的方案:
- 涉及的表
- 原因
- 解决
方案二:直接truncate 表
- 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、清理历史统计信息(清理7天前的信息)
exec dbms_stats.purge_stats(sysdate-7);
- 4、将历史统计信息保留时间设为7天(默认31天)
exec dbms_stats.alter_stats_history_retention(7);
- 5、避免有其它问题,执行一次数据库的收集任务:
sql> exec dbms_stats.gather_database_stats_job_proc();
pl/sql procedure successfully completed.
方案三:move table 达到清理碎片的目地
- 将表move 到users表空间
sql> alter table wri$_optstat_histhead_history move tablespace users;
-- lob 字段字段需要单独move
sql> alter table wri$_optstat_histhead_history move tablespace users lob (expression) store as lobsegment (tablespace users);
sql> alter index i_wri$_optstat_hh_obj_icol_st rebuild online;
sql> alter index i_wri$_optstat_hh_st rebuild online;
- 重新将表move 回原空间:sysaux
sql> alter table wri$_optstat_histhead_history move tablespace sysaux;
sql> alter table wri$_optstat_histhead_history move tablespace sysaux lob (expression) store as lobsegment (tablespace sysaux);
sql> alter index i_wri$_optstat_hh_obj_icol_st rebuild online;
sql> alter index i_wri$_optstat_hh_st rebuild online;
方案四:重创建表
- 根据create table as 创建一张指定范围内的表备做备份,truncate 表后再重新导入
sql> create table wri$_optstat_histgrm_history_b as select * from wri$_optstat_histgrm_history where to_char(savtime,'yyyy-mm-dd')>'2022-11-09';
sql> truncate table wri$_optstat_histgrm_history ;
sql> insert into wri$_optstat_histgrm_history select * from wri$_optstat_histgrm_history_b;
sql> commit;
sql> drop table wri$_optstat_histgrm_history_b purge;
总结:
- 不一定是全的,但应该有一款适合你!
文章推荐
– 故障
《oracle_索引重建—优化索引碎片》
《oracle 自动收集统计信息机制》
《dba_tab_modifications表的刷新策略测试》
《fy_recover_data.dbf》
《oracle rac 集群迁移文件操作.pdf》
《oracle date 字段索引使用测试.dbf》
《oracle 诊断案例 :因应用死循环导致的cpu过高》
《记录一起索引rebuild与收集统计信息的事故》
《rac dg删除备库redo时报ora-01623》
《问答榜上引发的oracle并行的探究(一)》
《问答榜上引发的oracle并行的探究(二)》
《dg 同步延迟之奇怪的经典报错:ora-16191》
– 等待事件
《log file sync》 等待事件问题分析汇总
《ash报告发现:os thread startup 等待事件分析》
– 监控&脚本
《dg standby time 监控脚本部署》
《oracle 慢sql监控脚本》
《oracle 慢sql监控测试及监控脚本.pdf》
《oracle 监控表空间脚本 每月10号0点至06点不报警》
《oracle 脚本实现简单的审计功能》
– 安装系列
《oracle_19c_linux安装.pdf》
《oracle 19c-手工建库.pdf》
《19c单库升级19.11补丁.pdf》
《19c_rac补丁《19.11-p32841500》.pdf 》
《oracle_图形-单实例11.2.0.4升级19.3.pdf》
《oracle_11.2.0.3升级11.2.0.4–单实例升级.pdf》
《oracle_静默-单实例 11.2.0.4升级19.3.pdf》
《centos_6.7系统一步一步 rac 11.2.0.4升级19.3.pdf》
《整理后_rac_11.2.0.4升级19c.pdf》
欢迎赞赏支持或留言指正