Chinaunix首页 | 论坛 | 博客
  • 博客访问: 550344
  • 博文数量: 65
  • 博客积分: 1158
  • 博客等级: 少尉
  • 技术积分: 1261
  • 用 户 组: 普通用户
  • 注册时间: 2012-07-18 22:07
文章分类

全部博文(65)

文章存档

2016年(1)

2014年(2)

2013年(9)

2012年(53)

分类: Oracle

2012-11-17 14:13:36

 今天碰到一个这个问题,由于一个job执行的时间过长,所以打算将其分为几块去执行,这个job又是每天按时执行的。

下面来看怎么实现:
第一步:查看正在运行的jobs
SQL>select * from dba_jobs_running;

然后确定你要停止的job,这个数据字典对应的job就是下面要执行的过程的第一个参数。

第二步:确定要停掉的job的SIDSERIAL#和系统进程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  /


阅读(10303) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~