Oracle DBMS 作业未运行

2024-01-08

我定义了一个作业,从周二到周日每 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 作业可以在给定时间运行。 要检查是否是这种情况,请检查当前值 job_queue_processes 与 SQL> 从 v$parameter 中选择值,其中 name='job_queue_processes'; 然后查看正在运行的作业数量 SQL> 选择计数()来自 dba_scheduler_running_jobs; SQL> 选择计数()来自 dba_jobs_running;

如果这是问题,您可以使用增加参数 SQL> 更改系统设置 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 选择计数(*);

如果这是问题,您可以增加数字或使用 NULL 来删除它 SQL> exec dbms_scheduler.set_scheduler_attribute('max_job_slave_processes',null)

3)会话可能太低 该参数限制任何时候的会话数量。每个调度程序作业 需要 2 次会议。要检查这是否是问题所在,请检查当前 价值利用 SQL> 从 v$parameter 中选择值,其中 name='sessions'; 然后使用检查当前会话数 SQL> 从 v$session 中选择 count(*) ;

如果数字太接近,您可以使用增加最大值 SQL> 更改系统设置 job_queue_processes=200;

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

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

5) 数据库是否在受限模式下运行? 如果数据库在受限模式下运行,则不会运行任何作业(除非 您使用的是 11g 并使用 ALLOW_RUNS_IN_RESTRICTED_MODE 属性)。 检查此用途 SQL> 从 v$instance 选择登录名;

如果登录受到限制,您可以使用禁用限制模式 SQL> ALTER SYSTEM 禁用受限会话;

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> exec dbms_scheduler.set_scheduler_attribute('scheduler_disabled','false');

作业可能迟到的原因

1)首先要检查的是安排作业的时区 SQL> 从 dba_scheduler_jobs 选择所有者、作业名称、下一个运行日期;

如果作业位于错误的时区,它们可能不会按预期运行 时间。如果 next_run_date 使用绝对时区偏移量(例如 +08:00)而不是指定时区(如美国/太平洋),那么工作可能不会 如果夏令时生效,则按预期运行 - 它们可能运行一个小时 早或晚。

2) 可能在作业计划运行时,多个作业之一 可能暂时达到上述限制,导致作业延迟。 检查上述限制是否足够高,如果可能的话,在期间检查它们 作业被延迟的时间。

3) 可能达到上述限制之一的一个可能原因是 维护窗口可能已生效。维护窗口是 Oracle 属于名为的窗口组的调度程序窗口 MAINTENANCE_WINDOW_GROUP。在计划的维护时段内,多个 维护任务是使用作业运行的。这可能会导致列出的限制之一 以上将受到打击并且用户作业将被延迟。请参阅管理指南以获取更多信息 关于这一点(第 24 章)。

要获取维护时段列表,请使用 SQL> 从 dba_scheduler_wingroup_members 选择*;

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

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

诊断其他问题

如果这些都不起作用,您可以采取一些进一步的步骤来尝试 弄清楚发生了什么事。

