Oracle DBA 历史视图上的操作系统用户

问题描述 投票:0回答:1

我们需要监控从某个应用服务器到 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

但找不到任何与操作系统用户信息相关的信息。

知道如何在第一次查询时获取操作系统用户数据吗?

致以诚挚的问候

阿尔廷

sql oracle database-administration
1个回答
1
投票

首先,您不启用审核是否有原因?这将是捕获给定用户 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
) 连接到此日志表,并为会话添加任何其他属性。

© www.soinside.com 2019 - 2024. All rights reserved.