系統中有一個JOB,由於SQL編寫的問題,導致運行了5個多小時還沒完,我想把它kill掉。
1. 首先我得查看正在跑的JOB有哪些:
SELECT /*+ RULE */ * FROM DBA_JOBS_RUNNING;
為什麼要加這個RULE提示呢,因為在你SYS沒被分析的時候,直接查詢(CBO)是非常慢的。可能在這個視圖裡查不到結果,但JOB的SESSION確實在跑。10g的話可以查dba_scheduler_job_run_details獲得更多信息。
接下來找到了這個JOB對應session的SID和對應的OS JOB進程(j000等)的SPID。
select * from gv$process s,gv$session gn where s.ADDR=gn.PADDR and gn.STATUS='ACTIVE' and gn.SCHEMANAME='A'
2. 然後,在OS上kill對應的SPID
$> kill -9 SPID
3. 過一分鐘左右的時間,再次查詢gv$session,發現此session還在,SPID變了,在OS上自動產生了一個j000進程與此session對應。
4. 將job設成broken狀態,再次 kill -9 SPID。過一分鐘左右此session沒了,OS也沒再產生新的job進程。
5. 問題來了,雖然此時session和OS進程都沒有與此JOB相關的東東存在,但此JOB的運行時間(total_time)仍在不停增加。
6. 嘗試解決方法:
(1)重啟cjq0這個進程 無效
(2)重啟DB 無效
如何解決這個total_time不停增加的問題呢?重建JOB!