我将工作定义为每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分钟执行一次
答案 0 :(得分:2)
这是最常见的调度程序问题之一。 在这里,我们列出了一些常见问题及其解决方案。
1)job_queue_processes可能太低(这是最常见的问题) job_queue_processes的值限制dbms_scheduler的总数 和dbms_job可以在给定时间运行的作业。 要检查是否是这种情况,请检查当前值 job_queue_processes with SQL>从v $ parameter中选择值,其中name =' job_queue_processes&#39 ;; 然后检查正在运行的作业的数量 SQL>从dba_scheduler_running_jobs中选择count(); SQL>从dba_jobs_running中选择计数();
如果这是问题,您可以使用增加参数 SQL> alter system set job_queue_processes = 1000;
2)max_job_slave_processes可能太低 如果此参数不为NULL,则它会限制dbms_scheduler作业的数量 一次跑。要检查这是否是问题,请检查当前 价值使用 SQL>从dba_scheduler_global_attribute中选择值 其中attribute_name =' MAX_JOB_SLAVE_PROCESSES&#39 ;; 然后检查正在运行的作业的数量 SQL>从dba_scheduler_running_jobs中选择count(*);
如果这是问题,你可以增加数字或只使用NULL SQL> exec dbms_scheduler.set_scheduler_attribute(' max_job_slave_processes',null)
3)会话可能太低 此参数随时限制会话数。每个Scheduler工作 需要2个课程。要检查这是否是问题,请检查当前 valule使用 SQL>从v $ parameter中选择值,其中name =' sessions&#39 ;; 然后使用查看当前会话数 SQL>从v $ session中选择count(*);
如果数字太近,您可以使用增加最大值 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>从v $ instance;
中选择登录如果登录受限制,您可以使用禁用限制模式 SQL>更改系统禁用受限制的会议;
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>从dba_scheduler_global_attribute中选择值,其中attribute_name =' SCHEDULER_DISABLED'
如果此查询返回TRUE,则可以使用此方法解决此问题 SQL> exec dbms_scheduler.set_scheduler_attribute(' scheduler_disabled',' false');
工作可能迟到的原因
1)要检查的第一件事是安排作业的时区 SQL>从dba_scheduler_jobs中选择所有者,job_name,next_run_date;
如果作业处于错误的时区,则可能无法按预期运行 时间。如果next_run_date使用绝对时区偏移(如 +08:00)而不是命名的时区(如US / PACIFIC),那么工作可能不会 如果夏令时生效,则按预期运行 - 它们可能会运行一个小时 早或晚。
2)可能是在作业被安排运行时,其中一个 可能暂时达到上述限制,导致工作延迟。 检查上面的限制是否足够高,如果可能的话,检查它们 工作被推迟的时间。
3)可能遇到上述限制之一的一个可能原因是a 维护窗口可能已生效。维护窗口是Oracle 属于名为的窗口组的调度程序窗口 MAINTENANCE_WINDOW_GROUP。在预定的维护窗口期间,有几个 维护任务使用作业运行。这可能会导致列出其中一个限制 以上被击中和用户工作被推迟。有关详细信息,请参阅管理指南 关于这一点(第24章)。
获取维护窗口列表使用 SQL> select * from dba_scheduler_wingroup_members;
查看Windows运行的时间 SQL> select * from dba_scheduler_windows;
要解决此问题,您可以增加限制或重新安排维护 窗户可以在更方便的时间运行。
诊断其他问题
如果这些都不起作用,可以采取以下一些步骤来尝试 弄清楚发生了什么。
1)检查警报日志中是否有任何错误。如果数据库是 无法分配内存或磁盘空间不足或任何其他内存 发生了灾难性的错误,你应该先解决这些问题。您可以 使用查找警报日志的位置 SQL>从v $ parameter中选择值,其中name =' background_dump_dest&#39 ;; 警报日志将位于此目录中,名称以" alert"。
开头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)如果一个简单的一次性运行作业没有运行,你可以尝试重新启动调度程序,如下所示。
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');
答案 1 :(得分:1)
在多租户环境中,容器还必须具有job_queue_processes的正确值。