停job就是将job的状态改为broken,然后杀死正在运行的job;将job unbroken可以直接调用exec dbms_job.broken(82,false); 。
1.确定要停止的JOB号
select * from dba_jobs_running;
2.Broken你确认的JOB
exec dbms_job.broken(82,true);
select job,log_user,broken,last_date,next_date from dba_jobs where job=82;
3.Kill 对应的Oracle Session
select sid,serial# from v$session where sid=144;
alter system kill session 'sid,serial#';
或
SELECT p.spid FROM v$session s, v$process p
WHERE s.paddr = p.addr
AND s.sid = 144;
直接KILL对应的操作系统的SESSION,如果使用ALTER SYSTEM KILL SESSION执行很长时间,其实可以使用OS的命令来快速KILL掉SESSION.
For Windows, at the DOS Prompt: orakill sid spid
For UNIX at the command line> kill –9 spid
4.检查你的JOB是否还在运行,如果还运行,多杀几次
select * from dba_jobs_running;
5.修改完成后,将job的BROKEN状态停止。
exec dbms_job.broken(82,false);
--手动执行job
exec dbms_job.run(82);
--dbms_job.broken过程定义,next_date参数默认为sysdate,如果不写,从broken到unbroken,
--即调用exec dbms_job.broken(82,false);,会运行对应的job。
PROCEDURE dbms_job.broken( job IN BINARY_INTEGER,
broken IN BOOLEAN,
next_date IN DATE DEFAULT SYSDATE );
注意:
调用dbms_job.broken过程,一定要commit;
从broken到unbroken,即调用exec dbms_job.broken(82,false);,会运行对应的job。
--停job过程
SQL>select*fromdba_jobs_running;
SIDJOBFAILURESLAST_DATELAST_SECTHIS_DATETHIS_SECINSTANCE
----------------------------------------------------------------------------------------------------
14482028-8月-1217:42:5528-8月-1217:50:450
SQL>execdbms_job.broken(82,true);
PL/SQL过程已成功完成。
SQL>commit;
提交完成。
SQL>SELECTp.spidFROMv$sessions,v$processp
2WHEREs.paddr=p.addr
3ANDs.sid=144;
SPID
------------
4672
----------------------------#
--使用操作系统命令
C:\Windows\system32>orakillorcl4672
----------------------------#
--如果job还在运行,可以多次执行orakillorcl4672
SQL>select*fromdba_jobs_running;
未选定行