SYSAUX表空间突增主因是WRH$_系列快照表、AUD$/AUD$UNIFIED、SMON_SCN_TIME及LOGMNR相关段;应先查dba_segments定位Top 10对象,再依类型执行drop_snapshot_range、flush_awr、shrink space或dbms_audit_mgmt.clean_audit_trail等针对性清理。
SYSAUX表空间快涨,dba_segments里谁在占地方?
直接查占用大户,别猜。sysaux爆满通常不是均匀增长,而是某几个对象突然膨胀——最常见的是wrh$_系列快照表、sys.aud$(或audsys.aud$unified)、smon_scn_time,还有logmnr相关段(尤其开过逻辑复制或cdc)。
实操建议:
- 先跑:
SELECT owner, segment_name, segment_type, bytes/1024/1024 AS mb FROM dba_segments WHERE tablespace_name = 'SYSAUX' ORDER BY bytes DESC FETCH FIRST 10 ROWS ONLY;
- 重点盯
WRH$_ACTIVE_SESSION_HISTORY、WRH$_SQL_PLAN、AUD$、AUD$UNIFIED、SMON_SCN_TIME这几类名字 - 注意:12c+统一审计默认走
AUDSYS用户,但它的段仍物理存放在SYSAUX里,查时得看owner='AUDSYS'而非'SYS' - 如果看到
LOGMNRC_或LOGMNR_开头的段持续增长,说明LogMiner日志没清理,可能因未关闭补充日志或未调用DBMS_LOGMNR.END_LOGMNR
AWR快照删不掉?dbms_workload_repository.drop_snapshot_range执行没报错但空间不释放
这不是bug,是Oracle的“延迟清理”机制在起作用:快照元数据删了,但底层WRH$_表里的历史数据行还没被真正物理删除,需要后续的自动清理作业(MMON)或手动触发清理。
实操建议:
- 确认保留策略:
SELECT retention FROM dba_hist_wr_control;
如果返回86400(24小时),那旧快照本该自动删,但可能被锁住或作业卡住 - 手动清理前,先停掉自动任务:
EXEC dbms_scheduler.disable('GATHER_STATS_JOB');(非必须,但避免干扰) - 执行删除后,立刻运行:
EXEC dbms_workload_repository.flush_awr;
强制把内存中未写入的采样刷进磁盘并触发段收缩 - 最后做一次表分析:
EXEC dbms_stats.gather_table_stats('SYS','WRH$_ACTIVE_SESSION_HISTORY');帮优化器识别新空闲空间 - 关键点:
drop_snapshot_range只删元数据和索引条目,不直接TRUNCATE表;真要快速腾空间,可对单个大表执行ALTER TABLE ... SHRINK SPACE CASCADE(需行移动启用)
审计日志清不完?AUD$和AUD$UNIFIED清理方式完全不同
老式标准审计(AUD$)走DELETE语句,统一审计(AUD$UNIFIED)必须用DBMS_AUDIT_MGMT包,混用会失败或漏删。
实操建议:
- 先确认当前启用了哪种审计:
SELECT value FROM v$option WHERE parameter = 'Unified Auditing';
返回TRUE说明主用统一审计 - 如果是统一审计,必须初始化清理框架:
EXEC dbms_audit_mgmt.init_cleanup(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED);
否则clean_audit_trail会报ORA-46365 - 清理命令不是
DELETE FROM AUD$UNIFIED,而是:EXEC dbms_audit_mgmt.clean_audit_trail(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, use_last_arch_timestamp => FALSE);
- 注意
use_last_arch_timestamp设为FALSE才清全部;设为TRUE会依赖归档时间戳,而该时间戳默认不设,结果就是什么也不删 - 清理完记得压缩空间:
ALTER TABLE audsys.aud$unified SHRINK SPACE CASCADE;
(AUDSYS用户下操作)
清理后空间还是不还给OS?datafile没自动收缩
Oracle删数据只是标记块为空闲,不会自动把高水位线(HWM)往下拉,更不会自动缩小数据文件。SYSAUX文件体积不变,是常态,不是故障。
实操建议:
- 查当前数据文件大小和已用空间:
SELECT file_name, bytes/1024/1024 AS curr_mb, (bytes - user_bytes)/1024/1024 AS unused_mb FROM dba_data_files WHERE tablespace_name = 'SYSAUX';
- 如果
unused_mb很大,说明空间已在库内空闲,但文件没缩;想缩小文件,得先移动段降低HWM:ALTER DATABASE DATAFILE '/path/to/sysaux01.dbf' RESIZE 2000M;
—— 这步会报错ORA-03297如果HWM在2000M之后 - 安全缩容流程:先对最大几个段
SHRINK SPACE,再查dba_free_space确认连续空闲区足够,最后用RESIZE。别跳步骤 - 生产环境不建议盲目
RESIZE,尤其SYSAUX含系统对象,收缩失败可能导致实例异常;更稳妥的做法是重建SYSAUX表空间(需停机或滚动维护)
真正麻烦的从来不是“怎么删”,而是删完发现WRH$_表刚 shrink 完,第二天又涨回去了——说明AWR采样频率太高、或SQL执行计划捕获太全;得回头调MODIFY_SNAPSHOT_SETTINGS,而不是反复手动删。










