如何正确设置job的interval?

标签: 正确 job interval | 发表时间:2013-09-13 16:07 | 作者:
出处:http://www.iteye.com
首先,先了解interval的定义
引用
interval  VARCHAR2(200)  NOT NULL  A date function, evaluated at the start of execution, becomes next NEXT_DATE
即在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错误。为什么会出现这两个错误呢?先模拟出现这两个错误的例子:

创建测试的table、procedure
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> 

定义job
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>

job执行完成后,查询插入t表的时间
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>

查询interval,可知interval的值是个固定值
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。 「随着job的结束,视图dba_jobs.interval的值要更新为dba_jobs.next_date的值」。即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错误。
引用
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

为什么会抛出这两个错误呢?因为job执行的时间 > (interval的值-job开始执行的时间),等job执行完后再去更新next_date时,已经过了11:06:00,自然就报错了。

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

文章推荐阅读
关于JOB的两个小问题
Oracle Job ORA-12012&ORA-12005 错误的解决

已有 0 人发表留言,猛击->> 这里<<-参与讨论


ITeye推荐



相关 [正确 job interval] 推荐:

如何正确设置job的interval?

- - ITeye博客
首先,先了解interval的定义. 即在job开始执行时根据date function估算job下次执行的时间(NEXT_DATE). 通常,我们采用两种方式来设置job的interval:. 由date function估算出的时间是固定的. 由date function估算出的时间是非固定的.

kettle执行job

- - 互联网 - ITeye博客
ETL高级教程kettle. 1,Kettle跨平台使用.     例如:在AIX下(AIX是IBM商用UNIX操作系统,此处在LINUX/UNIX同样适用),运行Kettle的相关步骤如下:.     1)进入到Kettle部署的路径.     2)执行 chmod *.sh,将所有shell文件添加可执行权限.

提高hadoop的mapreduce job效率

- - 数据库 - ITeye博客
hadoop 的mapreduce 的作业在运行过程中常常碰到一些这样的情 况:. 每一个map或者reduce只有30-40秒钟就结束. 超 大规模的job 时,通常会需要大量的map和reduce的slots 支持,但是job运行起来后,running的map和reduce并没有沾满集群的可用slots.

Hive中跑MapReduce Job出现OOM问题分析及解决

- - CSDN博客云计算推荐文章
今天在跑一段很复杂而且涉及数据量10多年的N个表join的长SQL时,发生了OOM的异常. 由于一个map通常配置只有64MB或者128MB,则在Map阶段出现OOM的情况很少见. 所以一般发生在reduce阶段. 但是今天这个异常详细的看后,会发现既不是map阶段,也不是reduce阶段,发现不是执行过程,而是driver提交job阶段就OOM了.

ETL工具Pentaho Kettle的transformation和job集成

- - CSDN博客推荐文章
Kettle是一款国外开源的etl工具,纯java编写,数据抽取高效稳定(数据迁移工具). Kettle中有两种脚本文件,transformation和job,transformation完成针对数据的基础转换,job则完成整个工作流的控制. 2.1.       transformation实现解析.

oozie定时循环调度sqoop job 增量导数入hive

- - angela的博客
假设oracle里面有一个student表每10分钟有一批新增的数据,现在想要把数据同步到hive,实现思路是用oozie的coordinator定义一个job,job里面调度workflow用sqoop从oracle里增量导数入hive. 一、oozie调度sqoop直接导数入hive --全量.

Elastic-Job - 分布式定时任务框架

- - 企业架构 - ITeye博客
摘要: Elastic-Job是ddframe中dd-job的作业模块中分离出来的分布式弹性作业框架. 去掉了和dd-job中的监控和ddframe接入规范部分. 该项目基于成熟的开源产品Quartz和Zookeeper及其客户端Curator进行二次开发. ddframe其他模块也有可独立开源的部分,之前当当曾开源过dd-soa的基石模块DubboX.

运行Hadoop作业时一处常见错误以及解决方法 job 引入第三方jar包

- - 学着站在巨人的肩膀上
提交job端引入了 第三方jar包,自动传上去的参数 -D libjars=myjob.jar,third-party.jar. 会上传到 hdfs-site.xml 文件中 :. 指定的路径,该路径是hdfs上的路径,mapred运行时会在该目录下建立自己的文件夹里面放入 上传的第三方jar包,所有的mapred程序都去这个hdfs目录读取jar包到本地运行java程序.

正确理解ThreadLocal

- - Java - 编程语言 - ITeye博客
转自: http://www.iteye.com/topic/103804. 首先,ThreadLocal 不是用来解决共享对象的多线程访问问题的,一般情况下,通过ThreadLocal.set() 到线程中的对象是该线程自己使用的对象,其他线程是不需要访问的,也访问不到的. 另外,说ThreadLocal使得各线程能够保持各自独立的一个对象,并不是通过ThreadLocal.set()来实现的,而是通过每个线程中的new 对象 的操作来创建的对象,每个线程创建一个,不是什么对象的拷贝或副本.

正确重置MySQL密码

- xxg - 火丁笔记
谁都不想弄丢家门钥匙,但不管多么小心,时间长了,这样的事情总会发生几次. MySQL密码也是一样,把它写在文档上不太安全,记在脑子里又难免会忘记. 如果你忘记了MySQL密码,如何重置它呢. 首先停止MySQL服务,然后使用skip-grant-tables参数启动它:. 此时无需授权就可以进入到MySQL命令行,使用SQL重置MySQL密码:.