awr快照清理失败主因是drop_snapshot_range仅标记元数据、不触发物理删除,须配合flush_awr强制mmon收缩段或直接truncate旧分区释放空间。
awr快照清理失败,八成不是命令没执行,而是清理动作根本没落地——dbms_workload_repository.drop_snapshot_range只删元数据,不碰底层数据行;空间不释放、新快照写不进、ora-1688反复报,都是这个机制在“背锅”。
查WRH$表真实占用:别信dba_free_space,要看dba_segments
SYSAUX显示还有15%空闲?别信。Oracle的自动清理卡住时,空间碎片化严重,dba_free_space反映的是空闲区段,不是可分配连续空间。真正吃掉空间的是WRH$_开头的分区表,尤其是WRH$_ACTIVE_SESSION_HISTORY这种动辄几十GB的主犯。
- 必须跑:
SELECT segment_name, bytes/1024/1024/1024 AS gb FROM dba_segments WHERE tablespace_name = 'SYSAUX' AND segment_name LIKE 'WRH$_%' ORDER BY bytes DESC FETCH FIRST 5 ROWS ONLY - 重点关注
WRH$_ACTIVE_SESSION_HISTORY、WRH$_SQL_PLAN、WRH$_EVENT_HISTOGRAM三类——它们占了AWR空间的70%以上 - 如果
WRH$_ACTIVE_SESSION_HISTORY单表超20GB,基本可以判定MMON的自动清理已滞后或失效
drop_snapshot_range后空间不降?立刻补flush_awr
dbms_workload_repository.drop_snapshot_range只是标记快照为“可删”,不触发物理清理。Oracle把实际收缩交给后台进程MMON,但它每小时才跑一次,且可能被锁阻塞。不手动推一把,空间就一直挂着。
- 删完快照后,必须立刻执行:
EXEC dbms_workload_repository.flush_awr - 这会强制MMON立即扫描并收缩
WRH$_表的段,是释放空间的关键一步 - 若
flush_awr执行缓慢或超时,说明有长事务正往WRH$_表写入(比如另一个MMON子进程卡在ASH采集),此时不能硬等,得切到分区级操作
TRUNCATE PARTITION比drop_snapshot_range更直接有效
当WRH$_ACTIVE_SESSION_HISTORY膨胀到无法靠flush_awr快速回收时,分区截断是最稳的应急手段。它绕过所有元数据清理逻辑,直接清空物理分区,秒级释放空间。
- 先查分区:
SELECT partition_name, high_value FROM dba_tab_partitions WHERE table_name = 'WRH$_ACTIVE_SESSION_HISTORY' ORDER BY partition_position DESC FETCH FIRST 3 ROWS ONLY - 选最老的非当前分区(如
WRH$_ACTIVE_1154052622_0),执行:ALTER TABLE wrh$_active_session_history TRUNCATE PARTITION WRH$_ACTIVE_1154052622_0 - 注意:不能截断
WRH$_ACTIVE_SES_MXDB_MXSN这类系统管理分区,否则可能破坏AWR完整性 - 截断后无需
SHRINK SPACE,但建议后续对索引做ALTER INDEX ... REBUILD ONLINE防性能衰减
为什么19c里SM/ADVISOR和AUDSYS也得一起盯
19c默认开启SQL调优集(ASTS)和统一审计,这两块在v$sysaux_occupants里常排前二。它们和AWR共享同一套清理机制,一旦其中一个组件卡住,整个SYSAUX的自动维护链路就容易雪崩。
-
SM/ADVISOR占大头?很可能是WRI$_SQLSET_PLAN_LINES这类LOB表失控,需用DBMS_SQLTUNE.DROP_SQLSET清理调优集 -
AUDSYS异常增长?别查AUD$,要查AUDSYS.AUD$UNIFIED,并确认是否启用了DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL - 19.8起
SM/ADVISOR默认关闭,但如果数据库是从19.7升级上来,旧配置仍生效,得手动禁用:EXEC DBMS_ADVISOR.SET_DEFAULT_TASK_PARAMETER('AUTO_TASK', 'ENABLED', 'FALSE')
真正难的不是执行哪条命令,而是判断该信哪个视图、该停哪个自动任务、该截哪个分区——v$sysaux_occupants告诉你谁在占地方,dba_segments告诉你占了多少,而dba_tab_partitions才是你动手时真正要瞄准的靶子。











