DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL不生效的根本原因是清理策略未启用或配置错误,需先执行INIT_CLEANUP初始化并启用CLEANUP_OS_AUDIT_JOB调度作业,且统一审计必须指定AUDIT_TRAIL_UNIFIED类型。
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL 为什么总不生效
根本原因通常是清理策略没真正启用,或者启用了但时间窗口/条件不匹配。oracle 不会自动轮询执行清理,必须靠调度作业(dbms_scheduler)触发,而默认安装后这个作业是 disabled 状态。
- 检查作业是否启用:
SELECT job_name, enabled FROM dba_scheduler_jobs WHERE job_name = 'CLEANUP_OS_AUDIT_JOB'(注意:19c 默认作业名是这个,不是CLEANUP_AUDIT_JOB) - 手动启用一次:
BEGIN DBMS_SCHEDULER.ENABLE('CLEANUP_OS_AUDIT_JOB'); END; - 确认审计跟踪位置:如果用了统一审计(
UNIFIED_AUDIT_TRAIL),清理函数要用CLEAN_AUDIT_TRAIL的AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,混用类型会导致“没报错但没删数据”
设置自动清理策略前必须初始化(INIT_CLEANUP)
没调用 INIT_CLEANUP 就直接设策略,后续所有 CLEAN_AUDIT_TRAIL 调用都会静默失败——不会报错,也不会清理任何记录。
- 首次启用必须运行:
BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP( audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, default_cleanup_interval => 24 ); END; -
default_cleanup_interval单位是小时,不是天;设为0表示禁用自动调度(只靠手动调用) - 初始化后,
DBA_AUDIT_MGMT_CONFIG_PARAMS视图里才能看到配置项,否则查不到
清理策略被忽略的三个典型配置坑
策略存在,但清理仍不触发,大概率掉进下面任一陷阱:
- 时间阈值设太小:
SET_LAST_ARCHIVE_TIMESTAMP设置的时间早于当前最早的审计记录时间,清理范围为空——查SELECT MIN(event_timestamp) FROM unified_audit_trail对比确认 - 误用
USE_LAST_ARCH_TIMESTAMP参数:在CLEAN_AUDIT_TRAIL中传TRUE,但没提前调用SET_LAST_ARCHIVE_TIMESTAMP,会直接报错ORA-46365: Last archive timestamp is not set - 权限不足:执行用户必须有
AUDIT_ADMIN角色,仅DBA不够;且不能用SYS直连(会报ORA-46367: Operation not allowed for SYS user)
统一审计 vs 标准审计:函数调用不能混用
Oracle 19c 默认启用统一审计(UNIFIED_AUDIT_TRAIL),但很多人还按老习惯调用标准审计的清理逻辑,结果 audit trail 表不动如山。
- 统一审计清理必须指定:
AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED - 标准审计(
DBA_AUDIT_TRAIL)对应的是:AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_DB_STD,二者元数据、存储路径、清理机制完全隔离 - 混合部署时(比如部分模块仍走标准审计),要分别初始化、分别设策略、分别调度,没有“一键全清”函数
INIT_CLEANUP 成功执行,再确认调度作业处于 ENABLED 状态。中间任何一步跳过或参数写错,都会导致看起来“配置完了”,其实什么都没发生。

















