20181130 job

job可以调用存储过程完成自己想达到的目的

实验:通过job实现每一分钟插入一个数据
1、创建用户
create user dbmonitor identified by oracle;
grant dba to dbmonitor;

2、创建测试表
conn dbmonitor/oracle
create table test_job(para_date date);
insert into test_job values(sysdate);
commit;
select * from test_job;
PARA_DATE

30-NOV-18

3、创建存储过程
create or replace procedure test_jobproce as
begin
insert into test_job values(sysdate);
end test_jobproce;

– 调用过程测试
begin
test_jobproce;
end;

4、创建job,建立job后默认是马上执行的
declare
job number;
BEGIN
DBMS_JOB.SUBMIT(
JOB => test_job_really, /自动生成JOB_ID/
WHAT => ‘test_jobproce;’, /需要执行的存储过程名称或SQL语句/
NEXT_DATE => sysdate+3/(2460), /初次执行时间-下一个3分钟/
INTERVAL => ‘trunc(sysdate,’‘mi’’)+1/(24
60)’ /每隔1分钟执行一次/
);
commit;
end;

declare test_job_really number;
begin
dbms_job.submit(test_job_really,‘test_jobproce;’,sysdate,‘sysdate+1/1440’);
commit;
end;

–test_job_really job名字
–test_jobproce 存储过程名字
–sysdate 执行时间,现在
–sysdate+1/1440 下一次执行时间1分钟


每小时 sysdate+1/24
INTERVAL参数常用值示例

每天午夜12点 ‘‘TRUNC(SYSDATE + 1)’’
每天早上8点30分 ‘‘TRUNC(SYSDATE + 1) + (860+30)/(2460)’’
每星期二中午12点 ‘‘NEXT_DAY(TRUNC(SYSDATE ), ‘’’‘TUESDAY’’’’ ) + 12/24’’
每个月第一天的午夜12点 ‘‘TRUNC(LAST_DAY(SYSDATE ) + 1)’’
每个季度最后一天的晚上11点 ‘‘TRUNC(ADD_MONTHS(SYSDATE + 2/24, 3 ), ‘‘Q’’ ) -1/24’’
每星期六和日早上6点10分 ‘‘TRUNC(LEAST(NEXT_DAY(SYSDATE, ‘’’‘SATURDAY"), NEXT_DAY(SYSDATE, “SUNDAY”))) + (6×60+10)/(24×60)’’
每3秒钟执行一次 ‘sysdate+3/(246060)’
每2分钟执行一次 ‘sysdate+2/(24*60)’

1:每分钟执行
Interval => TRUNC(sysdate,‘mi’) + 1/ (2460) --每分钟执行
interval => 'sysdate+1/(24
60)’ --每分钟执行
interval => ‘sysdate+1’ --每天
interval => ‘sysdate+1/24’ --每小时
interval => 'sysdate+2/2460’ --每2分钟
interval => 'sysdate+30/24
6060’ --每30秒
2:每天定时执行
Interval => TRUNC(sysdate+1) --每天凌晨0点执行
Interval => TRUNC(sysdate+1)+1/24 --每天凌晨1点执行
Interval => TRUNC(SYSDATE+1)+(8
60+30)/(24*60) --每天早上8点30分执行
3:每周定时执行
Interval => TRUNC(next_day(sysdate,‘星期一’))+1/24 --每周一凌晨1点执行
Interval => TRUNC(next_day(sysdate,1))+2/24 --每周一凌晨2点执行
4:每月定时执行
Interval =>TTRUNC(LAST_DAY(SYSDATE)+1) --每月1日凌晨0点执行
Interval =>TRUNC(LAST_DAY(SYSDATE))+1+1/24 --每月1日凌晨1点执行
5:每季度定时执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),‘q’) --每季度的第一天凌晨0点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE,3),‘q’) + 1/24 --每季度的第一天凌晨1点执行
Interval => TRUNC(ADD_MONTHS(SYSDATE+ 2/24,3),‘q’)-1/24 --每季度的最后一天的晚上11点执行
6:每半年定时执行
Interval => ADD_MONTHS(trunc(sysdate,‘yyyy’),6)+1/24 --每年7月1日和1月1日凌晨1点
7:每年定时执行
Interval =>ADD_MONTHS(trunc(sysdate,‘yyyy’),12)+1/24 --每年1月1日凌晨1点执行

