2025年9月25日: PostgreSQL 18 发布!

PostgreSQL DBMS_JOB 兼容性扩展

发布于 2021-08-25,作者 MigOps
相关开源项目

2021 年 8 月 25 日

PostgreSQL DBMS_JOB 兼容性扩展

pg_dbms_job 是一个 PostgreSQL 新扩展,用于创建、管理和使用 Oracle 风格的 DBMS_JOB 计划任务。其用法和行为与 Oracle 的 DBMS_JOB 包完全一致。

pg_dbms_job v1.0.1 已发布,这是该扩展的第一个版本,兼容 PostgreSQL 9.1 到当前版本。

它允许通过任务队列管理计划任务,或异步立即执行任务。任务定义包含要执行的代码、下次执行日期以及运行频率。任务可以运行 SQL 命令、plpgsql 代码或现有的存储过程。

如果调用 submit 存储过程时未提供 next_date (when) 和 interval (how often) 属性,则任务将在异步进程中立即执行。如果 interval 为 NULL 且 next_date 低于或等于当前时间戳,则任务也将作为异步进程立即执行。在所有其他情况下,任务将在适当的时候启动,但如果 interval 为 NULL,则任务仅执行一次,然后删除。

如果计划任务成功完成,则其新的执行日期将放入 next_date。新日期通过评估定义为 interval 的 SQL 表达式来计算。interval 参数必须评估为将来的时间。

此扩展包含一个 SQL 脚本,用于创建与其操作相关的所有对象,以及一个必须连接到定义任务的数据库的守护进程。该守护进程负责执行队列中的异步任务和计划任务。它可以运行在数据库所在的同一台主机上,也可以运行在任何其他主机上。计划时间是从数据库主机获取的,而不是从守护进程运行的主机获取的。

默认情况下,可以同时执行的任务数量限制为 1000。如果达到此限制,守护进程将等待一个进程结束后再运行新的进程。

选择使用外部调度守护进程而不是后台工作进程是一个明智的决定,因为从后台工作进程派生数千个子进程不是一个好主意。

当调度器收到新的任务提交或修改的 NOTIFY 事件时,会触发任务执行。通知每 0.1 秒轮询一次。当没有通知时,调度器每 job_queue_interval 秒(默认为 5 秒)轮询存储任务定义的表。这意味着在最坏的情况下,任务将在定义的下一个执行日期之后的 job_queue_interval 秒内执行。

有关更多信息,请参阅 pg_dbms_job 文档

链接与致谢

pg_dbms_job 是一个基于 PostgreSQL 许可证的开源项目,由 Gilles Darold 在 MigOps Inc 创建,作为 Ora2Pg 改进的一部分。欢迎为构建更好的工具做出贡献。您可以使用 GitHub 工具发送您的想法、功能请求或补丁。

链接

关于 pg_dbms_job

pg_dbms_job 扩展是 MigOps Inc 的原创作品,MigOPs 专注于 PostgreSQL 迁移和 PostgreSQL 支持。如果您需要更多信息,请与我们联系

文档地址: https://github.com/MigOpsRepos/pg_dbms_job#readme