Chinaunix首页 | 论坛 | 博客
  • 博客访问: 526575
  • 博文数量: 235
  • 博客积分: 1209
  • 博客等级: 少尉
  • 技术积分: 1417
  • 用 户 组: 普通用户
  • 注册时间: 2011-11-19 19:59
文章分类

全部博文(235)

文章存档

2012年(107)

2011年(128)

分类:

2011-11-23 00:32:09

Oracle作业job 没有自动调度起来

 

 

问题:有一同事报过来,说有两个job已经近一周没有自动调起了,让我帮忙解决。

 

1、检查:

(1)在生产库中检查,其他的job都能自动调度

(2)select * from all_jobs where job in(2704,2706); 检查正常,并无异常 (dba_jobsPL/SQL Developer DBMS_Jobs 也可查看)

(3)select * from dba_jobs_running where job in(2704,2706);  在其列表中

结论:进程挂死未完成,导致不能自动调度!

 

2、解决:先备份两job的内容再将job删除,然后将进程杀掉,并重建

1)利用上面查出job运行列表中的sid 3695,并查出哪些进程需要杀掉,查询语句如下:

select 'call superkill('||a.sid||','||a.SERIAL#||');' KILL_SID,

       'kill -9 '||A.PROCESS||';'KILL_PID,A.SID,A.SERIAL#,A.STATUS,   A.SCHEMANAME,A.USERNAME,A.MACHINE,OSUSER,A.PROCESS,A.PROGRAM,A.TERMINAL,

       A.SERVICE_NAME,A.LOGON_TIME, A.OWNERID,

       D.SQL_TEXT,D.SQL_FULLTEXT

from gv$session a, v$sql d

where a.SQL_ADDRESS=d.ADDRESS(+)

and (a.SCHEMANAME = 'REPORT' or a.USERNAME= 'REPORT')

and a.sid=3695

order by a.MACHINE;

 

杀进程:

1)上面的superkill如下:

create or replace procedure system.superkill(SESSION_ID BINARY_INTEGER,SERIAL_NUM

 

BINARY_INTEGER) is

begin

   execute immediate 'alter system disconnect session '''||SESSION_ID||','||SERIAL_NUM||'''

 

immediate' ;

EXCEPTION

   WHEN OTHERS

   THEN

      RAISE;

end superkill;

 

(2)也可用 alter system kill session 'sid,serial#'; 但推荐使用 alter system disconnect session  'sid,serial#';

    之间的区别可参考

    http://www.itpub.net/thread-374006-2-1.html

   

   

 

(3) 重建job

job:2706 的重建:

begin

  sys.dbms_job.isubmit(job => 2706,

                      what => 'declare

vc_out varchar2(2000);

begin

SP_SAP_NEWINCOME_ALL(to_char(SYSDATE-1,''yyyymmdd''),to_char(SYSDATE-1,''yyyymmdd''));

pkg_dic_day_report_2011.Dic_day_all_report_2011(to_char(SYSDATE-1,''yyyymmdd''));

pkg_dic_day_report_2010.DiC_Day_Move_Busi(vc_out,to_char(SYSDATE-1,''yyyymmdd''));

pkg_dic_day_report_2010.DiC_Pst_YW(vc_out,to_char(SYSDATE-1,''yyyymmdd''));

end;',

                      next_date => trunc(SYSDATE)+1+17/24,

                      interval => 'trunc(SYSDATE)+1+17/24');

  commit;

end;

/

 

第二天检查两job都已正常自动调度。

注:之所以要删掉原job是方便后面杀进程,其实还有一个方法是 PL/SQL Developer DBMS_Jobs 右击对应job“编辑” 然后勾选"broken" (已断掉,或 dbms_job.broken(job_id, true); 此处的job_id就是2706 ,true为断开,false为未断开)再杀进程,等杀完之后再去掉勾选。

阅读(1073) | 评论(0) | 转发(0) |
0

上一篇:找出数组中重复的数

下一篇:ipfw中文手册

给主人留下些什么吧!~~