核心区别是日志存储位置与管理主体:OS模式由Oracle进程交操作系统写入audit_file_dest目录文件,DB模式写入sys.aud$数据字典表;前者不依赖数据库可用性,后者依赖sys.aud$可写及undo/归档空间,且易因无分区索引导致性能与清理问题。
audit_trail=OS 和 audit_trail=DB 本质区别在哪
核心就一条:日志写到哪,由谁管。设成 os,oracle 把审计记录直接交给操作系统写进文件(路径由 audit_file_dest 控制);设成 db,记录全存进数据字典表 sys.aud$ 里,走 sql 路径入库。
这意味着:OS 模式不依赖数据库可用性——实例挂了,只要 OS 活着,部分审计还能记;DB 模式依赖 sys.aud$ 表可写、undo 可用、归档空间够,否则审计可能静默失败或阻塞会话(尤其 AUDIT_TRAIL=DB,EXTENDED 下)。
audit_trail=DB 时 sys.aud$ 表容易撑爆
sys.aud$ 是堆表,没分区,没索引(默认),大量审计事件进来后查询慢、清理难、归档日志暴涨。DBA 常踩的坑是只改参数,不配清理策略。
- 必须定期清理:用
DBMS_AUDIT_MGMT.CLEAN_AUDIT_TRAIL,别用DELETE FROM sys.aud$—— 这会锁表、触发大量 undo/redo - 启用自动清理前,先运行
DBMS_AUDIT_MGMT.INIT_CLEANUP初始化管理框架 - 如果启用了
UNIFIED_AUDIT_TRAIL(12c+),audit_trail=DB实际已逐步被替代,新项目优先考虑统一审计
audit_trail=OS 下权限和路径问题最常导致审计静默失效
Oracle 进程以 oracle 用户身份写 OS 文件,但很多人忽略了两点:一是 audit_file_dest 目录的属主和权限,二是 Oracle 二进制是否启用 setuid(影响能否切换到 oracle 用户写文件)。
- 目录必须由
oracle用户拥有,且至少有drwxr-x---权限(组不能有写权,否则 Oracle 拒绝写入) - 检查
ls -ld <audit_file_dest>,常见错误是 root 创建目录后忘记 chown - 确认
sqlplus / as sysdba能连上,并执行SELECT value FROM v$parameter WHERE name = 'audit_file_dest';看路径是否真实存在且可写 - Linux 下若启用了 SELinux,还需确认
sestatus和对应 audit 目录的 context(如chcon -t oracle_home_t <path>)
DB 模式下无法审计 SYS 登录,OS 模式可以但需额外配置
这是权限模型决定的:audit_trail=DB 依赖数据库内核路径记录,而 SYS 登录(尤其 AS SYSDBA)在连接建立前就绕过了大部分审计钩子。OS 模式则靠 Oracle 可执行文件自身在进程启动时写日志,天然覆盖更早阶段。
- 要审计 SYS,必须同时设置
audit_sys_operations=TRUE(默认 FALSE),且该参数只能在spfile或pfile中静态配置,重启才生效 -
audit_sys_operations=TRUE在audit_trail=OS下才真正起效;设为DB时该参数被忽略 - 生成的日志文件名含
ora_<pid>.aud</pid>,注意不是所有 SYS 操作都记——比如某些后台进程连接不会记,但交互式sqlplus / as sysdba一定记
audit_trail 参数本身不复杂,但 OS 和 DB 模式背后牵扯的是权限链、进程模型、存储路径和清理机制四层耦合。改之前务必确认:目标日志归属谁、谁负责删、谁可能看不到记录、以及最关键——你真正想抓的是哪类操作、由哪个主体来保障它不丢。










