今天碰到一个这个问题,由于一个job执行的时间过长,所以打算将其分为几块去执行,这个job又是每天按时执行的。
下面来看怎么实现:
第一步:查看正在运行的jobs
SQL>select * from dba_jobs_running;
然后确定你要停止的job,这个数据字典对应的job就是下面要执行的过程的第一个参数。
第二步:确定要停掉的job的SID,SERIAL#和系统进程id
select b.SID,b.SERIAL#,c.SPID
from dba_jobs_running a,v$session b,v$process c
where a.sid = b.sid and b.PADDR = c.ADDR
第三步:调用dbms_job的broken函数将要停止的job干掉
SQL> EXEC DBMS_JOB.BROKEN(18,TRUE);
PL/SQL procedure successfully completed
SQL>commit;
此时这个job还是运行的,可以通过dba_jobs_running查看
第四步:使用alter system kill session 'SID,SERIAL#;杀掉会话。
如果要杀很久,直接使用操作系统命令
kill -9 spid
第五步:调整这个job
第六步:将这个job置为正常状态
SQL> EXEC DBMS_JOB.BROKEN(18,FALSE);
commit;
此时如果直接提交了的话,可能就会马上执行这个job,如果不想让其今天再执行了,可以这样处理,先将这个job remove然后在创建一个新的job
例如
SQL> exec dbms_job.remove(18)
PL/SQL procedure successfully completed
SQL> commit;
再创建一个新的
SQL> declare v_job number;
2 begin
3 dbms_job.submit(v_job,'pro_bak_job;',to_date('2012-11-17 02:00:00','yyyy-mm-dd hh24-mi-ss'),'TRUNC(SYSDATE+1)+2/24',false);
4 commit;
5 end;
6 /
阅读(10281) | 评论(0) | 转发(0) |