Oracle数据库管理-调度任务管理

删除schedule job
BEGIN
  DBMS_SCHEDULER.DROP_JOB(
     job_name => 'my_mv_cd_job'
  );
END;
/

演示如何创建一个schedule job来刷新物化视图
首先我们创建一个存储过程,用来刷新我们的物化视图

create or replace procedure my_mv_cd_procedure_job is
begin
 dbms_mview.refresh('my_mv_cd');
end my_mv_cd_procedure_job;
/

然后我们可以通过如下的sql来查询我们的存储过程。。

SELECT * FROM all_source where type = 'PROCEDURE';

SELECT * FROM user_source where type = 'PROCEDURE';

然后我们创建一个schedule job来trigger我们的刚刚定义的存储过程。。

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
   job_name           =>  'my_mv_cd_job',
   job_type           =>  'STORED_PROCEDURE', --指定执行的是存储过程
   job_action         =>  'my_mv_cd_procedure_job', --对应的存储过程名称
   repeat_interval    =>  'FREQ=MINUTELY; INTERVAL=1', --1分钟trigger一次
   enabled            =>  true
   );
END;
/

10
然后我们可以通过如下sql查询我们创建的schedule job

--查询
select * from ALL_SCHEDULER_JOBS;
select * from USER_SCHEDULER_JOBS;
————————————————

阅读导航

Dbms_scheduler是Oracle提供创建计划任务的包,任务类型可以是执行PL\SQL程序、执行外部脚本、调用操作系统命令,通常用于创建定期定时的任务,不依赖操作系统,保存在数据库内,数据库迁移时不受影响,发生错误有日志可以查询,比较方便创建和使用。例如实施数据备份计划,将数据的备份的脚步保存在day_backup.sh 中,然后创建计划定期执行该脚步:

 
  1. $ vim /oracle/db_backup.sh

  2. #!/bin/sh

  3. ORACLE_SID=sydb;

  4. export ORACLE_SID

  5. ORACLE_HOME=/u01/app/product/11.2.0/db_1;

  6. export ORACLE_HOME

  7. PATH=$ORACLE_HOME/bin:$PATH;

  8. export PATH

  9. LD_LIBRARY_PATH=$ORACLE_HOME/lib;

  10. export LD_LIBRARY_PATH

  11. LOCAL=/EXPORT;

  12. export LOCAL

  13. $ORACLE_HOME/bin/rman target sys/oracle catalog rman/rman log='/tmp/db_backup.log' append <<EOF

  14. run

  15. {

  16. allocate channel dev type disk;

  17. backup incremental level 1 database plus archivelog format '/disk2/backup/sydb/%d_%U_%T.bkp'

  18. tag 'db_backup';

  19. release channel dev;

  20. }

  21. exit;

  22. EOF

注意:这里要设置环境变量,在这里吃了好多苦,总之就是文件权限和环境变量要设置正确;

创建计划任务:

  1. BEGIN

  2. DBMS_SCHEDULER.CREATE_JOB(

  3. job_name=>'DB_BACKUP', --job名称

  4. job_type => 'EXECUTABLE', --job任务类型,请参考2中的解释

  5. job_action =>'/oracle/db_backup.sh', --job操作

  6. start_date=> to_date('2015-05-19 03:00:00','yyyy-mm-dd hh24:mi:ss'),--执行时间和执行间隔时间为null,则表示立即执行

  7. /*12 天执行一次*/

  8. repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=15,-1',--执行间隔时间

  9. enabled=>true,--是否启用

  10. /* next night at 11:00 PM */

  11. comments => 'Nightly incremental backups');

  12. END;

  13. /

