十字螺丝钉 发表于 2011-12-23 01:59

oracle job失败次数达到16次的解决办法

<DIV>大晚上抽出一点儿时间做个试验</DIV>
<DIV>比如出现了下面的错误,怎么解决呢</DIV>
<DIV>
<DIV class=codeText id=codeText style="WIDTH: 102.24%; HEIGHT: 206px">
<OL class=dp-css style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; MARGIN: 0px 1px 0px 0px; PADDING-TOP: 5px">
<LI>SELECT JOB,WHAT,LOG_USER,TO_CHAR(LAST_DATE,'YYYY-MM-DD HH24:MI:SS'),TO_CHAR(NEXT_DATE,'YYYY-MM-DD HH24:MI:SS'),INTERVAL,FAILURES,broken from user_jobs;</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; FAILURES&nbsp; &nbsp;B</LI>
<LI></LI>
<LI>-- ----- --------------------------------------------------- ------------------ ---------- -</LI>
<LI></LI>
<LI>22 myproc; SCOTT&nbsp; 2011-10-27 21:59:44&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 2011-10-27 22:11:57 sysdate+1/2440&nbsp;&nbsp;&nbsp;&nbsp; 16&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; N</LI></OL></DIV></DIV>
<P>&nbsp;</P>
<P>解决办法:</P>
<P>1、exec dbms_job.broken(22,false,sysdate+1/2440);<BR>commit;</P>
<P>2、SQL&gt; exec dbms_job.run(22,true);<BR>commit;</P>
<P>如果不想让job立即执行,那么就用第二种。</P>
<P>&nbsp;</P>
<P>&nbsp;</P>
<P>下面是试验过程,很乱,实在没时间整理,凑合看吧</P>
<P>&nbsp;</P>
<DIV class=codeText id=codeText>
<OL class=dp-css style="PADDING-RIGHT: 0px; PADDING-LEFT: 0px; PADDING-BOTTOM: 5px; MARGIN: 0px 1px 0px 0px; PADDING-TOP: 5px">
<LI>昨天,工作中一个oracle数据库中的两个job失败次数都达到16次了,job的broken状态都为y,也就是不再执行了。那么怎么解决呢?浸提晚上到家凑点儿时间做个小实验,来分析怎样让由于失败次数达到上限而不再自动执行的job恢复自动执行。</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>创建存储过程</LI>
<LI></LI>
<LI>create or replace procedure myproc as </LI>
<LI></LI>
<LI>begin </LI>
<LI></LI>
<LI>insert into test values(sysdate); </LI>
<LI></LI>
<LI>end; </LI>
<LI></LI>
<LI>/ </LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>创建job,每半分钟执行一次</LI>
<LI></LI>
<LI>variable n number; </LI>
<LI></LI>
<LI>begin </LI>
<LI></LI>
<LI>dbms_job.submit(:n,'myproc;',sysdate,'</LI>
<LI></LI>
<LI>'); </LI>
<LI></LI>
<LI>commit; </LI>
<LI></LI>
<LI>end; </LI>
<LI></LI>
<LI>/ </LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>print :n</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>job号为22</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>让job执行不成功</LI>
<LI></LI>
<LI>alter table test rename to test2;</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>这样8分钟后,job错误执行次数达到16次,job的broken状态为Y,也就是这个job不再执行</LI>
<LI></LI>
<LI>查询状态</LI>
<LI></LI>
<LI>SELECT JOB,WHAT,LOG_USER,TO_CHAR(LAST_DATE,'YYYY-MM-DD HH24:MI:SS'),TO_CHAR(NEXT_DATE,'YYYY-MM-DD HH24:MI:SS'),INTERVAL,FAILURES,broken from user_jobs;</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>那么怎么让他继续执行呢?</LI>
<LI></LI>
<LI>第一种方法:</LI>
<LI></LI>
<LI>先不将表名由test2改为test</LI>
<LI></LI>
<LI>exec dbms_job.broken(22,false,sysdate+1/2440);</LI>
<LI></LI>
<LI>commit;</LI>
<LI></LI>
<LI>这样再次查询</LI>
<LI></LI>
<LI>SELECT JOB,WHAT,LOG_USER,TO_CHAR(LAST_DATE,'YYYY-MM-DD HH24:MI:SS'),TO_CHAR(NEXT_DATE,'YYYY-MM-DD HH24:MI:SS'),INTERVAL,FAILURES,broken from user_jobs;</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL FAILURES B</LI>
<LI></LI>
<LI>---------- ------------ --------------- ------------------------------------------- -------------------- ---------- -</LI>
<LI></LI>
<LI>22 myproc; SCOTT 2011-10-27 21:59:44 2011-10-27 22:11:57 sysdate+1/2440 16 N</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>观察执行一次后的状态:22号job依然执行失败,failures失败次数变为17,broken变回Y,也就是以后不会再执行了。</LI>
<LI></LI>
<LI>SQL&gt; SELECT JOB,WHAT,LOG_USER,TO_CHAR(LAST_DATE,'YYYY-MM-DD HH24:MI:SS'),TO_CHAR(NEXT_DATE,'YYYY-MM-DD HH24:MI:SS'),INTERVAL,FAILURES,broken from user_jobs;</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL FAILURES B</LI>
<LI></LI>
<LI>---------- ------------------------------ ------------------------------ ------------------- ------------------- ------------------------------ ---------- -</LI>
<LI></LI>
<LI>22 myproc; SCOTT 2011-10-27 21:59:44 4000-01-01 00:00:00 sysdate+1/2440 17 Y</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>将test2改为test</LI>
<LI></LI>
<LI>SQL&gt; alter table test2 rename to test;</LI>
<LI></LI>
<LI>exec dbms_job.broken(22,false,sysdate+1/2440);</LI>
<LI></LI>
<LI>commit;</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>SQL&gt; SELECT JOB,WHAT,LOG_USER,TO_CHAR(LAST_DATE,'YYYY-MM-DD HH24:MI:SS'),TO_CHAR(NEXT_DATE,'YYYY-MM-DD HH24:MI:SS'),INTERVAL,FAILURES,broken from user_jobs;</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL FAILURES B</LI>
<LI></LI>
<LI>---------- ------------------------------ ------------------------------ ------------------- ------------------- ------------------------------ ---------- -</LI>
<LI></LI>
<LI>22 myproc; SCOTT 2011-10-27 21:59:44 4000-01-01 00:00:00 sysdate+1/2440 17 N</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>再观察,奇迹啊,这次执行成功了,失败次数归0,broken状态为n。</LI>
<LI></LI>
<LI>SQL&gt; SELECT JOB,WHAT,LOG_USER,TO_CHAR(LAST_DATE,'YYYY-MM-DD HH24:MI:SS'),TO_CHAR(NEXT_DATE,'YYYY-MM-DD HH24:MI:SS'),INTERVAL,FAILURES,broken from user_jobs;</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL FAILURES B</LI>
<LI></LI>
<LI>---------- ------------------------------ ------------------------------ ------------------- ------------------- ------------------------------ ---------- -</LI>
<LI></LI>
<LI>22 myproc; SCOTT 2011-10-27 22:15:32 2011-10-27 22:16:07 sysdate+1/2440 0 N</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>第二种方法:</LI>
<LI></LI>
<LI>alter table test rename to test2;</LI>
<LI></LI>
<LI>执行失败16次</LI>
<LI></LI>
<LI>dbms_job.run(22,true);</LI>
<LI></LI>
<LI>执行失败</LI>
<LI></LI>
<LI>ERROR at line 1:</LI>
<LI></LI>
<LI>ORA-12011: execution of 1 jobs failed</LI>
<LI></LI>
<LI>ORA-06512: at "SYS.DBMS_IJOB", line 406</LI>
<LI></LI>
<LI>ORA-06512: at "SYS.DBMS_JOB", line 272</LI>
<LI></LI>
<LI>ORA-06512: at line 1</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>为什么会这样,因为没有test这个表呗</LI>
<LI></LI>
<LI>run成功后failures次数变为0,broken状态变为n。</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>alter table test2 rename to test;</LI>
<LI></LI>
<LI></LI>
<LI></LI>
<LI>dbms_job.run(22,true);</LI>
<LI></LI>
<LI>成功。</LI></OL></DIV>
<P>&nbsp;</P>
<P>&nbsp;</P>
页: [1]
查看完整版本: oracle job失败次数达到16次的解决办法