oracle定時器job長時間執行無法結束

2021-07-25 13:25:01 字數 2131 閱讀 6992

iamlaosong文

我用job每天定時執行一些儲存過程,以便對資料進行處理。正常情況下,這些儲存過程執行完畢需要幾十秒時間,但有時不知道什麼原因一天都執行不完,導致第二天的job也無法順利執行。如果不進行人工干預,這個job也許就再也不會執行下去了。通過查詢和測試我知道卡死的原因是其中的一些sql語句執行時間太長,就像伺服器有時快有時慢一樣,這些sql語句執行也是時快時慢,猜想原因是不是oracle在做一些內部處理或衝突導致伺服器變慢。

人工干預也就是殺死這個job,實驗發現殺死job後再次執行這些儲存過程有時依然很慢,目前的處理辦法是殺死後暫時不再處理當天的資料,這樣可以保證第二天的job正常執行。在job正常完成的日子裡再次處理卡死那天的資料,發現儲存過程很快完成。也就是說,同樣的資料同樣的程式有時卡死,有時順利完成,能想到的原因也就是資料庫本身了。

殺死job的方法如下:

1、判斷job是否卡死

用pl/sql developer可以很輕鬆的看到job是否完成,只有檢視job屬性中next date是否變成第二天的執行時間,如果沒變,說明job沒有執行結束。也可以用下面的語句查詢:

select * from  dba_jobs_running where job='job號';

用這個語句可以查詢執行job的sid列(會話編號)的值,這個值是殺死job的引數之一。

2、用下面語句查詢殺死job的第二個引數serial#(會話序列號)

select * from v$session where sid='剛才查到的sid';

返回記錄中就有 serial#列(會話序列號),paddr列(執行緒位址)

也可以將1、2兩步合在一起執行:

select b.sid,b.serial# from dba_jobs_running a, v$session b where a.sid=b.sid and a.job='job號';

3、殺死job命令如下:

alter system kill session '會話編號sid,會話序列號serial#';

4、檢視是否成功殺掉該會話(方法與步驟一相同,多執行幾次select * from  dba_jobs_running where job='job號'觀察結果,如果殺掉了將不再有返回結果)。

5、job殺死後,被延誤的job任然會啟動

12月26日補充的實戰記錄:

24日啟動的job到26日依然沒有完成,處理如下:

1、select b.sid,b.serial# from dba_jobs_running a, v$session b where a.sid=b.sid and a.job='1';

2、alter system kill session '129,43354';  -- 根據第1步的結果殺死job

3、select * from  dba_jobs_running where job='1';  -- 無記錄,job已經殺死

4、很快job再次啟動(job的next time沒有變,this time是本次執行時間),依然很慢

5、select b.sid,b.serial# from dba_jobs_running a, v$session b where a.sid=b.sid and a.job='1';

6、alter system kill session '148,23846';  -- 根據第5步的結果殺死job

7、select * from  dba_jobs_running where job='1';  -- 無記錄,job已經殺死

8、很快job再次啟動(job的next time沒有變,this time是本次執行時間),很慢

9、修改job下次啟動時間為第二天(next time),保證job不再啟動

10、再次殺死已經啟動的job,這次job不再啟動,要等明天再看。

12月27日檢查情況:

今天job正常完成,執行時間是1分19秒。

將卡死的兩天資料重新處理一遍,一共2分23秒,一切正常。

可是昨天的job為什麼會卡死,重新啟動的job也是如此,原因再慢慢探知吧。

2023年4月7日

job再次卡死(4月6日的job),殺死(129,64082)後job再次啟動(129,64085),這是今天的job

oracle的job定時器

對於dba來說,資料庫job再熟悉不過了,因為經常要資料庫定時的自動執行一些指令碼,或做資料庫備份,或做資料的提煉,或做資料庫的效能優化,包括重建索引等等的工作。但是,oracle定時器job時間的處理上,千變萬化,今天我把比較常用寫法彙總如下 oracle定時任務有sys.dbms job包完成 ...

Oracle定時器(Job)彙總

對於 dba來說,資料庫 job再熟悉不過了,因為經常要資料庫定時的自動執行一些指令碼,或做資料庫備份,或做資料的提煉,或做資料庫的效能優化,包括重建索引等等的工作。但是,oracle 定時器job 時間的處理上,千變萬化,今天我把比較常用寫法彙總如下 job的引數一一說明一下 引數是由 submi...

oracle定時器job用法小結

顧名思義,定時器就是定時來完成某些操作,oracle中的定時器job也是這種用法,在oracle中可以通過定義job來定期執行某個程式。oracle提供內建包dbms job來執行job的相關操作,比如定義 提交 更改 停止 移除等。1 建立job 使用submit 過程,這個過程中有5個引數 jo...