Oracle Scheduler任务超时未完成时的重复执行行为咨询
Oracle Scheduler 常见问题解答
嘿,针对你问的这两个Oracle Scheduler问题,我来给你详细拆解清楚:
1. 存储过程未在下次启动时间前完成时会出现什么情况?
- 默认行为:Oracle Scheduler默认不允许同一个任务(Job)同时运行多个实例。如果你的存储过程还在执行,到了下一次调度时间,系统会直接跳过这次的运行实例。你可以查询
DBA_SCHEDULER_JOB_RUN_DETAILS视图查看日志,这个被跳过的实例状态会标记为SKIPPED,原因通常显示为"Previous run still in progress"。 - 自定义配置选项:
- 如果你需要允许任务并发运行,可以通过修改
MAX_RUNNING_JOBS属性实现。执行以下命令即可调整:
这里的数值2表示最多允许2个实例同时运行,你可以根据需求调整。EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('your_job_name', 'MAX_RUNNING_JOBS', 2); - 另外,你还可以设置
MAX_DURATION属性来限制任务的最长运行时间,如果任务执行时长超过这个值,Scheduler会自动终止该实例,避免长期占用资源:EXEC DBMS_SCHEDULER.SET_ATTRIBUTE('your_job_name', 'MAX_DURATION', INTERVAL '1' HOUR);
- 如果你需要允许任务并发运行,可以通过修改
2. 若任务执行时长超过1小时,但配置为每小时重跑一次,系统会创建多个运行会话还是等待前次运行完成?
- 默认行为:默认情况下,系统会等待前一次运行完成,不会创建多个会话。当任务执行时长超过1小时,到了下一个调度时间点时,新的运行请求会被跳过,直到当前实例执行完毕后,下一次调度时间才会正常启动新的实例。
- 开启并发运行的方法:如果你的业务场景需要每小时都启动新的任务实例,哪怕之前的还在运行,就需要修改
MAX_RUNNING_JOBS参数,将其设置为大于1的数值(参考第一个问题里的命令)。这样系统到点就会创建新的运行会话,允许多个实例同时执行。 - 注意事项:开启并发前一定要确认你的存储过程能处理并发场景,比如是否存在数据锁冲突、重复操作等问题,避免出现数据不一致的情况。
内容的提问来源于stack exchange,提问作者Athrey T R
相关产品推荐
相关产品推荐

