oracle job 4000 1 1,oracle創建job並執行job及JOB問題解決匯總

即可.4、查看job運行情況select * from user_jobs;

select * from dba_jobs_running;

select * from dba_jobs;

JOB問題解決匯總:

一。JOB為什么不運行?

1.先來了解一下JOB的參數說明:與job相關的參數一個是job_queue_processes,這個是運行JOB時候所起的進程數,當然系統里面JOB大於這個數值后,就會有排隊等候的,最小值是0,表示不運行JOB,最大值是36,在OS上對應的進程時SNPn,9i以后OS上管理JOB的進程叫CJQn。可以使用下面這個SQL確定目前有幾個SNP/CJQ在運行。

select * from v$bgprocess,這個paddr不為空的snp/cjq進程就是目前空閑的進程,有的表示正在工作的進程。

另外一個是job_queue_interval,范圍在1--3600之間,單位是秒,這個是喚醒JOB的process,因為每次snp運行完他就休息了,需要定期喚醒他,這個值不能太小,太小會影響數據庫的性能。

2.診斷:先確定上面這兩個參數設置是否正確,特別是第一個參數,設置為0了,所有JOB就不會跑,確認無誤后,我們繼續向下。

3.使用下面的SQL察看JOB的的broken,last_date和next_date,last_date是指最近一次job運行成功的結束時間,next_date是根據設置的頻率計算的下次執行時間,根據這個信息就可以判斷JOB上次是否正常,還可以判斷下次的時間對不對,SQL如下:

select * from dba_jobs

有時候我們發現他的next_date是4000年1月1日,說明job要不就是在running,要不就是狀態是break(broken=Y),如果發現JOB的broken值為Y,找用戶了解一下,確定該JOB是否可以broken,如果不能broken,那就把broken值修改成N,修改再使用上面的SQL察看就發現他的last_date已經變了,JOB即可正常運行,修改broken狀態的SQL如下:

declare

BEGIN

DBMS_JOB.BROKEN(,FALSE);

END;

4.使用下面的SQL查詢是否JOB還在Running

select * from dba_jobs_running

如果發現JOB已經Run了很久了還沒有結束,就要查原因了。一般的JOB running時會鎖定相關的相關的資源,可以查看一下v$access和v$locked_object這兩個view,如果發現其他進程鎖定了與JOB相關的Object,包括PKG/Function/Procedure/Table等資源,那么就要把其他進程刪除,有必要的話,把JOB的進程也刪除,再重新跑看看結果。

5.如果上面都正常,但是JOB還不run,怎么辦?那我們要考慮把JOB進程重啟一次,防止是SNP進程死了造成JOB不跑,指令如下:

alter system set job_queue_processes=0 --關閉job進程,等待5--10秒鍾

alter system set job_quene_processes=5 --恢復原來的值

6.Oracle的BUG

Oracle9i里面有一個BUG,當計數器到497天時,剛好達到它的最大值,再計數就會變成-1,繼續計數就變成0了,然后計數器將不再跑了。如果碰到這種情況就得重啟數據庫,我們這邊有一個生產型的數據庫版本是9205,就發生過這樣一次問題,后來和用戶約時間重啟后就沒問題了。但是其他的Oracle7345和Oracle8i的數據庫沒有發現這個問題。

7.數據庫上的檢查基本上就這多,如果JOB運行還有問題,那需要配合用戶察看一下是否是程序本身的問題,比如處理的資料量大,或者網絡速度慢等造成運行時過長,那就需要具體情況具體分析了。我們可以通過下面的SQL手工執行一下JOB看看:

declare

begin

dbms_job.run(_ID)

end;

如果發現JOB執行不正常,就要結合程序具體分析一下。通過語句

show parameter job_queue_process;

來查看oracle中job_queue_process的值。當job_queue_process值為0時表示全部停止oracle的job。可以通過語句

ALTER SYSTEM SET job_queue_processes = 10;

來修改oracle中job_queue_process的值(這里改為10,job_queue_process的值該設為多少是另外的問題),不過這種修改是動態的,當oracle重新啟動后job_queue_process的值將仍然從\%ORACLE_HOME%\admin\mydb\pfile\init.ora文件中讀取。

查詢job的情況。

show paramter background_dump_dest.

看alter.log 和trace

請問我如何停止一個JOB

SQL> exec dbms_job.broken(1,true)

PL/SQL 過程已成功完成。

SQL>commit //必須提交否則無效

啟動作業

SQL> exec dbms_job.broken(1,false)

PL/SQL 過程已成功完成。

停其他用戶的job

SQL>exec sys.dbms_ijob.broken(98,true);

SQL>commit;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值