利用logmnr分析历史阻塞会话

利用logmnr分析历史阻塞会话

之前基于ash会话级视图可以查当前阻塞以及被阻塞的会话信息,如下:
示例1:

select sample_time,sql_text,session_id,session_serial#,session_type,b.sql_id,
event,blocking_session,blocking_session_serial#,
blocking_inst_id from gv$active_session_history a,gv$sqlarea b where 
session_id=5 and session_serial#=171 and a.SQL_ID=b.SQL_ID order by sample_id asc

在这里插入图片描述

另外也可以用基于事务级别的视图进行查询阻塞的源头,如下:
示例2

with ltr as ( 
select to_char(sysdate,'YYYYMMDDHH24MISS') TM, 
       s.inst_id,
       s.sid,
       s.serial#,
       s.status,
       s.sql_id,
       s.sql_child_number,
       s.prev_sql_id,
       xid,
       t.start_scn, 
       to_char(t.start_date,'YYYY-MM-DD HH24:MI:SS') start_time, 
       e.TYPE,e.block, 
       e.ctime/3600 runtime_Hour, 
       decode(e.CTIME, 0, (sysdate - t.start_date) * 3600*24, e.ctime) el_second  
     --  q.sql_text 
  from gv$transaction t, gv$session s,gv$transaction_enqueue e
 where t.start_date <= sysdate - interval '1' second     /*查询开始多少秒的事务*/
   and t.addr = s.taddr 
   --and s.sql_child_number = q.CHILD_NUMBER(+) 
   --and s.sql_id = q.sql_id(+) and s.prev_sql_id = q.sql_id(+) 
   and t.addr = e.addr(+) )  
  select ltr.* , (select q1.sql_text from gv$sql q1 where ltr.prev_sql_id = q1.sql_id(+)
   and rownum = 1) prev_sql_text , 
  (select q1.sql_text from gv$sql q1 where ltr.sql_id = q1.sql_id(+) 
   and ltr.sql_child_number = q1.CHILD_NUMBER(+)) sql_text 
   from ltr ltr;

在这里插入图片描述

示例1是基于事务,主要查询的是还在进行中,未完成的事务,此脚本虽然可以查出阻塞的源头,但是无法取得阻塞的sql。

示例3

   SELECT A.INST_ID,A.SID,A.SERIAL#,A.USERNAME,A.EVENT,A.WAIT_CLASS,A.SECONDS_IN_WAIT,A.PREV_EXEC_START,b.LOCKED_MODE,C.OWNER,C.OBJECT_NAME,C.OBJECT_TYPE
FROM gV$SESSION A
INNER JOIN gV$LOCKED_OBJECT B
ON A.SID=b.SESSION_ID
INNER JOIN DBA_OBJECTS C
ON B.OBJECT_ID=c.OBJECT_ID
WHERE A.WAIT_CLASS='Idle'
AND A.SECONDS_IN_WAIT>1

在这里插入图片描述

以上示例1-3,只能查当前阻塞与被阻塞的信息,一旦ash在内存中被”flush“掉,就无法获取历史阻塞信息。

虽然Oracle没有直接提供查找阻塞源头sql的方法,然而根据项目中多次实践、探究,我梳理了间接查找历史阻塞会话的方法
1、先确定好环境中阻塞发生的时间点,拉取ash报告
在这里插入图片描述

根据blocking session的% Activity与top sessions中一样,可以判断出,会话4189阻塞了上面会话6245

2、在开启追加日志的前提下,捞取阻塞会话信息

阻塞会话与被阻塞会话在logmnr中的记录

select scn,
       timestamp,
       start_scn,
       commit_scn,
       xid,
       operation,
       seg_name,
       sql_redo,
       machine_name,
       session_info,
       thread#,
       session#,
       serial#
  from archdump
 where (
       (session# = 4189 and serial# = 2382)  or --blocking
      (session# = 2925 and serial# = 4336)  or  --blocking
       (session# = 3321 and serial# = 45918) or --blocking
       (session# = 6245 and serial# = 39240) or --blocked
       (session# = 2688 and serial# = 57682)  --blocked
       (session# = 2846 and serial# = 4244)  or --blocked
       (session# = 3320 and serial# = 42418)
       ) --blocked
   and scn >= 791019425
   and scn <= 791125745
   and seg_name = 'FRAME_ONLINEUSER'
 order by scn asc

3、在借助PL/SQL高亮显示相同功能,我们可以很清楚的看出,阻塞会话阻塞的其他会话
在这里插入图片描述

在这里插入图片描述

如上红色的是阻塞者,绿色是被阻塞会话

4、总结

  • 要分析历史阻塞会话,可借助归档日志来分析,但是前提是追加日志要开启
  • 在确定好时间点的情况下,需要知道阻塞会话的session_id,借助logmnr分析上下会话之间的关系
  • 按照scn进行排序后,如果阻塞源头的sql语句在后续scn中出现相同的sql语句,基本可以确定此sql为阻塞的源头
内容概要:本文详细介绍了基于FPGA的144输出通道可切换电压源系统的设计与实现,涵盖系统总体架构、FPGA硬件设计、上位机软件设计以及系统集成方案。系统由上位机控制软件(PC端)、FPGA控制核心和高压输出模块(144通道)三部分组成。FPGA硬件设计部分详细描述了Verilog代码实现,包括PWM生成模块、UART通信模块和温度监控模块。硬件设计说明中提及了FPGA选型、PWM生成方式、通信接口、高压输出模块和保护电路的设计要点。上位机软件采用Python编写,实现了设备连接、命令发送、序列控制等功能,并提供了一个图形用户界面(GUI)用于方便的操作和配置。 适合人群:具备一定硬件设计和编程基础的电子工程师、FPGA开发者及科研人员。 使用场景及目标:①适用于需要精确控制多通道电压输出的实验环境或工业应用场景;②帮助用户理解和掌握FPGA在复杂控制系统中的应用,包括PWM控制、UART通信及多通道信号处理;③为研究人员提供一个可扩展的平台,用于测试和验证不同的电压源控制算法和策略。 阅读建议:由于涉及硬件和软件两方面的内容,建议读者先熟悉FPGA基础知识和Verilog语言,同时具备一定的Python编程经验。在阅读过程中,应结合硬件电路图和代码注释,逐步理解系统的各个组成部分及其相互关系。此外,实际动手搭建和调试该系统将有助于加深对整个设计的理解。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值