PG实现定时任务的几种方法

0    944    8

👉 本文共约3786个字,系统预计阅读时间或需15分钟。

简介

数据库定时任务可以用于实现定期的备份、统计信息采集、数据汇总、数据清理与优化等。PostgreSQL 没有提供类似 Oracle、MySQL 以及 Microsoft SQL Sever 的内置任务调度功能,本文介绍在 PostgreSQL 数据库中实现定时任务的 4 种方法,包括操作系统定时任务、pgAgent 代理、pg_cron 插件以及 pg_timetable 工具。

方法1:操作系统定时任务

Linux 定时任务(crontab)或者 Windows 任务计划程序(Task Scheduler)为我们提供了一个实现定时任务传统的方法。以 crontab 为例,我们可以使用以下命令编辑任务列表:

然后在打开的文件中使用以下格式增加一行数据:

其中的前五个字段表示执行命令的时间,可以使用星号(*)匹配所有的时间。例如,将 设置为星号表示每个月都执行命令。

举例来说,输入以下内容表示每天零点执行数据库逻辑备份操作。

为了安全起见不要直接输入密码,而是应该将密码加入 .pgpass 文件,并且将该文件的权限设置为仅当前用户可见:

方法2:pgAgent

pgAgent 是一个用于 PostgreSQL 数据库的任务调度代理,能够基于复杂的调度计划运行多步骤的批处理、shell 脚本以及 SQL 命令。

对于 Unix/Linux 系统,pgAgent 以后台进程的方式运行;对于 Windows 系统,pgAgent 以服务的形式运行。

pgAgent is a job scheduler for PostgreSQL which may be managed using pgAdmin. Prior to pgAdmin v1.9, pgAgent shipped as part of pgAdmin. From pgAdmin v1.9 onwards, pgAgent is shipped as a separate application.

在pgAdmin v1.9版本之前,pgAgent是其安装包的一部分,pgAdmin v1.9之后 pgAgent独立成一个单独的软件包。

PgAdmin 4 管理工具集成了 pgAgent 的功能,但是这两者需要单独安装。我们可以通过官方网站下载 PgAdmin 4 以及 pgAgent。

具体安装pgAdmin4步骤和注意事项可以参考:https://www.xmmup.com/dbbao71postgresqltuxinghuajiemiangongjuzhipgadmin4.html

安装 pgAgent

参考:https://www.pgadmin.org/docs/pgadmin4/latest/pgagent_install.html

需要在PG数据库服务器端安装pgAgent:

