簡體   English   中英

Oracle DBMS 作業未運行

[英]Oracle DBMS Job not running

我定義了一個從周二到周日每 5 分鍾運行一次的工作。 上午 9:00 至下午 22:00

BEGIN
DBMS_SCHEDULER.CREATE_JOB (
job_name => 'GET_INVOICES_JOB',
job_type => 'PLSQL_BLOCK',
job_action => 'BEGIN LOPES.GET_INVOICES; END;',
repeat_interval =>'FREQ=MINUTELY; INTERVAL=5; BYHOUR=9,22; BYDAY=TUE,WED,THU,FRI,SAT,SUN', 
enabled => TRUE,
comments => 'GET_INVOICES');
END;
/

但這項工作並沒有運行檢查

SELECT *
FROM USER_SCHEDULER_JOB_RUN_DETAILS 
ORDER BY LOG_DATE DESC

檢查工作似乎沒問題:

在此處輸入圖片說明

並手動運行作業它會執行該過程,但不是每 5 分鍾只執行一次

這是調度程序最常見的問題之一。 在這里,我們列出了一些常見問題及其解決方案。

1)job_queue_processes 可能太低(這是最常見的問題) job_queue_processes 的值限制了在給定時間可以運行的dbms_scheduler 和dbms_job 作業的總數。 要檢查是否是這種情況,請使用 SQL> select value from v$parameter where name='job_queue_processes'; 檢查 job_queue_processes 的當前值。 然后檢查正在運行的作業數 SQL> select count( ) from dba_scheduler_running_jobs; SQL> select count( ) from dba_jobs_running;

如果這是問題,您可以使用 SQL> alter system set job_queue_processes=1000; 增加參數。

2) max_job_slave_processes 可能太低如果此參數不為NULL,則它限制了一次可以運行的dbms_scheduler 作業的數量。 要檢查這是否是問題,請使用 SQL> select value from dba_scheduler_global_attribute where attribute_name='MAX_JOB_SLAVE_PROCESSES'; 檢查當前值。 然后檢查正在運行的作業數 SQL> select count(*) from dba_scheduler_running_jobs;

如果這是問題,您可以使用 SQL> exec dbms_scheduler.set_scheduler_attribute('max_job_slave_processes',null) 增加數字或將其設為 NULL

3) 會話數可能太低 此參數隨時限制會話數。 每個調度程序作業需要 2 個會話。 要檢查這是否是問題,請使用 SQL> select value from v$parameter where name='sessions'; 檢查當前值。 然后使用 SQL> select count(*) from v$session 檢查當前會話數;

如果數字太接近,您可以使用 SQL> alter system set job_queue_processes=200; 增加最大值。

4) 您最近是否應用了時區更新補丁或將數據庫升級到具有更新時區信息的版本? 如果您在更新時區信息時跳過任何步驟,作業可能無法運行。 要檢查是否是這種情況,請嘗試執行 SQL> select * from sys.scheduler$_job; 和 SQL> select * from sys.scheduler$_window; 並確保它們完成時沒有錯誤。

如果它引發時區警告,請重新應用升級或時區補丁,確保遵循所有步驟。

5) 數據庫是否在受限模式下運行? 如果數據庫在受限模式下運行,則不會運行任何作業(除非您使用 11g 並使用 ALLOW_RUNS_IN_RESTRICTED_MODE 屬性)。 要檢查這個使用 SQL> select logins from v$instance ;

如果登錄受限,您可以使用 SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION; 禁用受限模式。

6) 作業是否計划在停機的實例上運行?

您可以通過查看是否為作業設置了 instance_id 來檢查這一點(檢查 dba_scheduler_jobs 視圖),如果是,您應該檢查該實例是否已啟動。

7) 作業是否計划在尚未在任何實例上啟動的服務上運行?

您可以通過檢查作業指向的 job_class 然后檢查該類是否指向服務來檢查這一點。 如果是,請確保該服務已在至少一個正在運行的實例上啟動。 您可以使用 dbms_service.start_service 在實例上啟動服務。

8) 資源經理是否實施了限制性資源計划?

如果限制性資源計划生效,調度程序作業可能沒有分配足夠的資源,因此它們可能無法運行。 您可以通過執行以下操作來檢查正在生效的資源計划

SQL> 從 V$RSRC_PLAN 中選擇名稱;

