2011年(93)
分类: Oracle
2011-11-22 11:10:37
作业job 没有自动调度起来
问题:有一同事报过来,说有两个job已经近一周没有自动调起了,让我帮忙解决。
1、检查:
(1)在生产库中检查,其他的job都能自动调度
(2)select * from all_jobs where job in(2704,2706); 检查正常,并无异常 (dba_jobs或PL/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#';
上面两个原理都差不多。
(3)重建job
如job:2706 的重建:
begin
sys.dbms_job.isubmit(job => 2706,
what => 'declare
vc_out varchar2(2000);
begin
SP__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都已正常自动调度。