oracle中job長時間執行沒有結束

2021-06-04 15:25:06 字數 2364 閱讀 3022

一些專案中使用了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 ...