如果沒有有效的計划或有效的計划是 INTERNAL_PLAN,則資源管理器無效。 如果資源管理器有效,您可以通過執行以下操作禁用它

SQL>alter system set resource_manager_plan = '';

9) 調度程序是否被禁用? 這不是受支持的操作,但可能有人已經這樣做了。 要檢查這個做 SQL> select value from dba_scheduler_global_attribute where attribute_name='SCHEDULER_DISABLED'

如果此查詢返回 TRUE,則您可以使用 SQL> exec dbms_scheduler.set_scheduler_attribute('scheduler_disabled','false'); 解決此問題。

作業可能遲到的原因

1)首先要檢查作業調度的時區 SQL> select owner, job_name, next_run_date from dba_scheduler_jobs ;

如果作業位於錯誤的時區,它們可能不會在預期時間運行。 如果 next_run_date 使用絕對時區偏移量(如 +08:00)而不是命名時區(如 US/PACIFIC),那么如果夏令時生效,作業可能不會按預期運行 - 它們可能會提前或晚運行一個小時.

2) 可能在作業計划運行時,臨時達到了上述幾個限制之一,導致作業延遲。 檢查上述限制是否足夠高,如果可能,請在作業延遲期間檢查它們。

3) 可能達到上述限制之一的一個可能原因是維護窗口可能已經生效。 維護窗口是屬於名為 MAINTENANCE_WINDOW_GROUP 的窗口組的 Oracle 調度程序窗口。 在計划的維護窗口期間,使用作業運行多個維護任務。 這可能會導致達到上面列出的限制之一並延遲用戶作業。 有關更多信息,請參閱管理指南(第 24 章)。

要獲取維護時段列表,請使用 SQL> select * from dba_scheduler_wingroup_members;

要查看 Windows 何時運行,請使用 SQL> select * from dba_scheduler_windows;

要解決此問題,您可以增加限制或重新安排維護時段以在更方便的時間運行。

診斷其他問題

如果這些都不起作用,您可以采取以下一些進一步的步驟來嘗試弄清楚發生了什么。

1) 檢查警報日志中是否有任何錯誤。 如果數據庫在分配內存時遇到問題或磁盤空間不足或發生任何其他災難性錯誤,您應該首先解決這些問題。 您可以使用 SQL> select value from v$parameter where name = 'background_dump_dest'; 找到警報日志的位置。 警報日志將在此目錄中,名稱以“警報”開頭。

2) 檢查是否有作業協調器跟蹤文件,如果有,檢查它是否包含任何錯誤。 如果存在,它將位於您可以在上面找到的“background_dump_dest”目錄中,並且看起來像 SID-cjq0_nnnn.trc 。 如果此處有任何錯誤,它們可能會暗示作業未運行的原因。

3) 如果上述任一情況表明 SYSAUX 表空間(調度程序存儲其日志表的位置)已滿,您可以使用 dbms_scheduler.purge_log 過程清除舊的日志條目。

4) 查看當前是否有窗口打開。 如果有,您可以嘗試關閉它,看看是否有幫助。

SQL> select * from DBA_SCHEDULER_GLOBAL_ATTRIBUTE where 
attribute_name='CURRENT_OPEN_WINDOW';
SQL> exec DBMS_SCHEDULER.close_window ('WEEKNIGHT_WINDOW');

5)嘗試運行一個簡單的運行一次作業,看看它是否運行

SQL>begin
dbms_scheduler.create_job (
job_name => 'test_job',
job_type => 'plsql_block',
job_action => 'null;',
enabled => true);
end;
/
SQL> -- wait a while
SQL> select * from user_scheduler_job_run_details where job_name='TEST_JOB';

6) 如果一個簡單的 run-once 作業沒有運行,您可以嘗試重新啟動調度程序,如下所示。

SQL> exec dbms_scheduler.set_scheduler_attribute('SCHEDULER_DISABLED', 'TRUE');
SQL> alter system set job_queue_processes=0;
SQL> exec dbms_ijob.set_enabled(FALSE);
SQL> 
SQL> alter system flush shared_pool;
SQL> alter system flush shared_pool;
SQL>
SQL> exec dbms_ijob.set_enabled(TRUE);
SQL> alter system set job_queue_processes=99;
SQL> exec dbms_scheduler.set_scheduler_attribute('SCHEDULER_DISABLED', 'FALSE');

在多租戶環境中,容器還必須具有正確的 job_queue_processes 值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM