环境: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 停止了自动创建新分区。