首页 > 数据库 >Oracle 定时任务job实际应用

Oracle 定时任务job实际应用

时间:2023-05-11 14:34:53浏览次数:35  
标签:dbms 任务 next job Oracle 定时 jobno

目录

一、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);

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

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

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

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

三、初始化相关参数job_queue_processes

  • job_queue_process表示oracle能够并发的job的数量,当job_queue_process值为0时表示全部停止oracle的job
  • 查看job_queue_processes参数
show parameter job_queue_process;
或者
select * from v$parameter where name='job_queue_processes';
  • 修改job_queue_processes参数
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 is
begin
  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:14
1                              2020-12-30 13:03:14
1                              2020-12-30 13:04:14
1                              2020-12-30 13:08:14
1                              2020-12-30 13:06:14
1                              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)

标签:dbms,任务,next,job,Oracle,定时,jobno
From: https://www.cnblogs.com/xiezhr/p/17343566.html

相关文章

  • Oracle之table()函数的使用,提高查询效率
    目录一、序言二、table()函数使用步骤三、table()具体使用实例3.1table()结合数组使用3.2table()结合PIPELINED函数(这次报表使用的方式)3.3table()结合系统包使用一、序言前段时间一直在弄报表,快被这些报表整吐了,然后接触到了Oracle的table()函数。所以今天把table()函数的......
  • gitlab--job 分组
    job分组作业当我们的job有很多的时候,如果我们写成一个stage的话,会显的很多,可以自动将相似的工作组合在一起。如果作业名称以某种方式格式化,它们将在常规管道图(而不是迷你图)中折叠成一个组要创建一组作业,请在CI/CD管道配置文件中,用数字和以下内容之一分隔每个作业名称:斜......
  • Oracle行级触发器的使用
    Oracle行级触发器的使用1、创建触发器并使用dblink在插入时进行数据同步异库异表同步createorreplacetriggertriggerName--触发器名称afterinsertontableName--操作的表foreachrow——行级触发器declare--这里是关键的地方,在变量申明的地方,指定自定义事务处......
  • linux 设置定时任务
    这里我们定时清理缓存(AI训练经常导致缓存没有及时清理,后面的读写操作就很慢)书写启动文件sudovimcleanBuff.sh#!/bin/bashecho"开始清理缓存"#写入硬盘,防止数据丢失sync;sync;sync;#延迟10Ssleep10echo1>/proc/sys/vm/drop_cachesecho2>/proc/sys/vm/drop......
  • Oracle误删除数据的恢复方法 分为两种方法:SCN和时间戳两种方法恢复。获得当前数据库的
    Oracle误删除数据的恢复方法分为两种方法:SCN和时间戳两种方法恢复。原文链接:http://www.taodudu.cc/news/show-202061.html Oracle误删数据的恢复,分为两种方法:SCN和时间戳两种方法恢复。一、通过SCN恢复删除且已提交的数据 1、获得当前数据库的SCN号selectcurrent_scn......
  • go添加一个定时任务
    packagetimerimport("sync""github.com/robfig/cron/v3")typeTimerinterface{AddTaskByFunc(taskNamestring,specstring,taskfunc(),option...cron.Option)(cron.EntryID,error)AddTaskByJob(taskNamestring,specstring,jo......
  • linux定时备份日志文件脚本,重启jar简易脚本
     1.编写脚本文件saveLogs.sh (备份文件到指定位置重命名,然后情况文件继续写入)  cp/opt/zcgl/zcgl.log/opt/zcgl/logs/zcgl-`date+%Y%m%d`.log&  sleep2  >zcgl.log2. 定时脚本crontab 打开设置:crontab-e 输入内容:5923***sh/opt/zcgl/saveLogs.......
  • Oracle TO_CHAR(待格式化数据, 'FM99999990.00')
    作用:对数据进行格式化①其9代表:如果存在数字则显示数字,不存在则显示空格②其0代表:如果存在数字则显示数字,不存在则显示0,即占位符。③其FM代表:删除如果是因9带来的空格,则删除之......
  • 直播平台软件开发,判断当前时间是否在规定时间内
    直播平台软件开发,判断当前时间是否在规定时间内//判断是否在选择的时间段内使用if(!"".equals(Public.mapTo(couponsEntity.getUseStartTime(),""))){  //存在设置时间区间时  SimpleDateFormatdf=newSimpleDateFormat("HH:mm:ss");//设置日期格式  Datenow=n......
  • PG系、Oracle、MySQL数据库在特定场景下结果差异分析
    PG系、Oracle、MySQL数据库在特定场景下结果差异分析作者:余从佳更新时间:2022-07-0110:52人气值:416 本文主要介绍以PolarDBO引擎、ADBPG为代表的PG系数据库在某种特定事务场景下,其事务结果与Oracle、MySQL不同的现象,并分析该现象出现的原因。一、数据初始化 Cr......