文章目录
背景
Oracle用scheduler写了一个定时器调用存储过程,每个月创建一次表。结果到定时器的执行时间了表却没有创建(预发布环境)。
本地环境正常,模拟环境正常,开发环境正常,测试环境正常
预发布环境异常没创建表
(此时心中:万马奔腾,不得不提一句,docker真香)
排查问题
刚发现这个问题的时候,一脸懵逼。特么本地环境,模拟环境,开发环境,测试环境都ok了,咋个预发布环境就出问题了??
带着一脸懵逼,还是默默打开了oracle,查看了下定时器
select job_name,start_date,next_run_date,repeat_interval from user_scheduler_jobs;
一打开(由于预发布环境没有权限动,现在查不了异常环境的图。下图是正常情况的,这里展示一下字段。异常信息由下面写出。):
查询后第一映入眼帘的是,我设置定时器每个月28号 09:15:05执行一次。咋到点了还没有表创建,NEXT_RUN_DATE字段下一次执行时间也没有更新
异常信息:
JOB_NAME:CREATE_TABLE_BY_MONTH
START_DATE:2020-09-27 18:13:05.046910 PST8PDT
NEXT_RUN_DATE:2020-09-28 09:15:05.000000 PST8PDT
REPEAT_INTERVAL:FREQ=MONTHLY; INTERVAL=1; BYMONTHDAY=28; BYHOUR=9; BYMINUTE=15
之后一顿百度操作猛如虎,查看各路大佬是否遇到这类问题
总结可能导致的原因如下:
- oracle定时器job长时间执行无法结束。意思就是执行的时候,出于某种原因,数据库崩了之类的。job卡死。
- 查询job_queue_processes参数
- 系统uptime超过497天100%bug
尝试定位问题方式一:oracle定时器job长时间执行无法结束
参考学习博文:oracle定时器job长时间执行无法结束
之后一顿操作:
-- 描述正在运行的Job的相关信息
select * from dba_scheduler_running_jobs;
-- 描述已经完成的Job是否成功,记录相关日志的视图,这里记录着所有已经执行完毕的日程
select * from user_scheduler_job_run_details;
select * from user_scheduler_job_log ;
-- 描述当前数据库所有已知的日程。
select