oracle建立job 定時殺死慢查詢

2021-10-03 03:28:48 字數 2363 閱讀 1738

背景介紹

應用這邊執行緩慢,卡頓嚴重,檢視資料庫所在伺服器,cpu100%,懷疑有大量查詢占用資源導致。故查詢db中的慢sql,發現確實有耗時相當長的sql。

用kill 命令殺掉該程序之後,還是過一段時間後產生,但一時半會沒法定位sql的產生**,故只能想辦法先定時處理掉這部分慢sql。

這裡想到了利用oracle 建立儲存過程,迴圈查詢慢sql,並kill session,並用oracle的job來定時執行該儲存過程。

操作過程(基本可以複製貼上使用)

以下是進入sqlplus進行的操作

1 建立表,用於記錄被kill的sql;

--create log table 

create table kill_sess_hist as

select s.*,t.start_time

from v$transaction t,v$session s

where s.taddr=t.addr and t.start_time2 建立儲存過程;

create or replace procedure p_kill_ses_bef1s

isbegin

forrec_act_sess in (select s.sid,

s.serial#,

s.machine,

s.last_call_et,

s.status,

s.username,

s.type,

s.sql_id,

s.event,

t.start_time

from v$transaction t, v$session s

where s.taddr = t.addr

and t.start_time <

to_char((sysdate - 1 / 1440), 'yy/hh/dd hh24:mi:ss'))

loop

insert into kill_sess_hist

(sid,

serial#,

machine,

last_call_et,

username,

type,

sql_id,

start_time,

event)

values

(rec_act_sess.sid,

rec_act_sess.serial#,

rec_act_sess.machine,

rec_act_sess.last_call_et,

rec_act_sess.username,

rec_act_sess.type,

rec_act_sess.sql_id,

rec_act_sess.start_time,

rec_act_sess.event);

execute immediate 'alter system kill session ' || chr(39) ||

rec_act_sess.sid || ',' || rec_act_sess.serial# ||

chr(39);

dbms_output.put_line('alter system kill session ' || chr(39) ||

rec_act_sess.sid || ',' || rec_act_sess.serial# ||

chr(39));

commit;

end loop;

end;

/

注意末尾要以「/」結尾,命令列才能執行

下圖標誌表示成功

3 呼叫儲存過程;

set serveroutput on

call p_kill_ses_bef1s();

4 建立job;

注意最後一行是乙個英文句號,表示**編輯完畢。用英文斜槓,執行該**

oracle建立定時作業(job)

oracle的job和windows的定時指令碼差不多,oracle的,具體如下 建立job語句 begin sys.dbms job.submit job job,what to17 check next date to date 14 11 2014 06 00 00 dd mm yyyy hh...

oracle 建立定時任務job,建立sql

建立定時任務,判斷如果已有這個定時任務,則刪除重建 declare jobnum number 5 0 jobid number 5 0 begin 查是否已經存在,排程的job select count into jobnum from dba jobs where upper what like...

oracle 建立job定時執行任務

先建立乙個儲存過程 例如 清空乙個表 定義好自己的job declare job1 number begin dbms job.submit job1,pro job delete sysdate,trunc sysdate 1 每天清楚記錄 end 找到你的job,找到對應的job值 select...