今天检查到一个奇怪的现场,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 有一篇类似的文章,写得很好,复制过来,方便以后查阅: