A-呵呵哒
2021-09-09 23:00
采纳率: 50%
浏览 41

v$session v$sql v$active_session_history dba_ACTIVE_SESS_HISTORY 通过关联查询结果匹配不到

今天是2021/9/9 17:00
需要通过v$sql 查找到10点半左右关于一个业务表的merge操作
根据对应条件找到这个sql和sql_id, 此时需要定位到当时是谁执行的这个sql
但通过这个sql_id 无论在v$session v$active_session_history 还是在dba_active_sess_history均没有找到相关信息。
通过sql_id匹配,返回结果均为0行,这个是什么情况?
v$session_active_history不是每秒中都会记录信息么?难道当时记录信息的时候,恰好这个sql已经执行完没有被记录?此时应该如何查找对应对操作,也就是谁执行了这个sql?
---追加
今天上午针对昨天的sql又做了一次检查,具体行为如下:
--session当中记录的是正在连接的会话,推出连接的会话应该在历史表当中招
(1)通过v$sql和v$session找,后来想一想,v$session记录的是连接会话,退出登陆的应该不做记录。
LAST_LOAD_TIME between '2021-09-09/10:00:00' and '2021-09-09/11:00:00' and lower(sql_text) like '%agent_merchant_info%';
(2)再一次通过v$sql试图确认这段时间内是有执行过相关sql,并有记录
s


 select address,hash_value,SQL_TEXT,LAST_LOAD_TIME from v$sql where LAST_LOAD_TIME between '2021-09-09/10:00:00' and '2021-09-09/10:35:00' and sql_id='b3kqzkwtxh21n';

(3)此时通过v$sql定位到的sql_id在活动会话历史试图当中找不到,返回值为空
select * from v$active_session_history where sql_id='b3kqzkwtxh21n';
(4)通过关联查询发现这个时间段内的sql没有记录?没有返回值
v$ACTIVE_SESSION_HISTORY A,v$EVENT_NAME B,v$SQLAREA C
WHERE A.sample_time> to_date('20210909 10:00:00','yyyymmdd hh24:mi:ss') and A.sample_time<to_date('20210909 10:40:00','yyyymmdd hh24:mi:ss') AND A.EVENT# = B.EVENT# AND A.SQL_ID = C.SQL_ID and c.sql_id='b3kqzkwtxh21n'
GROUP BY C.SQL_TEXT, B.NAME;
(5)通过历史活动会话和历史sql找到指定的这个时间段内的sql是有返回值,但根据之前v$sql中查到的sql_id匹配就没有返回值,,根据sql_text 和表名匹配,发现记录的仅仅是select操作,这期间其实是有update和merge的相关操作

  dba_hist_active_sess_history a,dba_hist_sqltext b 
 where sample_time >=
       to_date('2021-09-09 10:00:00', 'YYYY-MM-DD HH24:MI:SS')
   and sample_time <=
       to_date('2021-09-09 11:00:00', 'YYYY-MM-DD HH24:MI:SS')
       and a.sql_id=b.sql_id and lower(b.sql_text) like 'merge%';

求解答

  • 写回答
  • 关注问题
  • 收藏
  • 邀请回答

1条回答 默认 最新

  • 唯一的小彬哥 2021-09-10 09:55

    默认是10秒钟采样一次,如果它的sql小于10秒,那么极大的概率可能是记录不下来。
    这种情况,你可以看看有没有开审计,没开审计的话,貌似没有好办法了。

    打赏 评论

相关推荐 更多相似问题