正德厚生,臻于至善

dba_hist_active_sess_history

如何通过 dba_hist_active_sess_history 分析数据库历史性能问题
https://cloud.tencent.com/developer/article/2027417

分享两个实用SQL–查看故障时间等待事件、问题sql及会话访问次数
https://www.51cto.com/article/601971.html

DBA_HIST_ACTIVE_SESS_HISTORY查看历史等待事件

~ Active Session 活动会话
~ gv$active_session_history 每秒采集一次
~ dba_hist_active_sess_history 每10秒采集一次

背景
在很多情况下,当数据库发生性能问题的时候,我们并没有机会来收集足够的诊断信息,比如system state dump或者hang analyze,甚至问题发生的时候DBA根本不在场。这给我们诊断问题带来很大的困难。那么在这种情况下,我们是否能在事后收集一些信息来分析问题的原因呢?在Oracle 10G或者更高版本上,答案是肯定的。

本文我们将介绍一种通过dba_hist_active_sess_history的数据来分析问题的一种方法。

适用于
Oracle 10G或更高版本,本文适用于任何平台。

详情
在Oracle 10G中,我们引入了AWR和ASH采样机制,有一个视图gv$active_session_history会每秒钟将数据库所有节点的Active Session采样一次,而dba_hist_active_sess_history则会将gv$active_session_history里的数据每10秒采样一次并持久化保存。基于这个特征,我们可以通过分析dba_hist_active_sess_history的Session采样情况,来定位问题发生的准确时间范围,并且可以观察每个采样点的top event和top holder。下面通过一个例子来详细说明。

select session_id,sql_id,blocking_session,event,machine 
from dba_hist_active_sess_history
where 
sample_time > to_date('2022-05-08 21:10:00','yyyy-mm-dd hh24:mi:ss') 
and 
sample_time < to_date('2022-05-09 21:30:00','yyyy-mm-dd hh24:mi:ss');
select *
  from dba_hist_active_sess_history d
where d.sample_time 
between
       to_date('2016-12-01 02:00:00', 'yyyy-mm-dd hh24:mi:ss') 
and
       to_date('2016-12-17 06:00:00', 'yyyy-mm-dd hh24:mi:ss')
;
--查看故障时间段等待事件、问题sql id及会话访问次数
--alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss'; 
select trunc(sample_time, 'mi') tm, sql_id, nvl(event,'CPU'),count(distinct session_id) cnt 
 from dba_hist_active_sess_history 
 where sample_time 
between 
 to_date('2019-08-22 14:00:00') 
and 
 to_date('2019-08-22 14:30:00') 
 group by trunc(sample_time, 'mi'), sql_id,nvl(event,'CPU') 
 order by cnt desc; 
--查看该sql相关的等待事件及对应的会话访问次数
select sql_id, nvl(event, 'CPU'), count(distinct session_id) sz 
 from dba_hist_active_sess_history a, dba_hist_snapshot b 
 where sample_time 
between 
 to_date('2019-08-22 14:00:00') 
and 
 to_date('2019-08-22 15:00:00') 
 and sql_id = '4ksvn2rgjnhcm' 
 and a.snap_id = b.snap_id 
 and a.instance_number = b.instance_number 
 group by sql_id, nvl(event, 'CPU') 
 order by sz desc; 
赞(0) 打赏
未经允许不得转载:徐万新之路 » dba_hist_active_sess_history

评论 抢沙发

联系我们

觉得文章有用就打赏一下文章作者

支付宝扫一扫

微信扫一扫

登录

找回密码

注册