背景介紹
應用這邊執行緩慢,卡頓嚴重,檢視資料庫所在伺服器,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...