Oracle 19c统一审计默认未启用,必须执行二进制重链接(make -f ins_rdbms.mk uniaud_on ioracle)并重启数据库,否则AUDIT POLICY、CLEAN_AUDIT_TRAIL等操作均不生效。
dbms_audit_mgmt.clean_audit_trail 不生效,unified_audit_trail 查不到记录,audit policy 创建了但没日志——这些不是配置漏了,而是统一审计根本没真正启用。
Oracle 19c 默认不启用统一审计(哪怕你看到 V$OPTION 返回 TRUE,也可能是混合模式残留或误判),必须完成二进制重链接 + 数据库重启才能激活纯统一审计能力。跳过这步,后续所有策略、清理、查询都只是“看起来在跑”,实际不落数据。
确认 Unified Auditing 是否真启用
别只查 V$OPTION。它返回 TRUE 只表示“支持该特性”,不代表已启用。真实状态要看数据库启动时是否加载了 uniaud_on 模块:
- 执行
SELECT value FROM V$OPTION WHERE PARAMETER = 'Unified Auditing';—— 若为FALSE,必须重链接 - 若为
TRUE,再运行SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE ROWNUM = 1; - 如果报
ORA-00942: table or view does not exist,说明统一审计未激活(视图不存在) - 如果返回空但无报错,检查是否启用了混合模式(
AUDIT_TRAIL参数非NONE):执行SHOW PARAMETER audit_trail,值不能是DB或XML
只有 audit_trail = NONE 且 UNIFIED_AUDIT_TRAIL 可查,才代表纯统一审计就绪。
启用 Unified Auditing 必须重链接 Oracle 二进制
这是最容易被跳过的硬性步骤。19c 安装后默认是混合模式(传统 + 统一共存),而纯统一审计需重新编译核心模块:
- 停库:
SHUTDOWN IMMEDIATE;停监听:lsnrctl stop - 切换到
$ORACLE_HOME/rdbms/lib,执行:make -f ins_rdbms.mk uniaud_on ioracle - 重启数据库:
STARTUP;再查V$OPTION和UNIFIED_AUDIT_TRAIL - 注意:此操作不可逆(除非再用
uniaud_off),且要求操作系统用户有$ORACLE_HOME写权限
没走这一步,CREATE AUDIT POLICY 能成功,但策略永不触发——没有后台进程监听对应事件。
创建并启用审计策略的最小可行路径
启用统一审计后,策略不会自动生效,必须显式 AUDIT POLICY。常见错误是只创建不启用,或作用域写错:
- 创建策略(例如审计所有 DDL):
CREATE AUDIT POLICY all_ddl ACTIONS CREATE ANY TABLE, DROP ANY TABLE, ALTER ANY TABLE; - 启用策略(关键!必须指定作用域):
AUDIT POLICY all_ddl BY SYS, SYSTEM;(仅审计指定用户)
或AUDIT POLICY all_ddl;(全库启用,等价于BY ALL USERS) - 验证是否启用:
SELECT policy_name, enabled_opt, user_name FROM audit_unified_enabled_policies;,enabled_opt必须是BY USER或BY ALL USERS - 不要用
EVALUATE PER STATEMENT或PER SESSION混搭条件——19c 统一审计策略中,WHEN子句只支持简单表达式,复杂逻辑建议用细粒度审计(DBMS_FGA)
策略启用后,日志写入 AUDSYS.UNIFIED_AUDIT_TRAIL,不是 DBA_AUDIT_TRAIL。后者只属于传统审计。
CLEAN_AUDIT_TRAIL 清理失败的三个隐藏前提
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL 静默失败,90% 是卡在这三步没做:
- 先调
INIT_CLEANUP:BEGIN DBMS_AUDIT_MGMT.INIT_CLEANUP(audit_trail_type => DBMS_AUDIT_MGMT.AUDIT_TRAIL_UNIFIED, default_cleanup_interval => 24); END;
不调这个,后续所有清理调用都无效(无报错、无日志、无删除) - 清理类型必须匹配:
统一审计只能用AUDIT_TRAIL_UNIFIED;传AUDIT_TRAIL_DB_STD或漏写参数,函数不报错但什么也不删 - 调度作业必须启用:
SELECT job_name, enabled FROM dba_scheduler_jobs WHERE job_name = 'CLEANUP_OS_AUDIT_JOB';
默认是DISABLED,要手动DBMS_SCHEDULER.ENABLE('CLEANUP_OS_AUDIT_JOB');
清理策略依赖 DBA_AUDIT_MGMT_CONFIG_PARAMS 视图,而该视图只在 INIT_CLEANUP 后才填充数据——没初始化,查这个视图就是空的。
统一审计的清理不是“删文件”,而是从 AUDSYS 表空间里物理删除分区。如果 AUDSYS 表空间满了或被设为 READ ONLY,清理会失败,但错误只出现在 alert 日志里,不抛给调用方。


















