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...