写点什么

Oracle 中我们什么时候需要用到定时任务?

用户头像
xiezhr
关注
发布于: 2021 年 03 月 12 日
Oracle中我们什么时候需要用到定时任务?

一、Oracle 定时任务简介


Oracle 定时任务是在 oracle 系统中一个非常重要的子系统,运用得当,可以大大提高我们系统运行和维护能力。oracle 定时任务的功能,可以在指定的时间点自行执行任务。


那么在实际工作中,什么样的场景会用到定时任务呢?下面是在实际工作中用到的真实业务场景举例


  • 在生成环境中,有时候需要在表中记录一些业务日志,系统运行时间长了之后,表中日志会越来越多,导致系统性能下降,这时候就需要用到定时任务,定时去删除表中一些时间年代比较久远垃圾数据。

  • 在某些业务场景中,明细表的数据量特别大,而需要查询明细表一下汇总数据,就需要将明细表中的数据【某天的业务产生的金额、人数等】通过计算汇总到另外表中,这样在查询的时候就能优化查询效率。而以上操作需要在业务量比较少的情况下进行【一般都在凌晨之后】,这是就需要用到定时任务。


二、dbms_job 涉及到的知识点


  • 创建 job 脚本


variable jobno number;dbms_job.submit(:jobno,       —-job号 'your_procedure;',            —-执行的存储过程, ';'不能省略 next_date,                    —-下次执行时间 'interval'                    —-每次间隔时间,interval                      以天为单位);
复制代码


上面是通过脚本创建,当然也可以通过 plsql 图形化工具来创建,具体创建过程如下




系统会自动分配一个任务号 jobno ,根据 jobno 可以进行如下定时任务操作


  • 删除 job: dbms_job.remove(jobno);


  • 修改要执行的操作: job:dbms_job.what(jobno, what);


  • 修改下次执行时间:dbmsjob.nextdate(jobno, next_date);


  • 修改间隔时间:dbms_job.interval(jobno, interval);


  • 启动 job: dbms_job.run(jobno);


  • 停止 job: dbms.broken(jobno, broken, nextdate); –broken 为 boolean 值


三、初始化相关参数 jobqueueprocesses


  • jobqueueprocess 表示 oracle 能够并发的 job 的数量,当 jobqueueprocess 值为 0 时表示全部停止 oracle 的 job

  • 查看 jobqueueprocesses 参数


show parameter job_queue_process;或者select * from v$parameter where name='job_queue_processes';
复制代码


  • 修改 jobqueueprocesses 参数


alter system set job_queue_processes = 10;
复制代码


四、实际创建一个定时任务(一分钟执行一次),实现定时一分钟往表中插入数据


4.1 创建需要定时插入数据的目标表


create table t_test (id varchar2(30),                  name varchar2(30)                 );
复制代码


4.2 创建定时执行的存储过程


create or replace procedure proce_t isbegin  insert into t_test    (id, name)  values    ('1', to_char(sysdate, 'yyyy-mm-dd hh24:mi:ss'));  commit;end proce_t;/
复制代码


4.3 创建定时一分钟定时任务 job


variable jobno number;begin dbms_job.submit(:jobno,'proce_t;', sysdate,  'sysdate+1/24/60');  commit;end;
复制代码


4.5 可以根据以下语句查询刚创建好的 job


select job, next_date, next_sec, failures, broken from user_jobs where job = '1424'
复制代码


查询结果如下


SQL> select job, next_date, next_sec, failures, broken from user_jobs where job = '1424'  2  /        JOB NEXT_DATE   NEXT_SEC           FAILURES BROKEN---------- ----------- ---------------- ---------- ------      1424 2020-12-30  13:07:14                  0 N
复制代码


其中 broken = N 表示该 job 已经生效


我们再来查看目标表中有没有定时插入数据


SQL> select * from t_test; ID                             NAME------------------------------ ------------------------------1                              2020-12-30 13:05:141                              2020-12-30 13:03:141                              2020-12-30 13:04:141                              2020-12-30 13:08:141                              2020-12-30 13:06:141                              2020-12-30 13:07:14 6 rows selected
复制代码


可以看到,定时一分钟插入了一条数据。


4.6 如果我们不需要这个定时任务了,那要怎么停止呢?


1、根据 jobno,执行以下脚本可以停止 job


SQL> begin  2    dbms_job.broken(1424, true, sysdate);  3    commit;  4  end;  5  / PL/SQL procedure successfully completed
复制代码


再来查看定时任务是否停用成功


SQL> select job, next_date, next_sec, failures, broken from user_jobs where job = '1424';        JOB NEXT_DATE   NEXT_SEC           FAILURES BROKEN---------- ----------- ---------------- ---------- ------      1424 4000-01-01  00:00:00                  0 Y
复制代码


我们发现 BROKEN=Y 说明定时任务已经停止成功了


4.7 启用刚才停用的定时任务


SQL> begin  2   dbms_job.run(1424);  3   commit;  4  end;  5  / PL/SQL procedure successfully completed
SQL> select job, next_date, next_sec, failures, broken from user_jobs where job = '1424'; JOB NEXT_DATE NEXT_SEC FAILURES BROKEN---------- ----------- ---------------- ---------- ------ 1424 2020-12-30 13:20:53 0 N
复制代码


BROKEN = N ,刚才的定时任务又启动了


五、定时任务中 job 运行时间


下面总计了一些定时任务中常用的运行时间


  • 每分钟执行: TRUNC(sysdate,'mi') + 1/(24*60)

  • 半个小时: sysdate+30/(24*60)


  • 每天凌晨 1 点执行:TRUNC(sysdate) + 1 +1/(24)

  • 每周一凌晨 1 点执行: TRUNC(next_day(sysdate,'星期一'))+1/24

  • 每月 1 日凌晨 1 点执行: TRUNC(LAST_DAY(SYSDATE))+1+1/24

  • 每季度的第一天凌晨 1 点执行: TRUNC(ADD_MONTHS(SYSDATE,3),'Q') + 1/24

  • 每年 7 月 1 日和 1 月 1 日凌晨 1 点: ADD_MONTHS(trunc(sysdate,'yyyy'),6)+1/24

  • 每年 1 月 1 日凌晨 1 点执行: ADD_MONTHS(trunc(sysdate,'yyyy'), 12)+1/24

  • 每个小时的第 15 分钟运行 比如:8:15,9:15,10:15… trunc(sysdate,'hh')+(60+15)/(24*60)


发布于: 2021 年 03 月 12 日阅读数: 8
用户头像

xiezhr

关注

把分享变成一种习惯,再小的帆也能远航 2021.03.01 加入

还未添加个人简介

评论

发布
暂无评论
Oracle中我们什么时候需要用到定时任务?