Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2875879
  • 博文数量: 200
  • 博客积分: 2413
  • 博客等级: 大尉
  • 技术积分: 3067
  • 用 户 组: 普通用户
  • 注册时间: 2011-04-01 22:07
文章分类

全部博文(200)

文章存档

2018年(2)

2017年(8)

2016年(35)

2015年(14)

2014年(20)

2013年(24)

2012年(53)

2011年(44)

分类: Oracle

2011-10-27 22:43:48

大晚上抽出一点儿时间做个试验
比如出现了下面的错误,怎么解决呢
  1. 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;
  2. JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL              FAILURES   B
  3. -- ----- --------------------------------------------------- ------------------ ---------- -
  4. 22 myproc; SCOTT  2011-10-27 21:59:44      2011-10-27 22:11:57 sysdate+1/2440     16       N

 

解决办法:

1、exec dbms_job.broken(22,false,sysdate+1/2440);
commit;

2、SQL> exec dbms_job.run(22,true);
commit;

如果不想让job立即执行,那么就用第二种。

 

 

下面是试验过程,很乱,实在没时间整理,凑合看吧

 

  1. 昨天,工作中一个oracle数据库中的两个job失败次数都达到16次了,job的broken状态都为y,也就是不再执行了。那么怎么解决呢?浸提晚上到家凑点儿时间做个小实验,来分析怎样让由于失败次数达到上限而不再自动执行的job恢复自动执行。
  2. 创建存储过程
  3. create or replace procedure myproc as
  4. begin
  5. insert into test values(sysdate);
  6. end;
  7. /
  8. 创建job,每半分钟执行一次
  9. variable n number;
  10. begin
  11. dbms_job.submit(:n,'myproc;',sysdate,'
  12. ');
  13. commit;
  14. end;
  15. /
  16. print :n
  17. job号为22
  18. 让job执行不成功
  19. alter table test rename to test2;
  20. 这样8分钟后,job错误执行次数达到16次,job的broken状态为Y,也就是这个job不再执行
  21. 查询状态
  22. 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;
  23. 那么怎么让他继续执行呢?
  24. 第一种方法:
  25. 先不将表名由test2改为test
  26. exec dbms_job.broken(22,false,sysdate+1/2440);
  27. commit;
  28. 这样再次查询
  29. 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;
  30. JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL FAILURES B
  31. ---------- ------------ --------------- ------------------------------------------- -------------------- ---------- -
  32. 22 myproc; SCOTT 2011-10-27 21:59:44 2011-10-27 22:11:57 sysdate+1/2440 16 N
  33. 观察执行一次后的状态:22号job依然执行失败,failures失败次数变为17,broken变回Y,也就是以后不会再执行了。
  34. SQL> 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;
  35. JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL FAILURES B
  36. ---------- ------------------------------ ------------------------------ ------------------- ------------------- ------------------------------ ---------- -
  37. 22 myproc; SCOTT 2011-10-27 21:59:44 4000-01-01 00:00:00 sysdate+1/2440 17 Y
  38. 将test2改为test
  39. SQL> alter table test2 rename to test;
  40. exec dbms_job.broken(22,false,sysdate+1/2440);
  41. commit;
  42. SQL> 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;
  43. JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL FAILURES B
  44. ---------- ------------------------------ ------------------------------ ------------------- ------------------- ------------------------------ ---------- -
  45. 22 myproc; SCOTT 2011-10-27 21:59:44 4000-01-01 00:00:00 sysdate+1/2440 17 N
  46. 再观察,奇迹啊,这次执行成功了,失败次数归0,broken状态为n。
  47. SQL> 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;
  48. JOB WHAT LOG_USER TO_CHAR(LAST_DATE,' TO_CHAR(NEXT_DATE,' INTERVAL FAILURES B
  49. ---------- ------------------------------ ------------------------------ ------------------- ------------------- ------------------------------ ---------- -
  50. 22 myproc; SCOTT 2011-10-27 22:15:32 2011-10-27 22:16:07 sysdate+1/2440 0 N
  51. 第二种方法:
  52. alter table test rename to test2;
  53. 执行失败16次
  54. dbms_job.run(22,true);
  55. 执行失败
  56. ERROR at line 1:
  57. ORA-12011: execution of 1 jobs failed
  58. ORA-06512: at "SYS.DBMS_IJOB", line 406
  59. ORA-06512: at "SYS.DBMS_JOB", line 272
  60. ORA-06512: at line 1
  61. 为什么会这样,因为没有test这个表呗
  62. run成功后failures次数变为0,broken状态变为n。
  63. alter table test2 rename to test;
  64. dbms_job.run(22,true);
  65. 成功。

 

 

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