Oracle JOB问题【转】

原创 2011年01月21日 13:48:00

1、系统中有一个关于允许运行JOB数的参数job_queue_processes

除了直接察看ORACLE系统环境的ini*.ora文件之外,可以通过SQL/PLUS直接察看:

show parameter job_queue_processes;

会自动报出系统的此参数值。当job_queue_processes=0时,job 再正确也不可能自动执行。所以我们应该将此参数设置为大于0,其中数据库ORACLE 8i的参数范围:0<job_queue_processes<36。 具体命令:

alter system set job_queue_processes=10;

通过察看是否为0后,可以初步修改系统参数,此是JOB不能自动执行的情况之一。

(自己刚刚修改环境的此参数,正在测试,如果发现不是此问题导致的话,后续会加上其他分析情况)

 

Oracle JOB问题解决汇总
2010-03-02 10:08

一。job的运行频率设置

1.每天固定时间运行,比如早上8:10分钟:Trunc(Sysdate+1) + (8*60+10)/24*60
2.Toad中提供的:
每天:trunc(sysdate+1)
每周:trunc(sysdate+7)
每月:trunc(sysdate+30)
每个星期日:next_day(trunc(sysdate),'SUNDAY')
每天6点:trunc(sysdate+1)+6/24
半个小时:sysdate+30/1440
3.每个小时的第15分钟运行,比如:8:15,9:15,10:15...:trunc(sysdate,'hh')+75/1440。原先我设置的是trunc(sysdate,'hh')+15/1440,发现居然不行。
二。JOB为什么不运行?
1.先来了解一下JOB的参数说明:与job相关的参数一个是job_queue_processes,这个是运行JOB时候所起的进程数,当然系统里面JOB大于这个数值后,就会有排队等候的,最小值是0,表示不运行JOB,最大值是36,在OS上对应的进程时SNPn,9i以后OS上管理JOB的进程叫CJQn。可以使用下面这个SQL确定目前有几个SNP/CJQ在运行。
select * from v$bgprocess,这个paddr不为空的snp/cjq进程就是目前空闲的进程,有的表示正在工作的进程。
另外一个是job_queue_interval,范围在1--3600之间,单位是秒,这个是唤醒JOB的process,因为每次snp运行完他就休息了,需要定期唤醒他,这个值不能太小,太小会影响数据库的性能。
2.诊断:先确定上面这两个参数设置是否正确,特别是第一个参数,设置为0了,所有JOB就不会跑,确认无误后,我们继续向下。
3.使用下面的SQL察看JOB的的broken,last_date和next_date,last_date是指最近一次job运行成功的结束时间,next_date是根据设置的频率计算的下次执行时间,根据这个信息就可以判断JOB上次是否正常,还可以判断下次的时间对不对,SQL如下:
  1. select * from dba_jobs  
select * from dba_jobs

有时候我们发现他的next_date是4000年1月1日,说明job要不就是在running,要不就是状态是break(broken=Y),如果发现JOB的broken值为Y,找用户了解一下,确定该JOB是否可以broken,如果不能broken,那就把broken值修改成N,修改再使用上面的SQL察看就发现他的last_date已经变了,JOB即可正常运行,修改broken状态的SQL如下:
  1. declare   
  2. BEGIN   
  3. DBMS_JOB.BROKEN(<JOB_ID>,FALSE);   
  4. END;  
declare
BEGIN
DBMS_JOB.BROKEN(<JOB_ID>,FALSE);
END;

4.使用下面的SQL查询是否JOB还在Running
  1. select * from dba_jobs_running  
select * from dba_jobs_running

如果发现JOB已经Run了很久了还没有结束,就要查原因了。一般的JOB running时会锁定相关的相关的资源,可以查看一下v$access和v$locked_object这两个view,如果发现其他进程锁定了与JOB相关的Object,包括PKG/Function/Procedure/Table等资源,那么就要把其他进程删除,有必要的话,把JOB的进程也删除,再重新跑看看结果。
5.如果上面都正常,但是JOB还不run,怎么办?那我们要考虑把JOB进程重启一次,防止是SNP进程死了造成JOB不跑,指令如下:
alter system set job_queue_processes=0 --关闭job进程,等待5--10秒钟
alter system set job_quene_processes=5 --恢复原来的值
6.Oracle的BUG
Oracle9i里面有一个BUG,当计数器到497天时,刚好达到它的最大值,再计数就会变成-1,继续计数就变成0了,然后计数器将不再跑了。如果碰到这种情况就得重启数据库,我们这边有一个生产型的数据库版本是9205,就发生过这样一次问题,后来和用户约时间重启后就没问题了。但是其他的Oracle7345和Oracle8i的数据库没有发现这个问题。
7.数据库上的检查基本上就这多,如果JOB运行还有问题,那需要配合用户察看一下是否是程序本身的问题,比如处理的资料量大,或者网络速度慢等造成运行时过长,那就需要具体情况具体分析了。我们可以通过下面的SQL手工执行一下JOB看看:
  1. declare   
  2. begin   
  3. dbms_job.run(<job>_ID)   
  4. end;  
