暂无图片
暂无图片
1
暂无图片
暂无图片
暂无图片

scheduler job无法运行排查以及延迟排查

原创 李行行 2022-04-14
3722

mos:2631878.1

一:计划任务无法执行

1.job_queue_processes设置太小

SQL> select value from v$parameter where name='job_queue_processes';
!Then check the number of running jobs

SQL> select count(*) from dba_scheduler_running_jobs;
SQL> select count(*) from dba_jobs_running;

!If this is the problem you can increase the parameter using
SQL> alter system set job_queue_processes=1000;

2.max_job_secondary_processes设置太小

如果这个值设置不会空,那么就会限制同一时间dbms_scheduler jobs运行的数量

SQL> select value from dba_scheduler_global_attribute where attribute_name='MAX_JOB_SECONDARY_PROCESSES';

-- Then check the number of running jobs
SQL> select count(*) from dba_scheduler_running_jobs;

-- If this is the problem you can increase the number or just NULL it out using
SQL> exec dbms_scheduler.set_scheduler_attribute('max_job_secondary_processes',null)

3.session参数设置的太小

该参数限制任何时候的回话,每个计划程序作业需要两个回话,要检查是否是问题所在

SQL> select value from v$parameter where name='sessions';
-- Then check the current number of sessions using
SQL> select count(*) from v$session ;
-- If the numbers are too close you can increase the maximum using
SQL> alter system set job_queue_processes=200;

4.检查时区是否最近被更新

如果完成时有时区告警,需要更新数据库时区
SQL> select * from sys.schedulerjob;andSQL>selectfromsys.scheduler_job; and SQL> select * from sys.scheduler_window;

5.检查数据库是否以受限模式打开

SQL> select logins from v$instance ;
-- If logins are restricted you can disable the restricted mode using
SQL> ALTER SYSTEM DISABLE RESTRICTED SESSION;

6.检查job是否在以关闭的实例上运行

dba_scheduler_jobs.instance_id

7.检查job是否在未启动呢的服务上运行

select * from dba_scheduler_job_classes

如下所示,两个job_class对应的服务名分别是orcl、orcl1.这里的orcl1在测试的时候进行了关闭处理。在实际的测试中,如果对应的service无效或者是未启动、删除等操作,定时调度job是无法自动进行调度的,且无法生成log日志,但是手工可以执行,且dba_scheduler_job_log.additional_info=REASON=“manually run”

image.png

8.检查是否有资源管理限制

如果限制性资源计划生效,调度程序作业可能没有分配足够的资源,因此可能无法运行。可以通过执行以下操作来检查什么资源计划有效

SQL> select name from V$RSRC_PLAN;

如果没有有效的计划,或者有效的计划是内部计划,则资源管理器无效。如果资源管理器有效,可以通过执行以下操作来禁用它:

SQL> alter system set resource_manager_plan = ‘’;

9.检查调度程序是否被禁用

段落引用SQL> select value from dba_scheduler_global_attribute where attribute_name=‘SCHEDULER_DISABLED’;

如果上述返回值,通过一下来进行修复

段落引用SQL> exec dbms_scheduler.set_scheduler_attribute(‘scheduler_disabled’,‘false’);

二:计划任务执行延迟

1.检查调度任务默认的时区

如果作业在错误的时区,它们可能无法在预期时间运行。如果下一个运行日期使用的是绝对时区偏移量(如+08:00),而不是指定的时区(如美国/太平洋),则作业可能不会
如果夏令时生效,按预期运行——它们可能提前或延迟运行一小时。
SQL> select owner, job_name, next_run_date from dba_scheduler_jobs ;

2.资源限制导致job延迟

在job延迟执行期间,检查上述的一些资源是否达到瓶颈

3.达到资源限制的之一可能是Oracle的维护窗口已经生效

Oracle定时执行窗口维护任务,导致计划任务延迟,可以重新定义窗口的维护时间或者重定义job的运行时间

##查看维护窗口列表

SQL> select * from dba_scheduler_wingroup_members;

##查看当前正在执行的窗口信息

SQL> select * from dba_scheduler_windows;

三:诊断其他问题故障

如果以上步骤执行完毕之后依然没有头绪,执行下面步骤进一步确定问题

1.检查alert日志是否有报错

确定数据库在分配内存、磁盘空间或其他内存不足引发的一系列问题,通过以下命令找到alert日志位置

select value from v$parameter where name = ‘background_dump_dest’;

2.检查自动化作业任务是否产生trc文件

如果自动化作业任务被跟踪并发生错误,将存在background_dump_dest目录中,我们可以查找对应的SID-cjq0_nnnn.trc文件来进一步判断、诊断问题原因

3.检查sysaux表空间是否空间不足

如果sysaux空间不足,定时job信息无法被写入,可能导致自动化作业无法执行,我们可以通过dbms_scheduler.purge_log存储过程来清理老旧的日志信息

4.检查当前打开窗口,默认为空

SQL> select * from DBA_SCHEDULER_GLOBAL_ATTRIBUTE where attribute_name='CURRENT_OPEN_WINDOW';

ATTRIBUTE_NAME       VALUE
-------------------- --------------------
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.如果步骤5简单计划任务无法调度,那么我们尝试重新启动调度任务

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');

如果执行上述操作之后调度任务仍然无法运行,那么我们需要检查目录相应的权限是否正确,并授权

chmod a+rx /opt
chmod a+rx /opt/oracle
chmod a+rx /opt/oracle/db
chmod a+rx /opt/oracle/db/bin
「喜欢这篇文章,您的关注和赞赏是给作者最好的鼓励」
关注作者
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文章的来源(墨天轮),文章链接,文章作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论