必须设置AUDIT_SYS_OPERATIONS=TRUE才能审计SYSDBA的SQL操作,因该参数独立控制特权用户审计,而AUDIT_TRAIL仅影响普通用户审计记录存储位置,且SYSDBA操作强制写入OS文件而非数据库表。
audit_sys_operations 设置为 true 才能记录 sysdba 的每条 sql 操作,仅设 audit_trail 无效
为什么 AUDIT_TRAIL 设成 DB 或 OS 都不审计 SYSDBA 的 SQL?
因为 AUDIT_SYS_OPERATIONS 是独立开关:它控制的是「SYS、SYSDBA、SYSOPER 等特权用户是否被审计」,而 AUDIT_TRAIL 只决定「普通用户的审计记录往哪存」。即使 AUDIT_TRAIL = 'DB,EXTENDED',SYSDBA 的操作也不会进 SYS.AUD$ 表——Oracle 明确要求这类操作必须写到操作系统文件(无论 AUDIT_TRAIL 值是什么)。
常见错误现象:
- 设置了
AUDIT_TRAIL = 'DB,EXTENDED',但查SELECT * FROM DBA_AUDIT_TRAIL看不到CONNECT或ALTER DATABASE OPEN记录 - 执行了
conn / as sysdba后立刻SELECT SYSDATE FROM DUAL,但SYS.AUD$里没这条语句
根本原因:AUDIT_SYS_OPERATIONS 默认是 FALSE,此时只记登录/登出和实例启停(且仅在部分平台如 Windows 事件查看器或 Linux 的 audit_file_dest 中有痕迹),不记具体 SQL。
如何启用并验证 SYSDBA 操作审计?
必须分三步走,缺一不可:
- 执行
ALTER SYSTEM SET audit_sys_operations = TRUE SCOPE = SPFILE; - 重启数据库:
SHUTDOWN IMMEDIATE→STARTUP - 确认生效:
SHOW PARAMETER audit_sys_operations输出值应为TRUE
验证方式不是查数据库表,而是检查操作系统文件:
- 先查路径:
SHOW PARAMETER audit_file_dest,例如返回/u01/app/oracle/admin/orcl/adump - 进入该目录,用
ls -t ora_*.aud找最新生成的.aud文件 - 用
cat或tail查看内容,应包含类似这样的行:
ACTION : 'SELECT SYSDATE FROM DUAL' DATABASE USER: '/' PRIVILEGE : SYSDBA STATUS: 0
注意:每个 SYSDBA 会话对应一个独立的 .aud 文件(文件名含 PID,如 ora_12345.aud),不是所有记录都堆在一个文件里。
AUDIT_SYS_OPERATIONS 和 AUDIT_TRAIL 的组合影响
二者互不替代,但共存时行为有固定规则:
-
AUDIT_SYS_OPERATIONS = FALSE:只记录极少数关键事件(如CONNECT、SHUTDOWN),且仅在 OS 层面,AUDIT_TRAIL值完全不影响这部分 -
AUDIT_SYS_OPERATIONS = TRUE:所有顶级 SQL(非 PL/SQL 内部调用)都会写入audit_file_dest下的.aud文件;此时AUDIT_TRAIL = 'XML'或'XML,EXTENDED'会让这些文件变成 XML 格式,否则是纯文本 -
AUDIT_TRAIL = 'DB'或'DB,EXTENDED'对 SYSDBA 审计无任何作用——它们只管普通用户的审计记录存进SYS.AUD$
性能与空间提醒:
- 开启后,每次 SYSDBA 执行语句都会触发一次文件 I/O,高频运维操作(如脚本批量执行)可能拖慢响应
-
.aud文件不会自动轮转或清理,需自行用脚本定期归档或删除,否则填满audit_file_dest所在文件系统会导致后续审计失败(甚至影响某些连接)
容易被忽略的关键点
最常踩的坑不是配置错,而是误判「审计是否生效」:
- 别去
SYS.AUD$里找 SYSDBA 记录——它根本不会进去 - 别以为
SHOW PARAMETER audit_trail显示DB就代表 SYSDBA 被审计了 - Windows 平台下,
.aud文件可能不生成,审计日志实际进了 Windows 事件查看器(Application 日志,来源为 OracleService) -
AUDIT_SYS_OPERATIONS是静态参数,修改后不重启,SHOW PARAMETER会显示新值,但实际未生效
真正起效的唯一证据,是看到 audit_file_dest 目录下新增的 .aud 文件里有你刚执行的那条 SQL 的 ACTION 字段。











