摘要: 本文深入探讨 Oracle 中的自动任务调度机制,重点围绕 Advanced SCHEDULER 展开,详细阐述了 jobs、program、schedule 等核心概念,以及 job classes、window、job chain 和轻型作业等相关要素,旨在帮助数据库管理员和开发人员全面理解并熟练运用 Oracle 的任务调度功能,提升数据库管理与业务处理的自动化水平和效率。
一、引言
在现代数据库管理中,自动任务调度是一项至关重要的功能。Oracle 提供了强大的任务调度机制,尤其是在 Oracle 10g 之后引入的 Advanced SCHEDULER,通过 dbms_scheduler 程序包实现了更为灵活和强大的作业调度功能。它不仅整合了 Resource Management 的内容,还提供了丰富多样的特性,以满足各种复杂的业务需求。
二、核心概念解析
(一)Advanced SCHEDULER 下的 jobs
- 组成与分类
- 一个基本的 JOB 由 program 和 schedule 两方面组成。总体上可分为两大类,基于时间的 JOB 和基于事件的 JOB。在 Oracle 10g 之前,采用 dbms_job 程序包进行任务调度,而之后则主要依赖功能更强大的 dbms_scheduler。
- 必须将 JOB_QUEUE_PROCESSES 实例参数设置为大于 0 的值,否则调度程序将无法运行,其默认值为 1000。当有定义的活动作业时,作业队列协调器(后台进程 cjq0)会总是运行,同时还有 job slave(如 oracle@prod.localdomain (J000))根据参数可存在多个。
(二)Advanced SCHEDULER 下的 program
- 类型与功能
- Program 指运行的程序,包括三种可选类型。PL/SQL BLOCK 即标准的 pl/sql 代码块;STORED PROCEDURE 涵盖编译好的 PL/SQL 存储过程、Java 存储过程以及外部的 c 子程序;EXECUTEABLE 则是 Oracle 数据库之外的应用,如操作系统命令等。它明确了作业具体要执行的操作内容。
(三)Advanced SCHEDULER 下的 schedule
- 作业运行周期
- Schedule 有的资料翻译为调度,有的翻译成时间表,其本质是确定作业运行的时间和频率,即作业运行周期。它规定了作业何时执行,与 program 协同工作,共同构成了作业的完整定义。在 11g 的 SCHEDULER 中提供了六种建立 Job 的存储过程,可灵活地将 program、schedule、job 分立创建或混合创建。
(四)JOB CLASSES
- 作业分组与优先级管理
- 相当于创建了一个 job 组,可将具有相同特性的 job 放入其中。在 Job Classes 中的 Jobs 可以指派优先级(1 - 5),默认优先级是 3,其中 1 的优先级最高。并且可以让 Job Classes 与资源计划器结合进行管理,从而实现对作业资源分配和执行顺序的精细化控制。
(五)WINDOW
- 作业运行时间窗口与资源管理关联
- 窗口指定了作业运行的起始时间(START DATE)、终止时间(END DATE)、运行时间(DURATION)以及重复间隔(REPEAT INTERVAL)等。它不仅扩展了 SCHEDULER(时间表)的概念,还能在窗口打开时激活资源管理计划,使数据库自动切换到相关的 resource plan 上并处于活动状态。同时,通过 job class 和 resource plan 的联系,窗口下被激活的 resource plan 中所关联的 job class 中的所有 job 会根据优先权调度运行,进一步增强了作业调度与资源管理的协同性。
(六)JOB CHAIN
- 程序组合与逻辑执行
- CHAIN 可视为一组 Programs 的组合,并带有特定的执行逻辑。例如,运行 PROGRAM:A 以及 PROGRAM:B,如果成功则继续运行 PROGRAM:C,否则运行 PROGRAM:D。Programs:A、B、C、D 以及它们之间的执行逻辑关系就构成了一个最简单的 CHAIN。这种机制使得作业能够根据不同的执行结果进行灵活的后续操作,适应复杂的业务流程处理需求。
(七)轻型作业
- 特性与应用场景
- 轻型作业不显示在 DBA_SCHEDULER_JOBS 视图中,因为它不是模式对象。与普通作业相比,其创建和删除的开销非常小。适用于两种情形:一是作业成百上千次的批量执行,二是单个作业运行时间较短。使用 DBMS_SCHEDULER 程序包在 PL/SQL 中创建轻型作业时,只有很少的参数可指定(作业参数和计划),作业的其余元数据(包括权限)都是从作业模板继承来的,且其模板必须是 PL/SQL 块或存储过程,JOB_STYLE 参数在 EM 中不可见。
三、实际应用与最佳实践
在实际应用中,数据库管理员可以根据业务需求合理规划 jobs。首先,确定具体的 program,根据业务逻辑选择合适的 PL/SQL 代码块、存储过程或外部应用。然后,精心设计 schedule,考虑作业的执行频率、时间点等因素,以确保作业在合适的时间运行,不影响系统的正常性能和业务高峰时段。对于具有相似特征的作业,可以归类到 job classes 中并设置合适的优先级,以便在资源有限的情况下优先执行关键作业。利用 window 功能,结合资源管理计划,在特定时间段内优化资源分配给不同的 job classes。在复杂业务流程中,构建 job chain 来实现多程序的有序、有条件执行。对于大量短时间或批量执行的作业,采用轻型作业来降低系统开销。
同时,在使用过程中要密切关注 JOB_QUEUE_PROCESSES 参数的设置,确保其满足作业调度的需求。定期监控作业的执行情况,查看作业日志,及时发现和解决作业执行过程中的错误或异常情况。对于 job classes、window、job chain 等的配置也要进行定期审查和优化,以适应业务的发展和变化。
四、结论
Oracle 的自动任务调度功能,特别是 Advanced SCHEDULER,为数据库管理和业务自动化提供了强大的支持。通过深入理解 jobs、program、schedule 等核心概念以及 job classes、window、job chain 和轻型作业等相关要素,并将其合理应用于实际业务场景中,能够显著提高数据库管理的效率和自动化水平,确保业务系统的稳定运行和高效处理各种任务。数据库管理员和开发人员应不断探索和实践,充分发挥 Oracle 自动任务调度的优势,以应对日益复杂的数据库管理和业务处理挑战。
欢迎关注公众号《小周的数据库进阶之路》,更多精彩知识和干货尽在其中。