可以直接yum安装,也可以编译安装(参考:https://blog.csdn.net/ctypyb2002/article/details/77855209

安装完成之后,我们可以在 PgAdmin 4 左侧导航树中看到“pgAgent Jobs”节点。

PG实现定时任务的几种方法

创建定时任务

右键点击“pgAgent Jobs”节点,选择“Create” > “pgAgent Job”创建一个新的定时任务。

PG实现定时任务的几种方法

其中,“General”页面可以输入一些基本信息,包括任务的名称。“Steps”页面可以设置多个操作步骤,包括执行的脚本或者 SQL 语句等。“Schedules”页面用于定义任务执行的时间计划。“SQL”页面可以显示创建或者修改任务的语句。

点击“Save”按钮保存设置并创建任务,然后我们就可以在“pgAgent Job”节点下看到创建的任务。

  • 定义作业步骤

在General页定义通用信息

PG实现定时任务的几种方法

在code页定义需要执行的代码

PG实现定时任务的几种方法

  • 定义调度信息

在general页定义基本信息

PG实现定时任务的几种方法

在Repeat页定义周期,周期使用cron风格。

PG实现定时任务的几种方法

以上所有操作也可以通过SQL进行,上面所有操作对应的代码如下:

再回到图形界面,除了预先定义好的作业外,通过作业上的run now选项可以立刻执行一次。

上面的设置里我选择在每天的15点56-59分,一共执行4次作业,每次向t1表写入一条数据。完成后

PG实现定时任务的几种方法

pgAgent的数据字典表

pgAgent的相关表都位于Catalogs/pgAgent下。

  • pga_exception : 记录作业执行异常信息
  • pga_job: 作业定义的基本信息,作业起止时间,最后运行时间等
  • pga_jobagent:pgAgent的配置信息,服务器上pgAgent的地址和启动时间
  • pga_jobclass: pgAgent的配置信息,定义作业类型
  • pga_joblog:每个作业的运行日志,包含启动时间、执行时长。
  • pga_jobstep每个job步骤的定义在这个表里。
  • pga_jobsteplog:每个job步骤的执行日志,包含步骤的开始时间,执行时长。
  • pga_schedule:job调度的定义在这个表里。

PG实现定时任务的几种方法

方法3:pg_cron

pgagent功能确实不错,但是需要的依赖太多了,需要先装PGadmin以及一大堆的依赖包,这导致使用起来非常不方面,很不友好。而pg_cron相对而言简单了很多,只需要编译和修改三两个参数就可以了。

pg_cron 是由 citusdata 公司开发的一个 PostgreSQL 定时任务插件(类似于 Oracle 中的 DBMS_SCHEDULER)。pg_cron 作为一个后台工作进程运行,使用类似 cron 的编辑语法,允许直接在数据库中执行定时任务。例如:

安装 pg_cron

GitHub:https://github.com/citusdata/pg_cron

pg_cron 目前只支持 Linux 操作系统。对于 Red Hat、CentOS 以及 Fedora 等操作系统可以使用以下命令进行安装:

另外,我们也可以使用源码进行编译安装:

配置 pg_cron

为了在启动 PostgreSQL 时运行 pg_cron 后台工作进程,我们需要将 pg_cron 添加到 postgresql.conf 文件中的 shared_preload_libraries配置项。默认情况下,pg_cron 后台进程使用 postgres 数据库获取所需的元数据。但是我们也可以使用 cron.database_name 配置参数进行设置。

重启 PostgreSQL:

本人提供Oracle、MySQL、PG等数据库的培训和考证业务,私聊QQ646634621或微信db_bao,谢谢!

然后我们可以使用以下命令创建 pg_cron 函数以及元数据相关的表:

方法4:pg_timetable

GitHub:https://github.com/cybertec-postgresql/pg_timetable

文档:https://pg-timetable.readthedocs.io/en/master/

pg_timetable 是由 CYBERTEC 公司开发的 PostgreSQL 作业调度程序,提供了灵活的配置方式和许多高级功能。包括由多个任务组成的任务链、支持 SQL 命令和可执行程序、内置任务(例如发送邮件)、完全基于数据库的配置和日志功能、cron 风格的计划调度、并发执行的保护等。

图片

安装 pg_timetable

首先,我们可以使用官方发布的二进制安装程序安装 pg_timetable,目前支持 Windows、Linux 以及 macOS 操作系统。

二进制的下载地址:https://github.com/cybertec-postgresql/pg_timetable/releases

master 分支的 latest 标签是最新版本,docker使用命令行的运行方式如下:

指定环境变量的方式如下:

除此之外,我们也可以使用源码进行编译安装。首先下载并安装 Go 语言环境,然后使用 go get 命令拷贝 pg_timetable 源码:

运行 pg_timetable:

或者,也可以编译成二进制程序并运行:

如果想要运行项目中的所有测试,可以执行以下命令:

也可以使用 postgres docker 镜像运行测试:

使用 pg_timetable

pg_timetable 独立于 PostgreSQL 服务器运行,相当于一个客户端进程。安装完成之后,执行以下命令运行 pg_timetable 程序

源代码的 sample 目录中提供了大量的示例可以参考。以下命令可以创建一个 8 月份 00:05 运行“MyJob”的定时任务:

以下命令表示从 0 点到 20 点,每两个小时的 23 分时运行“MyJob”任务:

pg_timetable 计划任务的完整配置由 3 个阶段组成:

  • 第一个阶段用于配置 base_task,定义需要执行的操作。包括 SQL 语句、外部程序以及内置的操作。
  • 第二个阶段用于配置 task_chain,定义一组顺序执行的基本任务。
  • 第三阶段用于配置 chain_execution_config,定义任务链的执行计划。

图片

此外,为了给基本任务传递控制参数,任务链中的任务都可以附带一个执行参数。详细的配置方法和案例可以参考官方网站。

参考

https://blog.csdn.net/horses/article/details/109450316

标签:

头像

小麦苗

学习或考证,均可联系麦老师,请加微信db_bao或QQ646634621

您可能还喜欢...

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注

4 × 3 =

 

嘿,我是小麦,需要帮助随时找我哦
  • 18509239930
  • 个人微信

  • 麦老师QQ聊天
  • 个人邮箱
  • 点击加入QQ群
  • 个人微店

  • 回到顶部
返回顶部