1 相關(guān)表、視圖 dba_jobs all_jobs user_jobs 包含登錄用戶所有的JOB信息 dba_jobs_running 包含正在運(yùn)行job相關(guān)信息注意 須使用oracle的sys用戶登錄到數(shù)據(jù)庫(kù),才能查看dba_jobs_running, v$process, v$session表的信息。同時(shí),登錄操作系統(tǒng)時(shí),要用oracle用戶。2 問(wèn)題描述為同事解決一個(gè)因?yàn)榫W(wǎng)絡(luò)連接情況不佳時(shí),執(zhí)行一個(gè)超長(zhǎng)時(shí)間的SQL插入操作。既然網(wǎng)絡(luò)狀況不好,就選擇了使用一次性使用JOB來(lái)完成該插入操作。在JOB執(zhí)行一段時(shí)間后,我發(fā)現(xiàn)被插入表有些問(wèn)題(慚愧,當(dāng)時(shí)也沒(méi)有先檢查檢查就做了)。準(zhǔn)備停止JOB,因?yàn)樵贘OB運(yùn)行情況下,我的所有修改都會(huì)報(bào)系統(tǒng)資源忙的錯(cuò)誤。強(qiáng)行KILL SESSION是行不通的,因?yàn)檫^(guò)會(huì)兒,JOB還會(huì)重新啟動(dòng),如果執(zhí)行的SQL也被KILL了通過(guò)重新啟動(dòng)的JOB還是會(huì)被再次新執(zhí)行的。3 解決辦法 比較好的方法應(yīng)該是; 1. 首先確定要停止的JOB號(hào) 在10g中可通過(guò)Dba_Jobs_Running進(jìn)行確認(rèn)。 查找正在運(yùn)行的JOB: select sid from dba_jobs_running; 查找到正在運(yùn)行的JOB的spid: select a.spid from v$process a ,v$session b where a.addr=b.paddr and b.sid in (select sid from dba_jobs_running); 2. Broken你確認(rèn)的JOB 注意使用DBMS_JOB包來(lái)標(biāo)識(shí)你的JOB為BROKEN。 SQL EXEC DBMS_JOB.BROKEN(job#,TRUE); 注意:當(dāng)執(zhí)行完該命令你選擇的這個(gè)JOB還是在運(yùn)行著的。 3. Kill 對(duì)應(yīng)的Oracle Session 應(yīng)為BROKEN后該JOB還在運(yùn)行,如果要求該JOB立刻停止,就需要找到該job的對(duì)應(yīng)SESSION(SID,SERIAL#),然后執(zhí)行以下命令: ALTER SYSTEM KILL SESSION 'sid,serial#'; 或者直接KILL對(duì)應(yīng)的操作系統(tǒng)的SESSION,如果使用ALTER SYSTEM KILL SESSION執(zhí)行很長(zhǎng)時(shí)間,其實(shí)可以使用OS的命令來(lái)快速KILL掉SESSION. For Windows, at the DOS Prompt: orakill sid spid For UNIX at the command line kill –9 spid 4. 檢查你的JOB是否還在運(yùn)行 檢查你要停止的JOB是否還在運(yùn)行,其實(shí)多數(shù)情況下,應(yīng)該都已經(jīng)停止了。尤其執(zhí)行的第三步的“殺手”命令。如果真的還是沒(méi)有停止,只好從第一道第三步重新做一下了。 5. 將Job Queue Processes的數(shù)目修改為0 首先確認(rèn)當(dāng)前的Job Queue Processes的數(shù)目 SQL col value for a10 SQL select name,value from v$parameter where name ='job_queue_processes'; 然后將Job Queue Processes的數(shù)目修改為0 SQL ALTER SYSTEM SET job_queue_processes = 0; 保證所有的JOB都會(huì)停止。 6. 修改你要修改的任何東西,甚至是JOB內(nèi)的內(nèi)容。 7. 修改完成后,將job的BROKEN狀態(tài)停止。SQLEXEC DBMS_JOB.BROKEN(job#,FALSE): 8. 恢復(fù)job_queue_processes的原始值 ALTER SYSTEM SET job_queue_processes = original_value; 至此整個(gè)停止并修改JOB完成. 但是需要另外注意一下的是,在MARK一個(gè)BROKEN狀態(tài)的時(shí)候,因?yàn)镴OB內(nèi)部執(zhí)行SQL的原因,所以執(zhí)行時(shí)或許要“煎熬”一段時(shí)間。所以在建立JOB時(shí)一定要仔細(xì)考慮,同時(shí)如果可能可以在你設(shè)計(jì)的PL/SQL代碼中,增加一些判斷“停止信號(hào)”的部分。來(lái)避免費(fèi)力執(zhí)行上面的步驟。 畢竟,ORACLE在執(zhí)行JOB時(shí),還是很“倔強(qiáng)”的 -:) 4 附件:ORAKILL用法很多時(shí)候遇到某個(gè)session一直處于active,使得CPU一直處于搞使用狀態(tài),雖然kill 了,但是卻不能夠使得使得線程結(jié)束。 kill session只是kill這個(gè)進(jìn)程,但是線程一直處于活動(dòng)狀態(tài)。需要真正的kill線程才能夠解決cpu使用率高的問(wèn)題。os :windows2003ORAKILL用法是 orakill sid spid 其中sid為實(shí)例名,spid為線程號(hào)。怎么樣取得這個(gè)spid呢?以下給出查找spid的語(yǔ)句。select spid, osuser, s.program from v$process p, v$session s where p.addr=s.paddr and s.sid = XXX;--說(shuō)明:XXX為session的sid (不是數(shù)據(jù)庫(kù)SID 呵呵)。自己輸入就可以。orakill instance_name spid這樣就能夠成功解決cpu使用率高的問(wèn)題

創(chuàng)新互聯(lián)是一家專業(yè)提供甘南企業(yè)網(wǎng)站建設(shè),專注與成都網(wǎng)站建設(shè)、成都做網(wǎng)站、H5開(kāi)發(fā)、小程序制作等業(yè)務(wù)。10年已為甘南眾多企業(yè)、政府機(jī)構(gòu)等服務(wù)。創(chuàng)新互聯(lián)專業(yè)網(wǎng)站設(shè)計(jì)公司優(yōu)惠進(jìn)行中。
job一旦運(yùn)行是無(wú)法停止的(除非斷電、停止數(shù)據(jù)庫(kù)),但是使用 update uesr_jobs set broken = 'Y' where job = '你的job編號(hào)',broken后,job就無(wú)法啟動(dòng)了。要啟動(dòng)的話,得修改broken和next_date 參數(shù)。
找出正在執(zhí)行的JOB編號(hào)及其會(huì)話編號(hào) SELECT SID,JOB FROM DBA_JOBS_RUNNING; 停止該JOB的執(zhí)行 SELECT SID,SERIAL# FROM V$SESSION WHERE SID='SID'; ALTER SYSTEM KILL SESSION 'SID,SERIAL'; EXEC DBMS_JOB.BROKEN(JOB,TRUE); 實(shí)例分析: 1,查詢正在運(yùn)行的Job,通過(guò)查詢有兩個(gè),和進(jìn)程占用較多的是兩個(gè)ORACLE進(jìn)程符合。 SQL SELECT SID,JOB FROM DBA_JOBS_RUNNING; SID JOB ---------- ---------- 12 116 16 117 2,查詢正在運(yùn)行的job的信息 SQL SELECT SID,SERIAL# FROM V$SESSION WHERE SID='12'; SID SERIAL# ---------- ---------- 12 4 SQL SELECT SID,SERIAL# FROM V$SESSION WHERE SID='16'; SID SERIAL# ---------- ---------- 16 1 3,利用查詢出來(lái)的job信息將job結(jié)束掉 SQL ALTER SYSTEM KILL SESSION '12,4'; System altered. SQL ALTER SYSTEM KILL SESSION '16,1'; System altered. 4,如果不希望運(yùn)行上述job的話,可以將job設(shè)置為broken. EXEC DBMS_JOB.BROKEN(116,TRUE); EXEC DBMS_JOB.BROKEN(117,TRUE); 根據(jù)個(gè)人經(jīng)驗(yàn),這種方法并不會(huì)立即中斷job的運(yùn)行。 66
網(wǎng)站標(biāo)題:oracle如何停job,oracle如何停止執(zhí)行命令
網(wǎng)站路徑:http://chinadenli.net/article41/dsggjhd.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供定制網(wǎng)站、網(wǎng)站設(shè)計(jì)、網(wǎng)站制作、做網(wǎng)站、虛擬主機(jī)、網(wǎng)站維護(hù)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)