2021年8月25日
pg_dbms_job 是一个新的 PostgreSQL 扩展,用于创建、管理和使用 Oracle 风格的 DBMS_JOB 计划作业。其使用和行为与 Oracle 的 DBMS_JOB 包完全相同。
pg_dbms_job v1.0.1 已经发布,这是该扩展的第一个版本,兼容 PostgreSQL 9.1 到当前版本。
它允许从作业队列管理计划作业或立即异步执行作业。一个作业定义包括要执行的代码、下一次执行的日期以及作业的运行频率。一个作业运行一个 SQL 命令、plpgsql 代码或现有的存储过程。
如果调用 submit 存储过程时没有 next_date(何时)和 interval(多久一次)属性,则该作业将立即在异步进程中执行。如果 interval 为 NULL 且 next_date 小于或等于当前时间戳,则该作业也会立即作为异步进程执行。在所有其他情况下,该作业将在适当的时候启动,但如果 interval 为 NULL,则该作业仅执行一次并且该作业将被删除。
如果计划作业成功完成,则其新的执行日期将放置在 next_date 中。新日期通过评估定义为 interval 的 SQL 表达式来计算。interval 参数必须评估为未来的时间。
此扩展包含一个 SQL 脚本,用于创建所有与其操作相关的对象,以及一个守护进程,该守护进程必须附加到定义作业的数据库上运行。守护进程负责执行排队的异步作业和计划作业。它可以在定义作业的数据库所在的同一主机上运行,也可以在任何其他主机上运行。计划时间取自数据库主机,而不是守护进程运行的主机。
默认情况下,可以同时执行的作业数量限制为 1000。如果达到此限制,守护进程将等待一个进程结束以运行新的进程。
使用外部调度程序守护进程而不是后台工作进程是一个选择,从后台工作进程 fork 数千个子进程不是一个好主意。
作业的执行是由调度程序在提交或修改新作业时收到的 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 扩展是 MigOps Inc 的原创作品,MigOPs 专注于迁移到 PostgreSQL 和 PostgreSQL 支持。如果您需要更多信息,请 联系我们