dba_hist_active_sess_history这个视图功能比较强大,可以查找过去数据库信息,有几个字段比如BLOCKING_SESSION、event、sql_id、SAMPLE_TIME可以查询数据库过去时间事件,对故障处理是有作用的。
dba_hist_active_sess_history:是视图v$active_session_history的历史数据,DBA_HIST_ACTIVE_SESS_HISTORY视图默认每十秒收集一次信息储存在磁盘中,保存7天,这也是组成AWR一个重要的试图。
附一下AWR相关试图
DBA_HIST_WR_CONTROL:查看当前快照收集的相关设置
v$active_session_history:由ASH自动在内存中维护,以每秒一次的频率收集当前系统中活动session的信息
dba_hist_active_sess_history:是视图v$active_session_history的历史数据,保存在硬盘上
dba_hist_database_instance:显示数据库是实例的信息
dba_hist_snapshot:当前数据库收集到的快照信息
这里直接用案例,来说明。
先用roger一组GES死锁导致。
数据库出现故障,导致数据库HANG住。分析步骤1 查看alert.log Global Enqueue Services Deadlock detected. More info in file
/oracle/admin/cmsdb1/bdump/cmsdb11_lmd0_3705.trc
这时查看trc文件, master 0 gl owner 54111aeb8 possible pid 28756 xid 1005-005B-00009AFE bast 0 rseq 6 mseq 0 history 0x14951495
open opt KJUSERDEADLOCK。分析出为相互堵塞。及下来就要分析堵塞的SID及sqltext。
1 SQL> select SNAP_ID,to_char(BEGIN_INTERVAL_TIME,'yyyymmdd hh24:mi:ss') BEGIN_INTERVAL_TIME from WRM$_SNAPSHOT where BEGIN_INTERVAL_TIME between to_date('20101202 10','yyyymmdd hh24') and to_date('20101202 18','yyyymmdd hh24') and INSTANCE_NUMBER=1 order by 2; 其实这里不用查snap_id对应的时间,在dba_hist_active_sess_history里有一个时间字段SAMPLE_TIME,一样可以查找你想要时间里的相关内容。
2 根据快照ID 查询故障时间段内的异常等待事件
select INSTANCE_NUMBER,event,to_char(SAMPLE_TIME,'yyyymmdd hh24:mi:ss'),count(*) from DBA_HIST_ACTIVE_SESS_HISTORY
where snap_id=22549 and WAIT_CLASS<>'Idle' and event='enq: TX - row lock contention'group by INSTANCE_NUMBER,event,to_char(SAMPLE_TIME,'yyyymmdd hh24:mi:ss') order by 1,3;
3 根据等待事件查sid
select instance_number,BLOCKING_SESSION,count(*),event from DBA_HIST_ACTIVE_SESS_HISTORY where snap_id=22549 and
to_char(SAMPLE_TIME,'yyyymmdd hh24:mi:ss')='&time' and WAIT_CLASS<>'Idle' and event='enq: TX - row lock contention'
group by instance_number,BLOCKING_SESSION,event
order by 1,2;
从这里我们可以看到 死锁session均来自一个节点,输入告警里面的时间,查询可的出sid为351,577为互为死锁,最多查sql便能查出来相关语句,发生死锁一般是要从开发业务做调整。
下面在是关于数据库HANG住时通过这分析DBA_HIST_ACTIVE_SESS_HISTORY
来自一米的分析