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

1、首先job要在command命令下执行才有效 

DECLARE  
X NUMBER;  
BEGIN  
SYS.DBMS_JOB.SUBMIT  
( job => X  
,what => 'test;'  
,next_date => to_date('05-02-2016 11:40:00', 'dd-mm-yyyy hh24:mi:ss')  
,interval => 'sysdate+1/24'  
,no_parse => TRUE  
);  
SYS.DBMS_OUTPUT.PUT_LINE('Job Number is: ' || to_char(x));  
COMMIT;  
END;  
/  

2、job创建之后,看情况需不需要立即执行job,如果next_date在当前日期之后,如果执行run的话立即会执行一次,否则是到指定的时间执行;如果你设置的next_date的时间在当前日期之前那么当时run和不run都会在系统当前的时间执行一次。

begin  
dbms_job.run(job的id);  
end;  
/  

记得commit;

job 的id可以通过select * from user_jobs;进行查询

3、如果发现job到点没有执行,那么

show parameter job_queue_processes ; 
看下
job_queue_processes的值,如果为0 那么要将值改为大于零的数,
alter system set job_queue_processes=1;  
 
  
即可.
4、查看job运行情况
 
  
select * from user_jobs;  
select * from dba_jobs_running;  
select * from dba_jobs;  

JOB问题解决汇总:

一。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如下:

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如下:

declare

BEGIN

DBMS_JOB.BROKEN(,FALSE);

END;

4.使用下面的SQL查询是否JOB还在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看看:

declare

begin

dbms_job.run(_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)