必须先确认审计类型再清理:统一审计用DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP+CLEAN_AUDIT_TRAIL,传统审计用对应参数;清理后需FLUSH_UNIFIED_AUDIT_TRAIL或SHRINK SPACE释放空间,且须预先INIT_CLEANUP并授权。

不能直接 TRUNCATE 或 DELETE 审计表,尤其在 12c+ 统一审计启用后 —— AUD$UNIFIED 表受保护,硬删会报 ORA-46385;传统审计的 AUD$ 虽可截断,但不设归档时间戳就清理,可能违反合规要求。
先确认你用的是传统审计还是统一审计
执行这两条 SQL,顺序不能错:
SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';
返回 TRUE → 统一审计;返回 FALSE → 传统审计(或未启用统一审计)。
再补查一句(兼容性更强):
SELECT TABLE_NAME, TABLESPACE_NAME FROM DBA_TABLES WHERE TABLE_NAME IN ('AUD$', 'UNIFIED_AUDIT_TRAIL');- 若只有
AUD$且在SYSAUX,走传统审计路径 - 若只有
UNIFIED_AUDIT_TRAIL或两者都有,且UNIFIED_AUDIT_TRAIL有大量数据 → 统一审计为主 -
AUD$在SYSTEM表空间?那是历史遗留问题,得先迁到SYSAUX再清理,否则清理后空间仍卡在SYSTEM
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL 必须配对使用 SET_LAST_ARCHIVE_TIMESTAMP
这是最容易翻车的环节:单独执行 CLEAN_AUDIT_TRAIL 并设 use_last_arch_timestamp => TRUE,但没提前打时间戳,它什么也不删。
正确操作顺序是:
- 先设定保留策略(比如保留最近 365 天):
BEGIN<br> DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP(<br> audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,<br> last_archive_time => SYSTIMESTAMP - 365<br> );<br>END;<br>/
- 再执行清理:
BEGIN<br> DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL(<br> audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,<br> use_last_arch_timestamp => TRUE<br> );<br>END;<br>/
- 注意:对传统审计,
audit_trail_type改为DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD
use_last_arch_timestamp => FALSE 是危险模式:删所有记录,没有回滚,不建议生产环境用。
清理完空间不释放?要手动回收段空间
CLEAN_AUDIT_TRAIL 只删数据行,不收缩段。你查 DBA_SEGMENTS 会发现 UNIFIED_AUDIT_TRAIL 或 AUD$ 的 BYTES 没变。
必须追加两步:
- 如果是统一审计(
AUDSYS.UNIFIED_AUDIT_TRAIL):
该表属于AUDSYSschema,不能直接ALTER TABLE ... SHRINK SPACE,需用:BEGIN<br> DBMS_AUDIT_MGMT.FLUSH_UNIFIED_AUDIT_TRAIL;<br>END;<br>/
(强制刷内存中未落盘的审计记录,避免残留) - 如果是传统审计(
SYS.AUD$):ALTER TABLE SYS.AUD$ SHRINK SPACE CASCADE;
如果报错不支持压缩(如表含LOB字段),改用:ALTER TABLE SYS.AUD$ DEALLOCATE UNUSED KEEP 10M;
最后验证:SELECT SEGMENT_NAME, BYTES/1024/1024 FROM DBA_SEGMENTS WHERE SEGMENT_NAME IN ('AUD$', 'UNIFIED_AUDIT_TRAIL');
别忽略初始化和权限检查
首次使用 DBMS_AUDIT_MGMT 前,必须运行初始化(否则 SET_LAST_ARCHIVE_TIMESTAMP 会失败):
BEGIN<br> DBMS_AUDIT_MGMT.INIT_CLEANUP(<br> audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,<br> default_cleanup_interval => 24<br> );<br>END;<br>/
还要确认当前用户有权限:
-
EXECUTE权限在DBMS_AUDIT_MGMT包上(通常SYS或已授AUDIT_ADMIN角色) - 查询
DBA_AUDIT_MGMT_CONFIG_PARAMS确认配置是否生效 - 检查
DBA_AUDIT_MGMT_LAST_ARCH_TS是否已写入时间戳
真正麻烦的从来不是命令怎么写,而是“删哪些”由合规周期定、“删完缩不缩”取决于表结构、“删了有没有残留”要看 FLUSH 和 SHRINK 是否到位 —— 少一步,SYSAUX 就还在告警线上挂着。


















