我们需要监控从某个应用服务器到 Oracle DB 的所有 SQL。
为此,我们运行以下查询:
SELECT
h.sample_time,
u.username,
h.program,
h.module,
h.machine,
s.sql_text
FROM
DBA_HIST_ACTIVE_SESS_HISTORY h,
DBA_USERS u,
DBA_HIST_SQLTEXT s
WHERE sample_time >= SYSDATE - 0.1
AND h.user_id = u.user_id
AND h.sql_id = s.sql_iD
AND u.USERNAME = '<app_server_name>'
AND h.MACHINE = ('<app_schema_name>')
ORDER BY h.sample_time
这个问题:
应用程序服务器计算机缺少操作系统用户。
在视图 DBA_HIST_ACTIVE_SESS_HISTORY 和 DBA_HIST_SQLTEXT 上找不到有关操作系统用户的任何信息。 (同时,视图 V$SESSION 上有一列 OSUSER - DBA_HIST_ACTIVE_SESS_HISTORY 的非历史版本)
我查看了 DBA %HIST% 视图的列:
select t.owner, t.table_name, t.column_name, t.data_type,
t.data_precision, t.data_scale
from dba_tab_cols t
where t.owner = 'SYS'
and t.table_name like '%DBA_HIST%'
and t.column_name like '%OS%'
order by t.table_name, t.COLUMN_NAME
但找不到任何与操作系统用户信息相关的信息。
知道如何在第一次查询时获取操作系统用户数据吗?
致以诚挚的问候
阿尔廷
首先,您不启用审核是否有原因?这将是捕获给定用户 100% 的查询的唯一方法。
审计并不适合所有情况,特别是在数量过多的情况下,因此查看 ASH 数据作为替代方法确实有意义。但请记住,
dba_hist_active_sess_history
仅以 AWR 快照间隔(通常间隔 1 小时,但可配置)填充。您的 SYSDATE - 0.1
过滤器只有在每小时忠实触发且 AWR 间隔确实为一小时或更短的情况下才会工作。跳过一两个小时,您就会丢失数据。另外,dba_hist
版本仅为每 10 个样本中的 1 个,因此可能会错过很多小东西。您最好查询内存中的版本 gv$active_session_history
,该版本的条目数量增加了 10 倍,并且是实时的。您可能想要设置一些东西来每分钟或每 10 分钟点击一次。它通常会将信息保留至少几个小时。这比 dba_hist
版本准确得多。
您在 ASH 数据中的任何地方都找不到
osuser
。如果您想要这样做,您将需要创建一个登录触发器来捕获每个新会话的会话信息。您可以通过仅捕获来自相关计算机的信息来节省空间,无论哪种过滤器对您都有意义。但是,您可以在触发器中使用一整套 v$session
属性,以及额外的 SYS_CONTEXT
属性。将您需要的内容写入由 sid,serial#,inst_id,logon_time
键控的日志表中。稍后您可以使用 gv$active_session_history
将 ASH 数据 (session_id/session_serial#/inst_id
) 连接到此日志表,并为会话添加任何其他属性。