**环境**: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 停止了自动创建新分区。
```
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/70049647/viewspace-3112267/ ,如需转载,请注明出处,否则将追究法律责任。