支持的任务类型详解:

 
  1. job_type

  2. This attribute specifies the type of job that you are creating. If it is not specified, an error is generated. The supported values are:

  3. 'PLSQL_BLOCK'

  4. This specifies that the job is an anonymous PL/SQL block. Job or program arguments are not supported when the job or program type is PLSQL_BLOCK. In this case, the number of arguments must be 0.

  5. 'STORED_PROCEDURE'

  6. This specifies that the job is a PL/SQL or Java stored procedure, or an external C subprogram. Only procedures, not functions with return values, are supported.

  7. 'EXECUTABLE'

  8. This specifies that the job is external to the database. External jobs are anything that can be executed from the command line of the operating system. Anydata arguments are not supported with a job or program type of EXECUTABLE. The job owner must have the CREATE EXTERNAL JOB system privilege before the job can be enabled or run.

  9. 'CHAIN'

  10. This specifies that the job is a chain. Arguments are not supported for a chain, so number_of_arguments must be 0.

示例

创建一张表,然后创建插入数据的过程:

 
  1. create table t_insert(cname varchar2(30),cnum number(3,4);

  2. /

  3. create or replace procedure fun_insertdata

  4. /*

  5. 功能:向t_insert 表中插入数据

  6. edit:2015-05-15

  7. */

  8. as

  9. v_sql varchar2(300);

  10. begin

  11. v_sql:='insert into t_insert(cname,cnum)values(:1,:2)';

  12. for i in 1..10000 loop

  13. execute immediate v_sql using 'AAA',i;

  14. end loop;

  15. commit;

  16. end;

  17. /

最后创建一个立即执行的任务

 
  1. BEGIN

  2. DBMS_SCHEDULER.CREATE_JOB(

  3. job_name=>'INSERT_DATATOTAB', --job名称

  4. job_type => 'PLSQL_BLOCK', --job任务类型,请参考2中的解释

  5. job_action =>'--job操作

  6. BEGIN

  7. fun_insertdata;

  8. END;

  9. ',

  10. start_date=>NULL, --执行时间和执行间隔时间如果为null,则表示立即执行

  11. /*12 天执行一次*/

  12. repeat_interval=>NULL,--执行间隔时间

  13. enabled=>true,--是否启用

  14. /* next night at 11:00 PM */

  15. comments => 'Nightly incremental backups');

  16. END;

  17. /

查询结果:

 
  1. SQL> column job_name format a15

  2. SQL> column status format a8

  3. SQL> column SESSION_ID format a7

  4. SQL> column SLAVE_PID format a7

  5. SQL> SELECT JOB_NAME,STATUS,session_id,slave_pid,cpu_used FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE JOB_NAME='INSERT_DATATOTAB' and owner='SYS' ;

  6. JOB_NAME STATUS SESSION SLAVE_P CPU_USED

  7. --------------- -------- ------- ------- ---------------------------------------------------------------------------

  8. INSERT_DATATOTA SUCCEEDE 173,263 5228 +000 00:00:01.36

  9. B D 3

所以的scheduler 可以在dbms_schedulers 视图中查询到,每个scheduler 任务执行后的结果可以在DBA_SCHEDULER_JOB_RUN_DETAILS中查询到; 如果想定期执行job可以通过配置repeat_interval,比如每月1,5和最后一天可以这样配置

repeat_interval=>'FREQ=MONTHLY;BYMONTHDAY=1,5,-1'--执行间隔时间 ,-1表示每月最后一天

上面使用到一个FREQ=,这个表示执行的时间截:

YEARLY 表示每一年
MONTHLY 表示每一月
WEEKLY 表示每一周
DAILY 表示每一天
HOURLY 表示每小时
MINUTELY 表示每分钟
SECONDLY 表示每秒钟

so 上面的 (FREQ=MONTHLY;BYMONTHDAY=1,5,-1) MONTHLY表示周期为每月执行,BYMONTHDAY表示每月那几天执行;

手动执行计划

SQL> EXEC DBMS_SCHEDULER.RUN_JOB('DB_BACKUP');

注意:默认情况下任务是不启用的,除非创建计划时设置了(enabled=>true),so 如果计划没有启用,首先启用它:

EXEC DBMS_SCHEDULER.enable('DB_BACKUP');

删除计划

SQL> exec dbms_scheduler.drop_job('DB_BACKUP');

--Then end(2015-05-18)

转自:http://www.cnblogs.com/lanston/p/use_dbms_scheduler_explain_job.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值