Oracle DBMS_SCHEDULER 与 DBMS_JOB 的对比
一 基本概述对比
| 特性 | DBMS_JOB (旧版) | DBMS_SCHEDULER (新版) | 
|---|---|---|
| 引入版本 | Oracle 7 (1992年) | Oracle 10g R1 (2003年) | 
| 当前状态 | 已过时但仍支持 | 推荐使用的标准 | 
| 设计目的 | 基础作业调度 | 企业级作业调度系统 | 
二 功能特性对比
2.1 作业定义能力
-  
DBMS_JOB:
- 仅支持PL/SQL代码片段
 - 无正式作业名称,只有数字ID
 
BEGINDBMS_JOB.SUBMIT(job => :jobno,what => 'BEGIN my_proc; END;',next_date => SYSDATE,interval => 'SYSDATE+1'); END; -  
DBMS_SCHEDULER:
- 支持命名作业
 - 可执行PL/SQL块、存储过程、外部程序等
 - 支持作业链、作业类等高级概念
 
BEGINDBMS_SCHEDULER.CREATE_JOB(job_name => 'MY_JOB',job_type => 'PLSQL_BLOCK',job_action => 'BEGIN my_proc; END;',start_date => SYSDATE,repeat_interval => 'FREQ=DAILY',enabled => TRUE); END; 
2.2 调度灵活性
-  
DBMS_JOB:
- 简单日期表达式
 - 仅支持基于日期的间隔
 
interval => 'SYSDATE+1/24' -- 每小时执行 -  
DBMS_SCHEDULER:
- 使用日历表达式
 - 支持复杂调度规则
 
repeat_interval => 'FREQ=HOURLY; BYMINUTE=0,15,30,45' 
2.3 资源管理
-  
DBMS_JOB:
- 无内置资源控制
 - 无法限制作业资源使用
 
 -  
DBMS_SCHEDULER:
- 支持作业优先级
 - 可分配资源计划
 - 可限制CPU使用等
 
DBMS_SCHEDULER.SET_ATTRIBUTE('MY_JOB','max_run_duration',INTERVAL '30' MINUTE ); 
三 管理维护对比
3.1 监控能力
-  
DBMS_JOB:
- 有限的视图(DBA_JOBS, DBA_JOBS_RUNNING)
 - 无历史执行记录
 
 -  
DBMS_SCHEDULER:
- 丰富的视图(DBA_SCHEDULER_JOBS等)
 - 完整的执行历史记录
 
SELECT * FROM DBA_SCHEDULER_JOB_RUN_DETAILS WHERE job_name = 'MY_JOB'; 
3.2 错误处理
-  
DBMS_JOB:
- 简单重试机制
 - 失败16次后自动标记为broken
 
 -  
DBMS_SCHEDULER:
- 可配置重试策略
 - 支持失败通知
 - 可定义失败后的处理程序
 
DBMS_SCHEDULER.SET_ATTRIBUTE('MY_JOB','max_failures',5 ); 
四 性能与扩展性对比
| 维度 | DBMS_JOB | DBMS_SCHEDULER | 
|---|---|---|
| 并发作业数 | 有限(依赖JOB_QUEUE_PROCESSES) | 更高性能,更好的扩展性 | 
| 依赖管理 | 无内置支持 | 支持作业依赖和作业链 | 
| 多租户支持 | 不明确 | 12c+完整支持PDB/CDB | 
五 实际应用建议
-  
新项目开发:一律使用DBMS_SCHEDULER
 -  
旧系统维护:
- 简单作业可保持使用DBMS_JOB
 - 复杂需求应迁移到DBMS_SCHEDULER
 
 -  
迁移路径:
-- 使用DBMS_SCHEDULER.CREATE_JOB创建新作业 -- 使用DBMS_JOB.REMOVE逐步淘汰旧作业 -  
混合环境注意事项:
- 两种系统独立运行
 - 共享JOB_QUEUE_PROCESSES参数
 - 监控时需同时检查两种作业
 
 
六 典型场景选择指南
-  
适合DBMS_JOB的场景:
- 简单的定时PL/SQL执行
 - 需要向后兼容的旧系统
 - 轻量级调度需求
 
 -  
必须使用DBMS_SCHEDULER的场景:
- 需要复杂调度规则
 - 需要执行操作系统命令或程序
 - 需要作业依赖和资源控制
 - 需要详细的作业历史记录
 - 在多租户环境中使用
 
 
七 版本兼容性说明
-  
Oracle 10g-11g:
- 两种系统共存
 - 建议开始迁移到DBMS_SCHEDULER
 
 -  
Oracle 12c+:
- DBMS_JOB仍然可用但不推荐
 - DBMS_SCHEDULER功能更丰富
 
 -  
Oracle 19c/21c:
- DBMS_JOB保持兼容性
 - 新功能只加入DBMS_SCHEDULER
 
 
更详细的内容请查看官方文档:
https://docs.oracle.com/en/database/oracle/oracle-database/12.2/arpls/DBMS_JOB.html#GUID-8C62D808-D7A3-4D21-B87F-A229B7CE1956
 
谨记:心存敬畏,行有所止。