declare
begin
dbms_job.run(<job>_ID)
end;

如果发现JOB执行不正常,就要结合程序具体分析一下。
通过语句
  show parameter job_queue_process;
  来查看oracle中job_queue_process的值。当job_queue_process值为0时表示全部停止oracle的job。可以通过语句
  ALTER SYSTEM SET job_queue_processes = 10;
  来修改oracle中job_queue_process的值(这里改为10,job_queue_process的值该设为多少是另外的问题),不过这种修改是动态的,当oracle重新启动后job_queue_process的值将仍然从/%ORACLE_HOME%/admin/mydb/pfile/init.ora文件中读取。
查询job的情况。
show paramter background_dump_dest.
看alter.log 和trace

请问我如何停止一个JOB
SQL> exec dbms_job.broken(1,true)
PL/SQL 过程已成功完成。
SQL>commit //必须提交否则无效

启动作业
SQL> exec dbms_job.broken(1,false)
PL/SQL 过程已成功完成。

停其他用户的job
SQL>exec sys.dbms_ijob.broken(98,true);
SQL>commit;

oracle job执行时间往后延迟分析

问题描述:job的执行时间往后推迟很长时间,导致查询的数据不再时间范围内。 原因分析: 原因一:job执行时间间隔没有加trunc截取精度,而是直接使用sysdate+1/(24*60),由于job启...
  • u013050593
  • u013050593
  • 2016年11月08日 11:27
  • 2771

Oracle JOB 设置

Job的参数: 一:时间间隔执行(每分钟,每天,每周,:每月,每季度,每半年,每年) interval是指上一次执行结束到下一次开始执行的时间间隔,...
  • lijiastone
  • lijiastone
  • 2011年10月25日 10:07
  • 3054

oracle job的创建和删除

oracle job的创建 declare    v_jobnum  number; begin   dbms_job.submit(v_jobnum,'lastjob',sysdate,'last...
  • liaomin416100569
  • liaomin416100569
  • 2013年03月18日 16:54
  • 38139

oracle创建job并执行job

1、首先job要在command命令下执行才有效 DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X ,what => 'test;' ,ne...
  • menghuannvxia
  • menghuannvxia
  • 2016年02月05日 16:52
  • 6094

oracle创建job并执行job及JOB问题解决汇总

1、首先job要在command命令下执行才有效  DECLARE X NUMBER; BEGIN SYS.DBMS_JOB.SUBMIT ( job => X ,what =>...
  • admin1973
  • admin1973
  • 2017年05月02日 11:17
  • 1220

oracle job导出导入

直接在command命令窗口执行如下sql即可, 大号字体的路径是你自己设置的, SET SERVEROUTPUT OFF SET TERMOUT OFF set linesize 10...
  • heqinghua217
  • heqinghua217
  • 2016年04月07日 11:46
  • 659

Oracle JOB间隔时间详解

Oracle JOB 间隔时间详解 INTERVAL参数设置:每天运行一次                        SYSDATE + 1每小时运行一次                     ...
  • summerycool
  • summerycool
  • 2010年04月27日 15:09
  • 10887

oracle job的创建、修改、删除、运行

-------------查询JOB----------------- select job, what, next_date, next_sec, sysdate, failures, broken...
  • bing_tao
  • bing_tao
  • 2017年01月04日 15:06
  • 257

创建oracle job、删除oracle job的脚本

1、查找用户自定义job的脚本:select t.WHAT,        t.INTERVAL,        t.job,        t.BROKEN,        t.FAILUR...
  • xiaoxl0524
  • xiaoxl0524
  • 2015年08月26日 14:30
  • 2510

oracle job 定时,启动,停止,察看状态。运行脚本

job里面的 last_date 和 next_date ,以及interval之间是什么关系,last_date到底是记的 job 的开始执行时间,还是执行结束的时间。next_date到底是 jo...
  • chaiqi
  • chaiqi
  • 2006年11月30日 16:59
  • 28004
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Oracle JOB问题【转】
举报原因:
原因补充:

(最多只允许输入30个字)