init_cleanup必须在统一审计真正启用后调用,且audit_trail_type须为audit_trail_unified、default_cleanup_interval设为正数,再启用cleanup_os_audit_job作业并确保audsys表空间空间充足。
dbms_audit_mgmt.init_cleanup 必须在启用统一审计后、任何清理操作前执行,否则 clean_audit_trail 静默失败——不报错、不删数据、也不提示缺初始化。
为什么 INIT_CLEANUP 调用后还是没效果
常见现象是执行了 DBMS_AUDIT_MGMT.INIT_CLEANUP,但后续 CLEAN_AUDIT_TRAIL 仍无记录被删,甚至 DBA_AUDIT_MGMT_CONFIG_PARAMS 查不到配置项。根本原因不是 PL/SQL 写错了,而是前置条件未满足:
- 统一审计未真正启用(
V$OPTION返回 TRUE 仅表示“支持”,需确认UNIFIED_AUDIT_TRAIL视图可查且有数据) - 调用时传入的
audit_trail_type值与实际审计类型不匹配(统一审计必须用DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,混用AUDIT_TRAIL_DB会导致初始化写入错误配置区) -
default_cleanup_interval设为 0 —— 这会禁用自动调度,只保留手动调用能力,但很多人误以为“0 表示立即执行”
INIT_CLEANUP 的最小安全调用方式
不要跳过验证步骤。以下语句应在确认统一审计已激活(SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE ROWNUM = 1 有返回)后执行:
BEGIN
DBMS_AUDIT_MGMT.INIT_CLEANUP(
audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED,
default_cleanup_interval => 24
);
END;
注意:default_cleanup_interval 单位是小时,设为 24 表示每 24 小时触发一次自动清理(依赖调度作业);设为 0 并非“禁用清理”,而是“禁用自动调度”,仍可手动调用 CLEAN_AUDIT_TRAIL。
执行后立刻验证是否生效:
SELECT parameter_value FROM DBA_AUDIT_MGMT_CONFIG_PARAMS WHERE audit_trail_type = DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED AND parameter_name = 'DEFAULT_CLEANUP_INTERVAL';
若无结果,说明初始化失败 —— 大概率是 audit_trail_type 传错,或数据库仍处于混合模式(SHOW PARAMETER audit_trail 返回 DB 或 XML)。
CLEANUP_OS_AUDIT_JOB 作业必须手动启用
初始化只是写入配置,不启动清理动作。Oracle 19c 默认将清理任务绑定到名为 CLEANUP_OS_AUDIT_JOB 的调度作业,但它初始状态是 DISABLED:
- 检查状态:
SELECT job_name, enabled FROM dba_scheduler_jobs WHERE job_name = 'CLEANUP_OS_AUDIT_JOB' - 启用作业:
BEGIN DBMS_SCHEDULER.ENABLE('CLEANUP_OS_AUDIT_JOB'); END; - 该作业不会立即运行,首次触发时间由
default_cleanup_interval和上次清理时间共同决定
若跳过启用步骤,哪怕 INIT_CLEANUP 成功、CLEAN_AUDIT_TRAIL 手动调用也成功,自动清理永远不会发生 —— 因为没有后台进程驱动。
容易被忽略的权限与表空间约束
DBMS_AUDIT_MGMT 包操作依赖两个底层前提,出问题时日志里往往只报模糊的 ORA-46268 或静默失败:
- 执行用户必须拥有
EXECUTE权限 onDBMS_AUDIT_MGMT,且角色权限(如DBA)不能通过 OS 认证隐式授予,需显式授权 - 统一审计日志实际存于
AUDSYS表空间,该表空间不可读写、不可迁移,但其所在磁盘必须有足够空间;INIT_CLEANUP不检查磁盘剩余,但后续CLEAN_AUDIT_TRAIL在空间不足时会跳过删除并记录警告到 alert.log - 不能对
AUDSYS表空间执行ALTER TABLESPACE ... READ WRITE,否则整个统一审计功能崩溃,需重启恢复
真正卡住的地方,往往不是语法或参数,而是二进制重链接没做、作业没启用、或者 AUDSYS 所在文件系统只剩几百 MB 空间却没人去看。











