如何正确设置job的interval?

首先,先了解interval的定义
[quote]interval VARCHAR2(200) NOT NULL A date function, evaluated at the start of execution, becomes next NEXT_DATE
[/quote]即在job开始执行时根据date function估算job下次执行的时间(NEXT_DATE)。

通常,我们采用两种方式来设置job的interval:
1. 由date function估算出的时间是固定的
2. 由date function估算出的时间是非固定的

何为固定?何为非固定?

比如说trunc(SYSDATE)+635/1440,trunc(sysdate,'hh')+1/48估算出的时间就是固定的,它不跟随sysdate的变化而变化。而sysdate+1,sysdate+2估算出的时间就是非固定的,因为sysdate变化,sysdate+1和sysdate+2也会跟随变化。

在此,重点阐述的是当interval的值是固定时间时应当注意的事项。如果interval设置的不得当,很可能会出现ORA-12012与ORA-12005错误。为什么会出现这两个错误呢?先模拟出现这两个错误的例子:

[b]创建测试的table、procedure[/b]
SQL> 
SQL> alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';

Session altered.

SQL> create table t(dtime date);

Table created.

SQL>
SQL>
SQL> create or replace procedure proc_time
2 as
3 begin
4 insert into t values(sysdate);
5 commit;
6 dbms_lock.sleep(120);
7 end;
8 /

Procedure created.

SQL>

[b]定义job[/b]
SQL> DECLARE
1 jobno number;
2 BEGIN
3 sys.DBMS_job.SUBMIT
4 (job => jobno ,
5 what => 'proc_time;',
6 next_date => sysdate,
7 interval => 'trunc(SYSDATE)+666/1440');
8 commit;
9 END;
10 /

PL/SQL procedure successfully completed.

SQL>

[b]job执行完成后,查询插入t表的时间[/b]

SQL> select * from t;

DTIME
-------------------
2013-08-24 11:05:26

SQL>
SQL>
SQL> select last_date,what from dba_jobs where job = 21;

LAST_DATE WHAT
------------------- ----------------------------------------
2013-08-24 11:05:26 proc_time;

SQL>

[b]查询interval,可知interval的值是个固定值[/b]

SQL> select trunc(SYSDATE)+666/1440 time from dual;

TIME
-------------------
2013-08-24 11:06:00

SQL>

可以知道,job开始执行的时间是2013-08-24 11:05:26(从t表记录的值和dba_jobs视图可以看出)。而job真正完成的时间是2013-08-24 11:05:26 + 120秒,即2013-08-24 11:07:26。[b]「随着job的结束,视图dba_jobs.interval的值要更新为dba_jobs.next_date的值」[/b]。即dba_jobs.next_date='2013-08-24 11:06:00'。可是,此时的sysdate已经大于'2013-08-24 11:06:00',Oracle更新next_date的值并非我们刚开始设置的interval的值,而是比当前sysdate大的值。随即在告警日志文件中抛出ORA-12012和ORA-12005错误。
[quote]Sat Aug 24 11:07:31 2013
Errors in file /u01/app/oracle/admin/lonion/bdump/lonion_j000_18414.trc:
ORA-12012: error on auto execute of job 21
ORA-12005: may not schedule automatic refresh for times in the past[/quote]
为什么会抛出这两个错误呢?因为job执行的时间 > (interval的值-job开始执行的时间),等job执行完后再去更新next_date时,已经过了11:06:00,自然就报错了。

要想避免这个错误,有3种可行的办法:
- 缩短job执行的时间,即优化相关的SQL、逻辑
- 加大interval的值
- 采用非固定的interval

[b]文章推荐阅读[/b]
- [url=http://www.dbaroad.me/archives/2010/01/job_next_date.html]关于JOB的两个小问题[/url]
- [url=http://blog.chinaunix.net/uid-87897-id-2014084.html]Oracle Job ORA-12012&ORA-12005 错误的解决[/url]
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值