sysaux表空间爆满,`WRH$_ACTIVE_SESSION_HISTORY`表无限制增长-问题记录

环境:oracle11g

现象

如标题所述,sysaux表空间爆满,而其中主要空间占用时WRH$_ACTIVE_SESSION_HISTORY

处理

先说最后怎么处理方法,因为知道这个表存放的是性能诊断用到的数据,相对没有很重要,所以直接截断掉

复制代码
TRUNCATE TABLE WRH$_ACTIVE_SESSION_HISTORY;

这个方法肯定是过于简单粗暴,如果有大佬看完后面的原因分析,有更好的办法,拜谢指点

why

任何事有问题,都要追问一句,正常应该是什么样,这个表的自动清理策略用下面sql可以查看:

复制代码
SELECT * FROM dba_hist_wr_control;
DBID SNAP_INTERVAL RETENTION TOPNSQL
3187213348.00 +00000 01:00:00.0 +00008 00:00:00.0 DEFAULT

其中RETENTION,说明数据保留最近8天的

实际上呢?

复制代码
SELECT min(sample_time) FROM sys.WRH$_ACTIVE_SESSION_HISTORY;

最老的记录都追溯到22年了。自动清理机制完全失效。这时我去问ai,清理机制的实现机制是什么,其实也简单:

后台进程 (MMON) 会定期将这张表"切分(Split)"成多个小分区(比如按天或按快照 ID 范围切分)。当某个分区里的所有快照 都超过了 8 天(你的保留策略),Oracle 就会直接执行 DROP PARTITION,把整个分区连同空间一起瞬间删掉。

然后我去看看现在的分区情况,直接破案:

复制代码
SELECT partition_name, high_value 
FROM dba_tab_partitions 
WHERE table_name = 'WRH$_ACTIVE_SESSION_HISTORY';
PARTITION_NAME HIGH_VALUE NUM_ROWS
WRH$_ACTIVE_3187213348_21486 3187213348, 50546 53806014.00
WRH$_ACTIVE_3187213348_50546 3187213348, MAXVALUE
WRH$_ACTIVE_SES_MXDB_MXSN MAXVALUE, MAXVALUE 0.00

规则是:只有当一个分区里所有的数据都过期了。现在所有数据都放到一个分区,当然没法做清理。

顺便一提,调用官方提供的清理sql,在这种情况也没有作用,只是delete,不释放空间

复制代码
BEGIN
  dbms_workload_repository.drop_snapshot_range(
    low_snap_id  => 1,      
    high_snap_id => 100     
  );
END;
/

变成这样原因已经不知道,ai给的猜测:

复制代码
你的系统由于某种原因(可能是某次表空间临时满了、系统 Bug 或索引失效),AWR 停止了自动创建新分区。