一些專案中使用了job定期執行sql語句。如果要執行的sql語句是基於dblink對遠端資料庫的訪問,那麼有時候就會出現該sql語句長時間執行一直不結束的情況。並且這時在遠端資料庫上並沒有鎖導致該sql語句等待(這可能是由於網路問題觸發的oracle的乙個bug吧,遠端資料庫與本地資料之間有防火牆時比較容易出現這個現象)。
下面總結了如何判斷該job是否長時間執行沒結束,並說明了處理步驟。
1)、觀察job情況。
system使用者下執行語句select * from dba_jobs;找到有問題的job,記錄下該job在查詢結果中job列的取值,該取值稱為job號。
broken欄位為n,且this_date欄位的時間比當前時間減去執行週期要晚(根據interval欄位判斷),則job是正常的。如果this_date欄位沒有值,一般認為job當前沒有在執行。
如果broken欄位n,並且this_date時間不對(例如是幾個小時以前,甚至幾天以前),則說明該job某一次週期一直沒有執行完。
如果出現這種現象,就說明該job可能出問題了。
2)、查詢該job目前正在執行時的會話編號sid
select * from dba_jobs_running where job='剛才查到的job號';
在返回結果中記錄sid列的取值
3)、檢視該會話
select * from v$session where sid='剛才查到的sid'
記錄下返回結果的 serial#列(會話序列號),paddr列(執行緒位址)
4)、 取得會話的執行緒號
select spid from v$process where addr='剛才查到的執行緒位址' ;
記錄下列spid,稱為執行緒號
5)、使用oracle命令殺會話
alter system kill session '會話編號sid,會話序列號serial#';
6)、檢視是否成功殺掉該會話(方法與步驟一相同,多執行幾次select * from dba_jobs;觀察結果)
7)、如果沒有殺掉會話,就是用作業系統命令殺執行緒(或程序)
這裡給出windows下殺oracle會話占用的執行緒的方法
登入到資料庫所在的作業系統中,開啟windows命令列,鍵入命令: orakill 資料庫sid 剛才查到的執行緒號spid
例如 orakill orcl 12345
這裡給出乙個自動清理問題job的儲存過程,由於是儲存過程,只能使用alter system kill 來殺會話,有時候會話只被標記為killed,並不能真正結束,job也無法啟動下乙個週期。
create or replace procedure sys.pro_kill_job as
/*清理job567 568 569 長期執行不結束的情況*/
/*30分鐘超時*/
cursor mycur is
select ' alter system kill session '''||s.sid ||','|| s.serial#||''' immediate ' as sql_kill , j.job
from dba_jobs_running j,v$session s
where j.sid=s.sid and
this_date <(sysdate-30/24/60) and
s.sid is not null and s.serial# is not null
and
( j.job= 567
or j.job=568
or j.job=569 ) ;
v_sql_kill varchar2(500);
v_job number ;
begin
open mycur;
loop
fetch mycur
into v_sql_kill , v_job;
exit when mycur%notfound;
dbms_output.put_line(v_sql_kill);
execute immediate v_sql_kill ;
communication.sp_db_log('pro_kill_job', 1, null, v_job||' is killed');
commit;
end loop;
close mycur;
exception
when others then
communication.sp_db_log('pro_kill_job', 1, sqlcode, sqlerrm);
commit;
end pro_kill_job;
oracle定時器job長時間執行無法結束
iamlaosong文 我用job每天定時執行一些儲存過程,以便對資料進行處理。正常情況下,這些儲存過程執行完畢需要幾十秒時間,但有時不知道什麼原因一天都執行不完,導致第二天的job也無法順利執行。如果不進行人工干預,這個job也許就再也不會執行下去了。通過查詢和測試我知道卡死的原因是其中的一些sq...
1 12 長時間執行乙個任務
1.12.長時間執行乙個任務 問題 我要長時間執行乙個任務 解決辦法 使用 timer 類,或者監聽 sprite 的 enterframe 事件 討論 timer 類是actionscript 3.0新增的,來代替早期的 setinterval 和 settimeout 函式。當建立timer類的...
oracle中時間運算
1 oracle支援對日期進行運算 2 日期運算時是以天為單位進行的 3 當需要以分秒等更小的單位算值時,按時間進製進行轉換即可 4 進行時間進製轉換時注意加括號 見示例中紅色括號 否則會出問題 sql alter session set nls date format yyyy mm dd hh ...