参考链接
一、起因
这两天产品的人提的请求。昨天要我帮他查一条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小李子
- 建表
CREATE TABLE JOB_TEST
(
a DATE
);
- 创建存储过程
CREATE OR REPLACE PROCEDURE JOB_PRO_TEST AS
BEGIN
INSERT INTO JOB_TEST VALUES(sysdate);
END;
/
- 创建JOB
VARIABLE job2019 number;
BEGIN
dbms_job.submit(:job2019, 'JOB_PRO_TEST;', sysdate, 'sysdate+1/1440');
END;
/
- 运行JOB
BEGIN
dbms_job.run(:job2019);
END;
/
- 停止JOB
BEGIN
dbms_job.broken(:job2019, true);
END;
/
COMMIT;
- 删除JOB
BEGIN
dbms_job.remove(:job2019);
END;
/