查询job和sql的执行情况

参考链接

  1. oracle job 定时执行 存储过程
  2. Oracle job procedure 存储过程定时任务
  3. Oracle Job定时任务的使用详解
  4. oracle 如何停job

一、起因

  这两天产品的人提的请求。昨天要我帮他查一条ID为240873的JOB在执行哪条SQL语句,啥,JOBID是什么东东???心中傻逼三连问,还是硬着头皮接下来了。感谢大神队友的帮助,我先贴个解决方案吧

SET lines 2000

SELECT a.job,
       b.inst_id,
       b.sid,
       s.serial#,
       a.log_user,
       s.username,
       s.sql_id,
       s.event,
       a.what,
       s.blocking_instance,
       s.blocking_session,
       Round(b.ctime / 60) mins,
       a.last_date,
       a.this_date
FROM   dba_jobs a,
       gv$lock b,
       gv$session s
WHERE  a.job = b.id2
       AND s.sid = b.sid
       AND s.inst_id = b.inst_id
       AND b.type = 'jq'
       AND a.job = &job_id;

查询出在执行的SQL语句后,又提了个请求说要我帮他停了这个JOB(大哥,我连JOB是什么东西都不知道啊),在运维平台找到kill的button,总算交差了。事后补了下知识,给出停JOB的代码

EXEC dbms_job.broken(240873, TRUE);

  今天,产品的人又找到我,说有个ID为414811的JOB执行了一半就不执行了,也没报错,要我帮他找此JOB最后执行的SQL语句。。。(给了个肯定的否定的答复,至今未习得此技能,若有还请告知一下,小生在此感激不尽),随后改变请求,要我帮他某条形如"xxxxxxxx"的SQL语句有没有被执行过,附上大神师兄给我这个垃圾师弟的查询语句

SELECT *
FROM   gv$sql
WHERE  sql_text LIKE '%xxxxxxx%';

二、学习

  • 关于JOB

  JOb就是Oracle提供的一个定时任务功能,定时为用户执行一些代码块。

  • 上个JOB小李子
  1. 建表
CREATE TABLE JOB_TEST
  (
     a DATE
  );
  1. 创建存储过程
CREATE OR REPLACE PROCEDURE JOB_PRO_TEST AS 
BEGIN
INSERT INTO JOB_TEST VALUES(sysdate);
END;
/
  1. 创建JOB
VARIABLE job2019 number;

BEGIN 
dbms_job.submit(:job2019, 'JOB_PRO_TEST;', sysdate, 'sysdate+1/1440');
END;
/
  1. 运行JOB
BEGIN
dbms_job.run(:job2019);
END;
/
  1. 停止JOB
BEGIN
dbms_job.broken(:job2019, true);
END;
/

COMMIT;
  1. 删除JOB
BEGIN
dbms_job.remove(:job2019);
END;
/

你可能感兴趣的:(查询job和sql的执行情况)