Oracle储存过程长时间运行检查

本文介绍了如何检查Oracle存储过程长时间运行的问题,包括查询运行的Job、存储过程、是否存在死锁,以及通过SID定位执行语句。通过V$DB_OBJECT_CACHE、V$ACCESS、V$SESSION等视图,发现存储过程等待事件为SQL*Net message from dblink,可能由远程数据库的dblink通信问题导致。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

今天检查到一个奇怪的现场,Oracle存储过程执行时间过长,已经执行了2天,还在运行,这明显是不正常的。
把这次检查的经过记录,方便以后查看

1. 查询更在运行的Job

Select * From DBA_JOBS_RUNNING
发现 job:1542,sid:1352 从2018年3月30日,跑到至今(2018年4月3日)都未结束.

2.查询job执行的存储过程

Select * From DBA_JOBS where job = 1542
通过what字段,发现JOB1542,执行的存储过程为: pack_jigl_interface.auto_main_call(sysdate-1);
auto_main_call里面调用了4个过程,通过日志发现正在执行 PROC_E_MP_POWER_CURVE 过程.

3.查询有没有表死锁影响了过程执行

Select    Distinct
              b.owner, b.object_name ,
              c.username,
              a.Session_id,
              c.serial#, c.status, pro.spid, d.job, e.what, c.Prev_exec_start,
              a.Locked_mode, Round( (sysdate - c.Prev_exec_start)*24*60) DiffMinutes,
              l.type, l.ctime , area.SQL_TEXT

From     

                  v$locked_object         a
      join      v$dba_objects            b      on      a.object_id       =  b.object_id 
      join      v$session                    c      on      a.session_id      =   c.SID
      join      v$lock                         l       on      a.Locked_mode = l.Lmode and l.SID = c.SID and l.type in ('TX','TM')
left join      v$sqlarea               area      on      c.SQL_HASH_VALUE = area.HASH_VALUE
left join      v$process                pro      on       pro.addr          =  c.paddr
left join      v$dba_jobs_running   d      on      d.sid                  =  a.session_id and d.sid = c.sid
left join      v$dba_jobs                  e     on      d.job                  =  e.job
order by SESSION_ID;

没有发现过程中的表有死锁.

4.通过SID查找存储过程现在正在执行哪条语句

--通过sid,找到sql_id(sid通过上面的DBA_JOBS_RUNNING查到的)

Select SID,SQL_ID from V$SESSION                  where  SID     = 1352
--检查执行计划
Select    *              from V$SESSION_LONGOPS where  SID     = 1352 and sql_id = 'fjqaw14x82qba'
--检查正在执行的SQL
Select   *               from V$sql                             where  sql_id = 'fjqaw14x82qba'

卡住的语句为使用表A向dblink的表B插入数据.
经过分析,有2种情况导致

1. DBLink的数据库有死锁.我方一直等待
2. 网络原因,断断续续连接DBLink

最后具体什么原因没找出来.使用
ALTER SYSTEM KILL SESSION 'SID,SERIAL#' IMMEDIATE

结束了进程.
另,https://www.cnblogs.com/harvey888/p/6710902.html 有一篇类似的文章,写得很好,复制过来,方便以后查阅:
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值