当前位置: 首页 > 面试题库 >

Oracle DBMS作业未运行

冀望
2023-03-14
问题内容

我定义了一个工作,每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;
/

但是这项工作不会令人che目结舌

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>从v$ parameter中选择值,其中name=’job_queue_processes’;检查job_queue_processes的当前值;然后检查正在运行的作业数。SQL>
从dba_scheduler_running_jobs中 选择count( )。 SQL >_从dba_jobs_running中_选择count( );

如果这是问题所在,则可以使用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’;
然后检查正在运行的作业数。SQL>从dba_scheduler_running_jobs中选择count(*)。

如果这是问题,则可以使用SQL> execdbms_scheduler.set_scheduler_attribute(’max_job_slave_processes’,null)增加数量或将其为NULL。

3)会话数可能太低此参数可随时限制会话数。每个Scheduler作业需要2个会话。要检查这是否是问题,请使用SQL>从v $
parameter中选择值,其中name =’sessions’;检查当前值。然后使用SQL> v $ session中的count(*)检查当前会话数;

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

4)您最近是否应用了时区更新补丁或将数据库升级到具有较新的时区信息的版本?如果在更新时区信息时跳过了任何步骤,则作业可能无法运行。要检查是否是这种情况,请尝试执行SQL>,从sys.scheduler
$ _job中选择*;和SQL> select * from sys.scheduler $ _window; 并确保它们完好无误。

如果它发出时区警告,请重新应用升级或时区补丁程序,确保遵循所有步骤。

5)数据库是否以受限模式运行?如果数据库以受限模式运行,则不会运行任何作业(除非您使用11g并使用ALLOW_RUNS_IN_RESTRICTED_MODE属性)。要进行检查,请使用SQL>从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>更改系统集resource_manager_plan =’‘;

9)调度程序是否已禁用?这不是受支持的操作,但是可能有人已经这样做了。要对此进行检查,请执行SQL>从dba_scheduler_global_attribute中选择值,其中attribute_name=’SCHEDULER_DISABLED’

如果此查询返回TRUE,则可以使用SQL> execdbms_scheduler.set_scheduler_attribute(’scheduler_disabled’,’false’);来解决此问题。

工作可能迟到的原因

1)首先要检查的时区是使用SQL> select owner,job_name,next_run_date fromdba_scheduler_jobs调度的作业的时区;

如果作业在错误的时区中,则它们可能无法在预期的时间运行。如果next_run_date使用绝对时区偏移量(如+08:00)而不是命名时区(如US /
PACIFIC),则如果实行夏令时,作业可能无法按预期运行-它们可能早或晚运行一小时。

2)可能是在预定运行该作业时,可能暂时达到了上述几个限制之一,从而导致该作业被延迟。检查上述限制是否足够高,如果可能,请在延迟作业期间检查它们。

3)可能达到上述限制之一的一个可能原因是维护窗口可能已生效。维护窗口是属于名为MAINTENANCE_WINDOW_GROUP的窗口组的Oracle
Scheduler窗口。在计划的维护窗口期间,使用作业运行多个维护任务。这可能会导致上述限制之一被击中,并且用户作业将被延迟。有关更多信息,请参阅管理指南(第24章)。

要获取维护窗口的列表,请使用SQL>选择* from dba_scheduler_wingroup_members;。

要查看Windows何时运行,请使用SQL>从dba_scheduler_windows中选择*;

要解决此问题,您可以增加限制,也可以重新安排维护时段以在更方便的时间运行。

诊断其他问题

如果这些都不起作用,那么您可以采取一些进一步的步骤来尝试找出正在发生的事情。

1)检查告警日志中是否有错误。如果数据库在分配内存时遇到问题或磁盘空间不足,或者发生了其他灾难性错误,则应首先解决这些问题。您可以使用SQL>从v $
parameter中选择值,其中name =’background_dump_dest’;来找到警报日志的位置。警报日志将在此目录中,名称以“
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');


 类似资料:
  • 第一次使用cron作业,我在linux上相对较新,我似乎无法让它工作,如果我只是在命令行中手动运行它,它工作得很好,但不是作为cron作业。 我是这样设置的: 合同-e 插入模式 */3****root(cd/home/ec2 user/;java-jar-feedPuller-1.jar)(每3分钟测试一次) 保存并退出 它说它已经创建了一个新的cron作业选项卡 现在,当我做crontab-l

  • 问题内容: 因此,我试图将cron作业设置为我创建的守护程序的一种看门狗。如果守护程序出错并失败,我希望cron作业定期重新启动它…我不确定这样做的可能性如何,但是我通读了一些cron教程,找不到任何可以做我的事情正在寻找… 我的守护程序是从Shell脚本开始的,所以我真的只是在寻找一种方法来运行cron作业,前提是该作业的先前运行仍未运行。 它确实为我试图使用锁定文件提供了解决方案,但我不确定是

  • 我在本地安装了两个Docker容器,其中包括Jenkins和Selenium。我有一个用Java编写的Maven项目,其中我创建了一套使用Selenium实现的E2E(端到端)测试。从IntelliJ的终端,使用“mvn测试”(或mvn清洁测试或其他组合)命令,测试正在运行,即使我对Chrome驱动程序使用headless或not。另外,这是用POM编写的插件之一: XML套件文件包含每个自动测试

  • 我正在尝试运行一个python3脚本,每天在特定的时间检查电子邮件的特定条件。 我可以看到crontab调用了这些命令,但脚本没有给出我需要的结果,即似乎没有运行。我可以在syslog中看到cron的执行: 8月3日16:25:01 raspberrypi/USR/SBIN/CRON[4597]:(pi)CMD(cd/home/pi/pythonscripts) 8月3日16:25:01 rasp

  • 问题内容: 我在 /etc/cron.daily* 目录中有一个bash脚本 foo.sh ,chmoded 700,由root拥有,root用户的crontab列表在核心Debian安装中是不变的(crontab -l)。我确实以不同于crontab -l和/或crontab -e的方式运行cronjob(例如,我没有按照Debian的具体情况使用/etc/init.d/cron重新启动cron

  • 我试图运行WordCount示例的一个变体,这个变体是,映射器输出文本作为键和文本作为值,而还原器输出文本作为键和NullWritable作为值。 除了地图,减少签名,我把主要的方法是这样的:

  • 我有下面的代码,我用来检查哪个quartz调度程序作业正在运行。它还向我发送一封电子邮件,列出正在运行的调度程序作业。但我不知道它不会返回所有正在运行的调度程序作业。现在我只想知道那些有问题的调度程序作业,已经停止并且没有运行。我在我的生产环境中发现了一个关键问题,我发现一些调度程序作业没有运行,但我真的不知道它是哪个调度程序作业。

  • 我正在开发一个 Spring-MVC 应用程序,其中我使用调度来删除不必要的额外内容。不幸的是,我计划的方法没有触发。谁能告诉我我做错了什么。 这是代码: 我知道参数名称为1周,但我将在3天后删除它。我刚刚复制了代码…:D任何帮助都很好。谢谢