5、查看job信息
DBMONITOR@orcl> select JOB,LOG_USER,PRIV_USER,SCHEMA_USER,LAST_DATE,LAST_SEC,THIS_DATE,THIS_SEC,NEXT_DATE,NEXT_SEC,INTERVAL from user_jobs;

   JOB LOG_USER   PRIV_USER  SCHEMA_USE LAST_DATE LAST_SEC THIS_DATE THIS_SEC NEXT_DATE NEXT_SEC INTERVAL

 4 DBMONITOR  DBMONITOR  DBMONITOR  30-NOV-18 14:42:03			  30-NOV-18 14:43:03 sysdate+1/1440

管理job:
—停止job 25是建立的job test_job_really
begin
dbms_job.broken(4,true);
commit;
end;

–启动job
begin
dbms_job.run(4);
commit;
end;

–删除job

begin
dbms_job.remove(2);
commit;
end;


SYS@orcl> DROP PROCEDURE test_jobproce;

Procedure dropped.

修改间隔时间
begin
dbms_job.interval(4,‘sysdate+10/1440’);
commit;
end;

6.修改下次执行时间
begin
dbms_job.next_date(4,sysdate);
commit;
end;

========记一次job执行失败的案例
在交换库上有一个job 43,12月3日监控到告警,12月10日监控到告警,job的执行频率是每周周一凌晨执行。

告警信息如下:

DBA通过数据库的job视图找到以下信息:
SQL> select TOTAL_TIME,failures,BROKEN,JOB,LOG_USER,PRIV_USER,SCHEMA_USER,LAST_DATE,NEXT_DATE,NEXT_SEC,INTERVAL from dba_jobs where job=43;

TOTAL_TIME FAILURES B JOB LOG_USER PRIV_USER SCHEMA_USE LAST_DATE NEXT_DATE NEXT_SEC INTERVAL


112479          0 N   43 ECIQ_INTER ECIQ_INTER ECIQ_INTER 2018-12-10 14:58:08 2018-12-17 00:00:00 00:00:00         TRUNC(next_day(sysdate,2))
                         NAL        NAL        NAL

DBA指出此job的FAILURES 为0,说明此job执行成功了。(TOTAL_TIME 是从开始到现在执行此job一共用的时间;LAST_DATE是上一次成功执行的时间)
但是发现每周一凌晨执行,通过last_date计算可以发现执行了14:58,时间有点长。

然后在数据库的alter日志中发现在14:56时候作业出现了报错:
Mon Dec 10 14:56:10 2018
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl3/trace/orcl3_ora_63701180.trc:
ORA-12012: 自动执行作业 43 出错
ORA-03135: 连接失去联系
ORA-06512: 在 “ECIQ_INTERNAL.P_INTERNAL_MON_TJ”, line 11
ORA-06512: 在 line 1
Errors in file /u01/app/oracle/diag/rdbms/orcl/orcl3/trace/orcl3_ora_63701180.trc:
ORA-00604: 递归 SQL 级别 1 出现错误
ORA-03113: 通信通道的文件结尾
ORA-12012: 自动执行作业 43 出错
ORA-03135: 连接失去联系
ORA-06512: 在 “ECIQ_INTERNAL.P_INTERNAL_MON_TJ”, line 11
ORA-06512: 在 line 1
Mon Dec 10 15:19:24 2018

总结:FAILURES 是0是由于此作业没有执行完成;LAST_DATE和alter报错说明此作业执行过程中遇到了报错。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值