aud$审计表长期未清理导致system表空间暴涨,应使用dbms_audit_mgmt官方包初始化、设归档时间、执行清理,并将aud$迁移至非system表空间,同时检查login_history、dba_scheduler_job_log等潜在膨胀对象。

SYSTEM表空间异常暴涨,90%以上是AUD$审计表在撑,不是配置错、也不是SQL写得烂,而是审计记录日积月累没管。直接TRUNCATE TABLE aud$或加数据文件是临时止痛,不解决根本问题,还可能引发ORA-00600或阻塞新审计写入。
查清是不是AUD$在占坑
别猜,用最直白的语句看前几大的段:
SELECT owner, segment_name, bytes/1024/1024 MB FROM dba_segments WHERE tablespace_name = 'SYSTEM' ORDER BY bytes DESC;
如果第一行就是AUD$(且OWNER是SYS),基本不用往下看了。再确认审计是否真开着:
SHOW PARAMETER audit_trail;
返回DB或DB, EXTENDED就是它;返回NONE或FALSE可跳过清理AUD$这步。
顺手检查有没有误建的用户对象:
SELECT owner, segment_name
FROM dba_segments
WHERE tablespace_name = 'SYSTEM'
AND owner NOT IN ('SYS', 'SYSTEM');
如果有非系统用户出现在结果里,说明有人建表没指定表空间,得立刻改默认表空间并迁移对象。
用DBMS_AUDIT_MGMT清理,别TRUNCATE
硬TRUNCATE TABLE aud$会锁表、阻塞新审计写入,Oracle 11gR2起就该走官方路径:
- 先初始化(只做一次):
BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD); END;
若报ORA-46262,说明没初始化,必须先跑这句 - 设保留窗口(比如只留90天):
EXEC DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, last_archive_time => SYSTIMESTAMP - 90)
- 真正执行清理:
EXEC DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, cleanup_only => TRUE)
清理完不等于空间回收——AUD$表本身还在SYSTEM里,得手动挪走:
ALTER TABLE aud$ MOVE TABLESPACE users; ALTER TABLE aud$ SHRINK SPACE;
注意:执行SHRINK SPACE前需确保已启用行移动:ALTER TABLE aud$ ENABLE ROW MOVEMENT;
检查DBA_SCHEDULER_JOB_LOG是否也在SYSTEM里膨胀
调度任务日志默认写进SYSAUX,但某些老版本或自定义配置下,DBA_SCHEDULER_JOB_LOG的基表或索引可能意外落在SYSTEM。虽然少见,但一旦发生,增长速度不亚于AUD$:
查位置:
SELECT owner, segment_name, tablespace_name
FROM dba_segments
WHERE segment_name IN ('JOB_LOG', 'SCHEDULER$_JOB_LOG')
AND owner = 'SYS';
如果tablespace_name是SYSTEM,说明配置异常。应通过DBMS_SCHEDULER相关过程迁移,或重建调度日志表空间绑定关系。不能直接DROP或MOVE这些对象,否则可能破坏调度器元数据一致性。
别漏掉LOGIN_HISTORY这类“影子审计表”
Oracle 12c+引入的LOGIN_HISTORY表也常驻SYSTEM,尤其在启用了UNIFIED_AUDIT_TRAIL但未迁移审计存储时。它不像AUD$有官方清理包,得靠手动归档+截断:
- 查大小:
SELECT segment_name, bytes/1024/1024 MB FROM dba_segments WHERE segment_name = 'LOGIN_HISTORY' AND tablespace_name = 'SYSTEM';
- 归档旧记录(建议先备份):
CREATE TABLE login_history_arch AS SELECT * FROM login_history WHERE logon_time
- 删旧数据:
DELETE FROM login_history WHERE logon_time (注意:需在维护窗口执行,避免长事务)
- 收缩空间:
ALTER TABLE login_history ENABLE ROW MOVEMENT; ALTER TABLE login_history SHRINK SPACE;
复杂点在于:这些表没有自动归档机制,也没有DBMS_AUDIT_MGMT那样的生命周期管理接口,一旦被忽略,几年后体积可能反超AUD$。最容易被忽略的是它不显眼——不会出现在v$sysaux_occupants里,也不在常规审计检查清单中。











