Oracle执行定时JOB时,经常会遇到JOB意外死锁,或者一些JOB执行的程序有对外的接口,当网络中断或不稳定时,造成JOB死锁,占用资源,以下为解决方法:
(如果不想JOB释放后马上又重新执行,请先将JOB在数据库中Broken)
1.查看正在执行JOB的Job Id、SID、Serial#、SPID信息:
select c.JOB, b.sid, b.SERIAL#, spid
from v$process a, v$session b, dba_jobs_running c
where a.addr = b.paddr
and b.sid = c.sid
2.尝试使用以下语句SID、Serial#停止JOB进程:
alter system kill session '646,3312';
(其中'646,3312'分别就是上面查出的SID和Serial#)
3.如通过以上还是无法解决问题,继续按以下步骤执行:
(1)、首先通过1查询的JOB ID将死锁的JOB Broken掉;
(2)、用Root权限进入Linux后台,用kill -9 29202终止JOB进程(29202为1查询出得SPID);
(3)、在数据库恢复正常后,在启用JOB。
以上第1步最好在第2步无效的情况下使用,因直接终止进程可能会造成Oracle或操作系统不稳定或直接崩溃,另外如果还是无法解决以上问题,则只能重启Oracle数据库了。