pg_cron
更新时间:2024-07-01 14:39:41
pg_cron 插件描述
pg_cron 是一个简单的基于 cron 的AntDB任务调度器,作为扩展在数据库中运行。它使用与常规 cron 相同的语法,允许您直接从数据库定时调度并执行数据库命令。
使用准备
- 修改配置文件后重启数据库
# 修改postgresql.conf文件,存在备机的情况下,备机也需要修改
shared_preload_libraries = 'pg_cron'
cron.use_background_workers = on
max_worker_processes = 16
- 登陆数据库,执行 SQL 命令,创建扩展
CREATE EXTENSION pg_cron;
使用方法
pg_cron 提供三个主要操作:增加任务项、删除任务项、查看任务信息,对应的函数如下。
- cron.schedule() 函数:增加任务项
# cron.schedule() 函数,用于计划 cron 任务,可以查看该函数定义如下:
crondb=# \df cron.schedule()
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+----------+------------------+--------------------------------------------+------
cron | schedule | bigint | job_name text, schedule text, command text | func
cron | schedule | bigint | schedule text, command text | func
其中:
job_name:cron 任务的名字,可为空不设置。
schedule:表示 cron 任务时间表的文本。格式是标准 cron 格式。
command:要运行的命令的文本。
schedule 使用标准的 cron 语法,其中 * 表示“每个该时间运行”,特定数字表示“仅在这个数字时运行”。
# 格式是:分 时 日 月 星期
# week (0 - 6) = sun,mon,tue,wed,thu,fri,sat
# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,...,sat
# | | | | |
# * * * * *
- cron.unschedule() 函数:删除任务项
# cron.unschedule() 函数删除 cron 任务。可以传入 job_name 或 job_id。请确保您是当前 job_id 所对应的策略的拥有者。该函数返回一个布尔值,指示成功或失败。可以查看该函数定义如下:
crondb=# \df cron.unschedule()
List of functions
Schema | Name | Result data type | Argument data types | Type
--------+------------+------------------+---------------------+------
cron | unschedule | boolean | job_id bigint | func
cron | unschedule | boolean | job_name text | func
其中:
job_id:计划 cron 任务时从 cron.schedule 函数返回的任务标识符。
job_name:使用该 cron.schedule 函数计划的 cron 任务的名称。
-
pg_cron 表:查看任务信息,包括表格 cron.job 和 cron.job_run_details
表格 cron.job:包含有关每个计划任务的元数据。
表格 cron.job_run_details:包含过去运行的计划任务的历史信息。
使用示例
# 登陆数据库,执行如下SQL:
adb -p XXX -d postgres
CREATE DATABASE crondb;
# postgresql.conf 增加配置,主备机都要修改
cron.database_name = 'crondb'
# 重启数据库,上述参数修改生效,再登陆数据库
adb -p XXX -d crondb
crondb=# CREATE EXTENSION pg_cron;
CREATE EXTENSION
crondb=# CREATE TABLE tt(d timestamp);
CREATE TABLE
crondb=#
crondb=# INSERT INTO tt VALUSE(now());
INSERT 0 1
crondb=# --创建定时任务,每隔一分钟执行一次insert操作
crondb=# SELECT cron.schedule('*/1 * * * *', 'INSERT INTO tt VALUSE(now())');
schedule
----------
1
(1 row)
--查询操作可以在备机执行
--查看定时任务
crondb=# SELECT * FROM cron.job;
jobid | schedule | command | nodename | nodeport | database | username | active | jobname
-------+-------------+------------------------------+-----------+----------+----------+----------+--------+---------
1 | */1 * * * * | INSERT INTO tt VALUSE(now()) | localhost | 7777 | crondb | antdb | t |
(1 row)
--任务运行情况
crondb=# SELECT * FROM cron.job_run_details;
jobid | runid | job_pid | database | username | command | status | return_message | start_time |
end_time
-------+-------+---------+----------+----------+------------------------------+-----------+----------------+-------------------------------+----------
---------------------
1 | 1 | 3385274 | crondb | antdb | insert into tt values(now()) | succeeded | INSERT 0 1 | 2023-08-21 16:46:00.002926+08 | 2023-08-2
1 16:46:00.006978+08
1 | 2 | 3385311 | crondb | antdb | insert into tt values(now()) | succeeded | INSERT 0 1 | 2023-08-21 16:47:00.001908+08 | 2023-08-2
1 16:47:00.007554+08
(2 rows)
--查询定时任务是否实际生效
crondb=# SELECT * FROM tt;
d
----------------------------
2023-08-21 16:45:57.834792
2023-08-21 16:46:00.005022
2023-08-21 16:47:00.005595
(3 rows)
--删定时任务,括号中的1代表jobid
crondb=# SELECT cron.unschedule(1);
unschedule
------------
t
(1 row)
问题反馈