1)检查alert日志中是否有错误。如果数据库是 分配内存时遇到问题或磁盘空间不足或任何其他情况 发生了灾难性错误,您应该首先解决这些错误。你可以 使用以下命令查找警报日志的位置 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');
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Oracle DBMS 作业未运行 的相关文章

  • 具有 LINQ 支持的最完整的 ORM?

    我正在寻找一个提供完整或接近完整的 LINQ 支持的 ORM LINQ 到 SQL 支持 LINQ 内部的所有内容 Contains Math Log 等 在不创建新数据上下文的情况下无法预先加载关系属性 ADO NET 实体框架 糟糕的
  • 将列的值添加到 LIKE 语句中?

    我有 3 个标签表 标签类别和使用过的标签 我想要获取所有标签的列表以及已使用标签的计数 所使用标签的格式是每个具有标签的文档 ID 的逗号分隔值 我一直在尝试类似的方法 但无法将tags tag 字段的值插入到LIKE 语句中 SELEC
  • sql server GO 相当于 oracle

    我正在为 Oracle 编写迁移脚本 我需要更改表结构 然后用数据填充它 我想先进行结构更改 然后再进行数据更改 在 SQL Server 中我会使用GO分离批次 是否有 SQL ServerGOOracle 中的等效命令 It s and
  • SQL 大表中的随机行(使用 where 子句)

    我有一个网站 人们可以在其中对汽车进行投票 向用户展示 4 辆汽车 他 她可以投票选出他们最喜欢的汽车 桌子cars有重要的列 car id int 10 not auto increment so has gaps views int 7
  • 创建 SYS_REFCURSOR 并将其作为输入参数从 Java 传递给 Oracle 过程

    我必须与具有 SYS REFCURSOR 作为输入参数的外部 Oracle 过程进行通信 过程 merge objects varchar2 中的 p table name p id array 中 varchar2 SYS REFCURS
  • 如何检查 Oracle 数据库是否存在长时间运行的查询

    我的应用程序使用 Oracle 数据库 速度缓慢或似乎完全停止 如何找出哪些查询成本最高 以便我可以进一步调查 这显示当前处于 活动 状态的 SQL select S USERNAME s sid s osuser t sql id sql
  • Oracle 数据库 12c 尝试连​​接时出错:网络适配器无法建立连接

    我第一次安装Oracle数据库12c 我正确地遵循了所有步骤并将其安装在 Windows 7 64 位上 但是当我单击 SQL Developer 并尝试创建新连接时 我输入了用户名和密码等信息 最后单击 测试 按钮 我得到了这个错误消息
  • 在 Postgres 中的数组字段上应用聚合函数?

    是否可以对整数 字段 或其他数字数组 中的所有值应用聚合 如 avg stddev CREATE TABLE widget measurement integer insert into widget measurement values
  • 什么是 Oracle 数据集成器?

    什么是ODI ODI的实际用途是什么 oracle data integrator工具如何帮助编程 sql Developer 工具和 ODI 工具实际上有什么区别 真的厌倦了在某些网站上找到的定义 如果有人能提出 gud 解释 那就太好了
  • 案例陈述以确定我是否应该结合

    我目前想做某种条件联合 给出以下示例 SELECT age name FROM users UNION SELECT 25 AS age Betty AS name 假设我只想在 用户 计数 gt 2 时合并第二个语句 否则不合并两者 总之
  • 与 FOREIGN KEY 约束冲突

    我有两张桌子 学术界 CREATE TABLE dbo R ACADEMIE ID ACADEMIE dbo IDENTIFIANT NOT NULL LC ACADEMIE CODE dbo LIBELLE COURT NOT NULL
  • INNER JOIN 可用作 SELECT,但不能用作 DELETE [重复]

    这个问题在这里已经有答案了 为什么这个有语法错误 DELETE FROM print mailing request pmr INNER JOIN person p ON p id pmr person AND p email LIKE T
  • ORA-01749: 您不能向自己授予/撤销权限

    我正在运行以下查询RATOR MONITORING授予引用权限的架构RATOR MONITORING CONFIGURATION SMSC GATEWAY表到RATOR MONITORING schema GRANT REFERENCES
  • 如何在 SQLite 中获取最后插入的 ID?

    SQLite 中是否有任何内置函数可以获取最后插入的行 ID 例如 在 mysql 中我们有LAST INSERT ID 这种功能 对于 sqlite 任何可用于执行相同过程的函数 请帮我 Thanks SQLite 这可以使用SQLite
  • 使用 Powershell SQL 将数据提取到 Excel

    我想使用 powershell 将数据从 SQL Server 提取到新的 excel 文件 对于小型数据集 我的代码可以工作 但某些表的行数超过 100 000 行 这将需要很长时间 我不在 SQl 服务器中使用该实用程序的原因是因为我想
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • ActiveRecord 嵌套 SELECT——我可以在没有手动 SQL 的情况下完成它吗?

    我有一张桌子 上面有 除其他外 一个名字和一个等级 我想返回所有唯一名称的集合 但对于返回的每个名称 我想选择排名最高的行 这很简单 有两个嵌套的 SELECT 语句 SELECT FROM SELECT FROM foo ORDER BY
  • 多级排序

    我有一个表 其中包含一些记录 其中包含名称 评级等字段 我首先想要根据评级将结果限制为 20 进行排序 然后在此结果集上想要进一步应用基于名称的排序 我知道要排序我们需要使用像这样的查询 Select from table order by
  • 如何在SqlAlchemy中执行“左外连接”

    我需要执行这个查询 select field11 field12 from Table 1 t1 left outer join Table 2 t2 ON t2 tbl1 id t1 tbl1 id where t2 tbl2 id is
  • 如何将 SQL“LIKE”与 LINQ to Entities 结合使用?

    我有一个文本框 允许用户指定搜索字符串 包括通配符 例如 Joh Johnson mit ack on 在使用 LINQ to Entities 之前 我有一个存储过程 该存储过程将该字符串作为参数并执行以下操作 SELECT FROM T

随机推荐