oracle定时器job长时间执行无法结束

本文描述了作者在使用Oracle定时Job执行存储过程时遇到的问题,即Job长时间执行未结束,影响后续任务。作者通过查询DBA_JOBS_RUNNING和V$SESSION找出卡死的Job并使用alter system kill session命令进行终止。尽管如此,问题并未彻底解决,Job重启后仍可能缓慢。文章记录了作者的处理步骤,并表示将进一步探究导致Job卡死的原因。

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

iamlaosong文

我用job每天定时执行一些存储过程,以便对数据进行处理。正常情况下,这些存储过程执行完毕需要几十秒时间,但有时不知道什么原因一天都执行不完,导致第二天的job也无法顺利执行。如果不进行人工干预,这个job也许就再也不会执行下去了。通过查询和测试我知道卡死的原因是其中的一些SQL语句执行时间太长,就像服务器有时快有时慢一样,这些SQL语句执行也是时快时慢,猜想原因是不是oracle在做一些内部处理或冲突导致服务器变慢。

人工干预也就是杀死这个job,实验发现杀死job后再次执行这些存储过程有时依然很慢,目前的处理办法是杀死后暂时不再处理当天的数据,这样可以保证第二天的job正常执行。在job正常完成的日子里再次处理卡死那天的数据,发现存储过程很快完成。也就是说,同样的数据同样的程序有时卡死,有时顺利完成,能想到的原因也就是数据库本身了。

杀死job的方法如下:

1、判断job是否卡死

用PL/SQL Developer可以很轻松的看到job是否完成,只有查看job属性中next date是否变成第二天的执行时间,如果没变,说明job没有执行结束。也可以用下面的语句查询:

select * from  dba_jobs_running where job='job号';

用这个语句可以查询执行job的sid列(会话编号)的值,这个值是杀死job的参数之一。

2、用下面语句查询杀死job的第二个参数serial#(会话序列号)

select * from v$session where sid='刚才查到的sid';

返回记录中就有 serial#列(会话序列号),paddr列(线程地址)

也可以将1、2两步合在一起执行:

select b.sid,b.serial# from dba_jobs_running a, v$session b where a.sid=b.sid and a.job='job号';

3、杀死job命令如下:

alter system kill session '会话编号si

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值