天天看点

Oracle 9i Job Queues总结

1、Oracle与Job有关的操作都是通过DBMS_JOB来完成的;

2、后台进程CJQ0(Coordinate Job Queue)定期查询dba_views,并将这些job按时间进行排序。当发现一个Job可以运行了,就自动产生一个Job Queue进程(Jnnn)来执行这个Job.

3、通过数据库的参数JOB_QUEUE_PROCESSES来控制:1)是否启动CJQ0  2)Job Queue进程的个数(即可同事执行的Job的最大个数)。JOB_QUEUE_PROCESSES为0,则CJQ0不启动,所有Job均不会如期执行。 JOB_QUEUE_PROCESSES为为20,表明最大20个Job可以同时运行.  JOB_QUEUE_PROCESSES参数是dynamic的,可动态修改:ALTER SYSTEM SET JOB_QUEUE_PROCESSES = 20;

4、创建一个JOB:

  VARIABLE jobno NUMBER

  BEGIN

  DBMS_JOB.SUBMIT(:jobno,

  'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',

  ''HR'', ''EMPLOYEES'',

  ''ESTIMATE'', NULL, 50);',

  SYSDATE, 'SYSDATE + 1');

  COMMIT;

  END;

  /

  PRINT jobno

 DBMS_JOB.SUBMIT 的格式为:

 SUBMIT(JOBNO,WHAT,NEXT_DATE,INTERVAL,NO_PARSE),其中:

  jobno是 一个OUT参数。当SUBMIT执行完毕,jobno会带出ORACLE分配的job号码。这个job号码作为这个JOB的标识

  WHAT是这 个JOB要做的事情。用''引起来的任何PL/SQL语句

  NEXT_DATE是下次要执行这个JOB的时间。默认为SYSDATE

  INTERVAL 是间隔,决定了这个任务下次运行的时间。每次JOB运行时,都会计算这个INTERVAL字段,并在执行完毕后将这个值放到NEXT_DATE字段中去, 作为下次执行的时间;

  NO_PARSE:决定WHAT部分的东西实在SUBMIT的时候进行解析(FALSE)还是第一次执行的时候解析 (TRUE)。

5、常见的WHAT:

 'myproc(''10-JAN-99'', next_date, broken);'

 'scott.emppackage.give_raise(''JFEE'', 3000.00);'

 'dbms_job.remove(job);'

6、常见的INTERVAL:

 'SYSDATE + 7'    每七天

 'SYSDATE + 1/48' 每半小时

 'NEXT_DAY(TRUNC(SYSDATE), ''MONDAY'') + 15/24' 每周一的下午三点

 'NEXT_DAY(ADD_MONTHS(TRUNC(SYSDATE, ''Q''), 3), ''THURSDAY'')' 每季度的第1个星期四

7、删除一个JOB

BEGIN

DBMS_JOB.REMOVE(14144);

END;

/

8、Altering JOB

1)

BEGIN

DBMS_JOB.CHANGE(14144, NULL, NULL, 'SYSDATE + 3');

END;

/

2)

BEGIN

DBMS_JOB.WHAT(14144,'DBMS_DDL.ANALYZE_OBJECT(''TABLE'',

''HR'', ''DEPARTMENTS'',

''ESTIMATE'', NULL, 50);');

END;

/

3)

BEGIN

DBMS_JOB.NEXT_DATE(14144, SYSDATE + 4);

END;

/

4)

BEGIN

DBMS_JOB.INTERVAL(14144, 'NULL');

END;

/

9、broken job

  一个JOB处于broken状态,这个JOB就不会再被执行。可以手工置这个状态,也可以再JQ尝试执行一个JOB失败16次后自动置;

10、 强迫执行JOB

BEGIN

DBMS_JOB.RUN(14144);

END;

/

11、停止JOB

找到JOB对应得SESSION,然后用ALTER SYSTEM KILL SESSION来KILL

12、相关VIEW

USER_JOBS

ALL_JOBS

DBA_JOBS

这些VIEW里边是COMMIT的JOB

DBA_JOBS_RUNNING里是正在RUN的JOB。停止JOB的时候,可以从这个里边找SESSION的ID。

--------------------------------------------------------------------------------------------------------------------------------------

job_queue_process 表示oracle能够并发的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文件中读取。