主页 > 创业  > 

审计级别未启用扩展模式导致查询DBA_AUDIT_TRAIL时SQL_TEXT列为空

审计级别未启用扩展模式导致查询DBA_AUDIT_TRAIL时SQL_TEXT列为空

如果查询 DBA_AUDIT_TRAIL 时发现 SQL_TEXT 列为空,但其他字段(如 OS_USERNAME、USERNAME、TIMESTAMP 等)有数据,可能是由于以下原因之一。以下是可能的原因及解决方法:


1. 审计级别未启用扩展模式

默认情况下,Oracle 的审计功能可能不会捕获完整的 SQL 语句。需要启用扩展模式(EXTENDED)才能记录 SQL_TEXT。

检查当前审计级别 -- 查看当前审计级别 SHOW PARAMETER AUDIT_TRAIL; 如果 AUDIT_TRAIL 的值为 DB,则只会记录基本的审计信息。如果 AUDIT_TRAIL 的值为 DB, EXTENDED,则会记录完整的 SQL 语句。 启用扩展模式 -- 修改审计级别为 DB, EXTENDED ALTER SYSTEM SET AUDIT_TRAIL=DB, EXTENDED SCOPE=SPFILE; -- 重启数据库使配置生效 SHUTDOWN IMMEDIATE; STARTUP; 验证扩展模式是否生效 -- 查看审计日志 SELECT OS_USERNAME, USERNAME, TIMESTAMP, SQL_TEXT FROM DBA_AUDIT_TRAIL WHERE ACTION_NAME = 'SELECT';
2. 审计策略未捕获 SQL 语句

即使启用了扩展模式,审计策略可能未配置为捕获 SQL_TEXT。

检查当前审计策略 -- 查看当前审计策略 SELECT * FROM DBA_STMT_AUDIT_OPTS; 启用捕获 SQL 语句的审计策略 -- 启用 SELECT 审计并捕获 SQL 语句 AUDIT SELECT TABLE BY ACCESS;
3. 统一审计(Unified Auditing)未启用

如果使用的是 Oracle 12c 及以上版本,并且启用了统一审计(Unified Auditing),审计日志会写入 UNIFIED_AUDIT_TRAIL 表,而不是 DBA_AUDIT_TRAIL。

检查是否启用了统一审计 -- 查看是否启用了统一审计 SELECT VALUE FROM V$OPTION WHERE PARAMETER = 'Unified Auditing'; 如果返回 TRUE,则表示启用了统一审计。 查询统一审计日志 -- 查看统一审计日志 SELECT OS_USERNAME, USERNAME, EVENT_TIMESTAMP, SQL_TEXT FROM UNIFIED_AUDIT_TRAIL WHERE SQL_TEXT LIKE '%SELECT%';
4. SQL 语句未触发审计

某些 SQL 语句可能不会触发审计,或者审计策略未覆盖这些语句。

检查审计日志 -- 查看审计日志 SELECT * FROM DBA_AUDIT_TRAIL WHERE ACTION_NAME = 'SELECT'; 确保审计策略覆盖所有 SELECT 语句 -- 启用对所有用户的 SELECT 审计 AUDIT SELECT TABLE BY ACCESS;
5. 审计日志被截断或清理

如果审计日志被截断或清理,可能导致 SQL_TEXT 丢失。

检查审计日志保留策略 -- 查看审计日志保留策略 SELECT * FROM DBA_AUDIT_MGMT_CONFIG_PARAMS; 调整审计日志保留策略 -- 设置审计日志保留时间为 30 天 BEGIN DBMS_AUDIT_MGMT.SET_LAST_ARCHIVE_TIMESTAMP( AUDIT_TRAIL_TYPE => DBMS_AUDIT_MGMT.AUDIT_TRAIL_AUD_STD, LAST_ARCHIVE_TIME => SYSTIMESTAMP - INTERVAL '30' DAY ); END;
6. 数据库版本或配置限制

某些 Oracle 版本或配置可能对审计功能有限制。例如:

标准版 Oracle 可能不支持高级审计功能。如果启用了 UNIFIED_AUDIT_TRAIL,审计日志会写入 UNIFIED_AUDIT_TRAIL 表。 检查数据库版本 -- 查看数据库版本 SELECT * FROM V$VERSION; 检查统一审计配置 -- 查看统一审计日志 SELECT * FROM UNIFIED_AUDIT_TRAIL WHERE SQL_TEXT LIKE '%SELECT%';
7. SQL 语句本身为空

在某些情况下,SQL_TEXT 可能为空,例如:

查询系统视图(如 DBA_TABLES)。查询缓存中的数据。 检查 SQL 语句是否被审计 -- 查看审计日志中是否有特定 SQL 语句 SELECT * FROM DBA_AUDIT_TRAIL WHERE SQL_TEXT IS NOT NULL;
总结

如果 DBA_AUDIT_TRAIL 中的 SQL_TEXT 为空,可以按照以下步骤排查:

启用扩展模式:确保 AUDIT_TRAIL 参数设置为 DB, EXTENDED。检查审计策略:确保已启用 SELECT 审计并捕获 SQL 语句。检查统一审计:如果启用了统一审计,查看 UNIFIED_AUDIT_TRAIL 表。检查审计日志保留策略:确保审计日志未被清理或截断。

如果问题仍未解决,建议联系数据库管理员(DBA)进一步排查。

注意:查询缓存中的数据或者系统视图不会触发审计,所以不是所有select语句执行完都能查到审计中的记录。

标签:

审计级别未启用扩展模式导致查询DBA_AUDIT_TRAIL时SQL_TEXT列为空由讯客互联创业栏目发布,感谢您对讯客互联的认可,以及对我们原创作品以及文章的青睐,非常欢迎各位朋友分享到个人网站或者朋友圈,但转载请说明文章出处“审计级别未启用扩展模式导致查询DBA_AUDIT_TRAIL时SQL_TEXT列为空