环境:Oracle11.2.0.4
1、判断job是否卡死
用PL/SQL Developer看到job是否完成,查看job属性中LAST 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命令如下:--权限不足,使用system、sys用户执行!!!
alter system kill session '会话编号sid,会话序列号serial#';
4、查看是否成功杀掉该会话(方法与步骤一相同,多执行几次select * from dba_jobs_running where job='job号'观察结果,如果杀掉了将不再有返回结果)。
5、job杀死后,被延误的job任然会启动(未验证过)。
补充:
如果报错--ORA-00031:标记要终止的会话(如上图3)
可以通过下列语句查询:
select a.spid,b.sid,b.serial#,b.username
from v$process a,v$session b
where a.addr=b.paddr
and b.status='KILLED';
如果利用上面的命令杀死一个进程后,进程状态被置为"killed",但是锁定的资源很长时间没有被释放,那么可以在OS级再杀死相应的进程(线程),首先执行下面的语句获得进程(线程)号:
select b.spid,a.osuser,b.program
from v$session a,v$process b
where a.paddr=b.addr
and a.sid=579 --------------------------------------------------579就是上面的sid
在OS上杀死这个进程(线程)
在unix上,用root身份执行命令:#kill -9 12345(12345 即第4步查询出的进程ID)
最后在按照步骤1查询验证Job是否存在!!!