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;
/
但工作没有运行 cheking
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> select value from v$parameter where name='job_queue_processes';
然后查看 运行ning 作业的数量
SQL> select count() 来自 dba_scheduler_running_jobs;
SQL> select count() 来自 dba_jobs_running;
如果这是问题所在,您可以增加参数使用
SQL> 改变系统设置 job_queue_processes=1000;
2) max_job_slave_processes 可能太低了
如果此参数不为 NULL,则它会限制 dbms_scheduler 个作业可以
一次运行宁。要检查这是否是问题所在,请检查当前
价值使用
SQL> select 来自 dba_scheduler_global_attribute 的值
其中 attribute_name='MAX_JOB_SLAVE_PROCESSES';
然后查看 运行ning 作业的数量
SQL> select count(*) 来自 dba_scheduler_running_jobs;
如果这是问题所在,您可以增加数字或使用 NULL 将其清空
SQL> 执行 dbms_scheduler.set_scheduler_attribute('max_job_slave_processes',null)
3) 会话数可能太少
此参数限制任何时候的会话数。每个调度程序作业
需要 2 节课。要检查这是否是问题所在,请检查当前
使用价值
SQL> select value from v$parameter where name='sessions';
然后使用检查当前会话数
SQL> select 来自 v$session 的计数 (*) ;
如果数字太接近你可以增加最大值使用
SQL> 改变系统设置 job_queue_processes=200;
4) 您最近是否应用了时区更新补丁或升级了数据库
到具有较新时区信息的版本?如果您跳过任何步骤
更新时区信息,作业可能不会 运行。要检查这是否
是这种情况尝试做
SQL> select * 来自 sys.scheduler$_job;
和
SQL> select * 来自 sys.scheduler$_window;
并确保它们无误地完成。
如果它抛出时区警告,请重新应用升级或
确保遵循所有步骤的时区补丁。
5) 数据库 运行ning 是否处于受限模式?
如果数据库 运行 处于受限模式,则没有作业会 运行(除非
您正在使用 11g 并使用 ALLOW_RUNS_IN_RESTRICTED_MODE 属性)。
检查这个用途
SQL> select 从 v$instance 登录;
如果登录受限,您可以使用以下命令禁用受限模式
SQL> 更改系统禁用受限会话;
6) 作业是否安排在 运行 已关闭的实例上?
您可以通过查看是否为作业设置了 instance_id 来检查这一点(检查 dba_scheduler_jobs 视图),如果是,您应该检查该实例是否已启动。
7) 作业是否安排在尚未在任何实例上启动的服务上 运行?
您可以通过检查 job_class 作业指向什么然后检查 class 是否指向服务来检查这一点。如果是,请确保该服务已在至少一个 运行ning 实例上启动。您可以使用 dbms_service.start_service.
在实例上启动服务
8) 资源管理器是否与限制性资源计划一起生效?
如果限制性资源计划生效,调度程序作业可能没有分配足够的资源,因此它们可能不会 运行。您可以通过
检查什么资源计划有效
SQL> select 名称来自 V$RSRC_PLAN ;
如果没有有效计划或有效计划是 INTERNAL_PLAN,则资源管理器无效。如果资源管理器有效,您可以通过
禁用它
SQL>改变系统设置 resource_manager_plan = '';
9) 调度程序是否被禁用?这不是受支持的操作
但有可能有人已经这样做了。要检查这个做
SQL> select 来自 dba_scheduler_global_attribute 的值,其中 attribute_name='SCHEDULER_DISABLED'
如果此查询 returns TRUE 那么您可以使用
SQL> 执行 dbms_scheduler.set_scheduler_attribute('scheduler_disabled','false');
工作可能 运行 迟到的原因
1) 首先要检查的是作业调度的时区
SQL> select 所有者,job_name,next_run_date 来自 dba_scheduler_jobs ;
如果工作在错误的时区,它们可能不会 运行 在预期的时间
时间。如果 next_run_date 使用绝对时区偏移(比如
+08:00) 而不是命名时区(如 US/PACIFIC),则作业可能不会
运行 如果夏令时生效,这是预期的 - 他们可能 运行 一个小时
早或晚。
2) 可能是当时作业被安排到 运行,几个
可能已暂时达到上述限制,导致作业延迟。
检查上面的限制是否足够高,如果可能的话,检查它们
作业被延迟的时间。
3) 可能达到上述限制之一的一个可能原因是
维护 window 可能已经生效。维护 windows 是 Oracle
属于名为 window 组的调度程序 windows
MAINTENANCE_WINDOW_GROUP。在定期维护 window 期间,几个
维护任务 运行 使用作业。这可能会导致列出的限制之一
上面被击中并且用户作业被延迟。有关详细信息,请参阅管理指南
关于这个(第 24 章)。
要获取维护列表 windows 使用
SQL> select * 来自 dba_scheduler_wingroup_members;
看windows运行何时使用
SQL> select * 来自 dba_scheduler_windows;
要解决此问题,您可以增加限制或重新安排维护
windows 到 运行 在更方便的时候。
诊断其他问题
如果 none 有效,您可以采取以下一些进一步的步骤来尝试
搞清楚是怎么回事。
1) 检查alert log是否有错误。如果数据库是
分配内存时遇到问题或 运行 磁盘空间不足 space 或任何其他
发生了灾难性错误,您应该首先解决这些错误。你可以
通过使用找到警报日志的位置
SQL> select 来自 v$parameter 的值 where name = 'background_dump_dest';
警报日志将在此目录中,名称以 "alert".
开头
2) 检查作业协调器是否跟踪文件,如果有,检查它是否
包含任何错误。如果存在,它将位于
'background_dump_dest' 目录,你可以在上面找到并查看
像 SID-cjq0_nnnn.trc 这样的东西。如果这里有任何错误,他们可能
提示为什么工作不是 运行ning.
3) 如果以上任一指示 SYSAUX tablespace(调度程序存储其日志记录 tables 的地方)已满,您可以使用 dbms_scheduler.purge_log 清除旧日志条目的程序。
4) 查看当前是否有 window 打开。如果有,您可以尝试关闭它,看看是否有帮助。
SQL> select * from DBA_SCHEDULER_GLOBAL_ATTRIBUTE where
attribute_name='CURRENT_OPEN_WINDOW';
SQL> exec DBMS_SCHEDULER.close_window ('WEEKNIGHT_WINDOW');
5) 尝试 运行ning 一个简单的 运行-once 作业,看看它是否 运行s
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) 如果一个简单的 运行-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 的正确值。
我定义了一个作业 运行 从周二到周日每 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;
/
但工作没有运行 cheking
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> select value from v$parameter where name='job_queue_processes'; 然后查看 运行ning 作业的数量 SQL> select count() 来自 dba_scheduler_running_jobs; SQL> select count() 来自 dba_jobs_running;
如果这是问题所在,您可以增加参数使用 SQL> 改变系统设置 job_queue_processes=1000;
2) max_job_slave_processes 可能太低了 如果此参数不为 NULL,则它会限制 dbms_scheduler 个作业可以 一次运行宁。要检查这是否是问题所在,请检查当前 价值使用 SQL> select 来自 dba_scheduler_global_attribute 的值 其中 attribute_name='MAX_JOB_SLAVE_PROCESSES'; 然后查看 运行ning 作业的数量 SQL> select count(*) 来自 dba_scheduler_running_jobs;
如果这是问题所在,您可以增加数字或使用 NULL 将其清空 SQL> 执行 dbms_scheduler.set_scheduler_attribute('max_job_slave_processes',null)
3) 会话数可能太少 此参数限制任何时候的会话数。每个调度程序作业 需要 2 节课。要检查这是否是问题所在,请检查当前 使用价值 SQL> select value from v$parameter where name='sessions'; 然后使用检查当前会话数 SQL> select 来自 v$session 的计数 (*) ;
如果数字太接近你可以增加最大值使用 SQL> 改变系统设置 job_queue_processes=200;
4) 您最近是否应用了时区更新补丁或升级了数据库 到具有较新时区信息的版本?如果您跳过任何步骤 更新时区信息,作业可能不会 运行。要检查这是否 是这种情况尝试做 SQL> select * 来自 sys.scheduler$_job; 和 SQL> select * 来自 sys.scheduler$_window; 并确保它们无误地完成。
如果它抛出时区警告,请重新应用升级或 确保遵循所有步骤的时区补丁。
5) 数据库 运行ning 是否处于受限模式? 如果数据库 运行 处于受限模式,则没有作业会 运行(除非 您正在使用 11g 并使用 ALLOW_RUNS_IN_RESTRICTED_MODE 属性)。 检查这个用途 SQL> select 从 v$instance 登录;
如果登录受限,您可以使用以下命令禁用受限模式 SQL> 更改系统禁用受限会话;
6) 作业是否安排在 运行 已关闭的实例上?
您可以通过查看是否为作业设置了 instance_id 来检查这一点(检查 dba_scheduler_jobs 视图),如果是,您应该检查该实例是否已启动。
7) 作业是否安排在尚未在任何实例上启动的服务上 运行?
您可以通过检查 job_class 作业指向什么然后检查 class 是否指向服务来检查这一点。如果是,请确保该服务已在至少一个 运行ning 实例上启动。您可以使用 dbms_service.start_service.
在实例上启动服务8) 资源管理器是否与限制性资源计划一起生效?
如果限制性资源计划生效,调度程序作业可能没有分配足够的资源,因此它们可能不会 运行。您可以通过
检查什么资源计划有效SQL> select 名称来自 V$RSRC_PLAN ;
如果没有有效计划或有效计划是 INTERNAL_PLAN,则资源管理器无效。如果资源管理器有效,您可以通过
禁用它SQL>改变系统设置 resource_manager_plan = '';
9) 调度程序是否被禁用?这不是受支持的操作 但有可能有人已经这样做了。要检查这个做 SQL> select 来自 dba_scheduler_global_attribute 的值,其中 attribute_name='SCHEDULER_DISABLED'
如果此查询 returns TRUE 那么您可以使用 SQL> 执行 dbms_scheduler.set_scheduler_attribute('scheduler_disabled','false');
工作可能 运行 迟到的原因
1) 首先要检查的是作业调度的时区 SQL> select 所有者,job_name,next_run_date 来自 dba_scheduler_jobs ;
如果工作在错误的时区,它们可能不会 运行 在预期的时间 时间。如果 next_run_date 使用绝对时区偏移(比如 +08:00) 而不是命名时区(如 US/PACIFIC),则作业可能不会 运行 如果夏令时生效,这是预期的 - 他们可能 运行 一个小时 早或晚。
2) 可能是当时作业被安排到 运行,几个 可能已暂时达到上述限制,导致作业延迟。 检查上面的限制是否足够高,如果可能的话,检查它们 作业被延迟的时间。
3) 可能达到上述限制之一的一个可能原因是 维护 window 可能已经生效。维护 windows 是 Oracle 属于名为 window 组的调度程序 windows MAINTENANCE_WINDOW_GROUP。在定期维护 window 期间,几个 维护任务 运行 使用作业。这可能会导致列出的限制之一 上面被击中并且用户作业被延迟。有关详细信息,请参阅管理指南 关于这个(第 24 章)。
要获取维护列表 windows 使用 SQL> select * 来自 dba_scheduler_wingroup_members;
看windows运行何时使用 SQL> select * 来自 dba_scheduler_windows;
要解决此问题,您可以增加限制或重新安排维护 windows 到 运行 在更方便的时候。
诊断其他问题
如果 none 有效,您可以采取以下一些进一步的步骤来尝试 搞清楚是怎么回事。
1) 检查alert log是否有错误。如果数据库是 分配内存时遇到问题或 运行 磁盘空间不足 space 或任何其他 发生了灾难性错误,您应该首先解决这些错误。你可以 通过使用找到警报日志的位置 SQL> select 来自 v$parameter 的值 where name = 'background_dump_dest'; 警报日志将在此目录中,名称以 "alert".
开头2) 检查作业协调器是否跟踪文件,如果有,检查它是否 包含任何错误。如果存在,它将位于 'background_dump_dest' 目录,你可以在上面找到并查看 像 SID-cjq0_nnnn.trc 这样的东西。如果这里有任何错误,他们可能 提示为什么工作不是 运行ning.
3) 如果以上任一指示 SYSAUX tablespace(调度程序存储其日志记录 tables 的地方)已满,您可以使用 dbms_scheduler.purge_log 清除旧日志条目的程序。
4) 查看当前是否有 window 打开。如果有,您可以尝试关闭它,看看是否有帮助。
SQL> select * from DBA_SCHEDULER_GLOBAL_ATTRIBUTE where
attribute_name='CURRENT_OPEN_WINDOW';
SQL> exec DBMS_SCHEDULER.close_window ('WEEKNIGHT_WINDOW');
5) 尝试 运行ning 一个简单的 运行-once 作业,看看它是否 运行s
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) 如果一个简单的 运行-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 的正确值。