pgcron doc#

Pg_cron āĻāĻ•āĻŸāĻŋ cron-based job scheduler āĻ¯āĻž PostgreSQL(9.5 or higher) āĻāĻ° āĻ­ā§‡āĻ¤āĻ° āĻāĻ•āĻŸāĻŋ Database extension āĻšāĻŋāĻ¸ā§‡āĻŦā§‡ run āĻ•āĻ°ā§‡āĨ¤ Pg_cron āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ specific āĻ¸āĻŽā§Ÿ āĻĒāĻ° āĻĒāĻ° āĻ¨āĻŋāĻ°ā§āĻĻāĻŋāĻˇā§āĻŸ sql query āĻ•ā§‡ postgresql āĻ execute āĻ•āĻ°āĻž āĻ¯āĻžā§ŸāĨ¤

for an example application āĻāĻ° people suggation portion āĻĨā§‡āĻ•ā§‡ user1 āĻ¯āĻĻāĻŋ user13 āĻ•ā§‡ unmatch āĻ•āĻ°ā§‡, āĻ¤āĻŦā§‡ user1 āĻ¤āĻžāĻ° suggestion portion āĻāĻŦāĻ‚ search people portion āĻ user13 āĻ•ā§‡ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦā§‡ āĻ¨āĻž āĻāĻŦāĻ‚ user13 āĻ“ āĻ¤āĻžāĻ° suggestion portion āĻāĻŦāĻ‚ search people portion āĻ user1 āĻ•ā§‡ āĻĻā§‡āĻ–āĻ¤ā§‡ āĻĒāĻžāĻŦā§‡ āĻ¨āĻžāĨ¤

According to business case, unmatched āĻ•āĻ°āĻž users āĻ—ā§āĻ˛ā§‹ 40 days āĻāĻ° āĻŦā§‡āĻļāĻŋ unmatched āĻĨāĻžāĻ•āĻŦā§‡ āĻ¨āĻžāĨ¤ āĻ¤āĻžāĻ°āĻž āĻ†āĻŦāĻžāĻ° suggestion āĻŸā§‡āĻŦāĻŋāĻ˛ āĻāĻŦāĻ‚ search people portion āĻ seen āĻšāĻŦā§‡āĨ¤
āĻ¯ā§‡ āĻ¸āĻŦ user āĻāĻ° unmatched date ā§Ēā§Ļ āĻĻāĻŋāĻ¨ āĻšā§Ÿā§‡āĻ›ā§‡ āĻ¤āĻžāĻĻā§‡āĻ°āĻ•ā§‡ unmatch table āĻĨā§‡āĻ•ā§‡ remove āĻ•āĻ°ā§‡ āĻĻā§‡ā§ŸāĻžāĻ° opperation āĻŸāĻŋ postgreSQL āĻāĻ° under āĻ āĻ¸āĻŽā§āĻĒā§‚āĻ°ā§āĻŖ āĻšā§ŸāĨ¤ āĻĒā§āĻ°āĻ¤āĻŋāĻĻāĻŋāĻ¨ āĻ°āĻžāĻ¤ ā§Š āĻŸāĻžāĻ° āĻ¸āĻŽā§Ÿ user_unmatches table āĻ PostgreSQL āĻāĻ•āĻŸāĻŋ query āĻ…āĻĒāĻžāĻ°ā§‡āĻļāĻžāĻ¨ execute āĻ•āĻ°āĻŦā§‡ āĻāĻŦāĻ‚ current date-time āĻāĻ° āĻĨā§‡āĻ•ā§‡ 40 days āĻĒā§‚āĻ°ā§āĻŦā§‡ create āĻšāĻ“ā§ŸāĻž row/user information āĻ—ā§āĻ˛ā§‹ remove āĻ•āĻ°ā§‡ āĻĻāĻŋāĻŦā§‡āĨ¤

āĻ‰āĻĒāĻ°ā§‹āĻ•ā§āĻ¤ operation āĻŸāĻŋ āĻāĻ•āĻŸāĻŋ scheduler operation āĻ¯āĻž postgreSQL āĻāĻ° under āĻ pg_cron āĻāĻ° āĻĻā§āĻŦāĻžāĻ°āĻž execute āĻšā§ŸāĨ¤ PostgreSQL āĻ Pg_cron configure āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻšā§‡āĻ° instruction follow āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĨ¤

Installing Pg_cron: Red Hat, CentOS, Fedora, and Amazon Linux āĻāĻ° āĻ¸āĻ‚āĻ˜ā§‡ PostgreSQL 12 āĻ pg_cron extension install :

sudo yum install -y pg_cron_12

install on Debian, and Ubuntu with PostgreSQL 12 using apt.postgresql.org:

sudo apt-get -y install postgresql-12-cron

Setting up pg_cron: Pg_cron āĻāĻ° āĻœāĻ¨ā§āĻ¯ postgreSQL āĻāĻ° background worker enable āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ shared_preload_libraries āĻ¤ā§‡ pg_cron āĻ•ā§‡ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡ āĨ¤ server āĻ¯āĻĻāĻŋ hot standby mode āĻ āĻĨāĻžāĻ•ā§‡ āĻ¤āĻŦā§‡ pg_Cron run āĻšāĻŦā§‡ āĻ¨āĻžāĨ¤ āĻ•āĻŋāĻ¨ā§āĻ¤ā§ āĻ¯āĻ–āĻ¨ server start āĻšāĻŦā§‡ pg_cron automatically start āĻšāĻŦā§‡āĨ¤

add to postgresql.conf#

required to load pg_cron background worker on start-up#

shared_preload_libraries = 'pg_cron'

By default, pg_cron āĻāĻ° background worker āĻ¤āĻžāĻ° metadata tables āĻ—ā§āĻ˛ā§‹ “Postgres” database āĻ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻ¤āĻžāĻ‡ āĻ¯ā§‡ database āĻāĻ° table āĻ scheduler operation āĻŸāĻŋ execute āĻšāĻŦā§‡ āĻ¸ā§‡āĻ‡ database name āĻŸāĻŋ postgresql.conf file āĻāĻ° cron.database_name configuration parameter āĻ āĻ‰āĻ˛ā§āĻ˛ā§‡āĻ– āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

add to postgresql.conf#

optionally, specify the database in which the pg_cron background worker should run (defaults to postgres)#

cron.database_name = 'database_name’

Configuration part āĻļā§‡āĻˇ āĻšā§Ÿā§‡āĻ›ā§‡āĨ¤ āĻāĻ–āĻ¨ postgreSQL restart āĻ•āĻ°āĻžāĻ° āĻĒāĻ° ‘CREATE EXTENSION pg_cron’ āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ pg_cron function āĻāĻŦāĻ‚ metadata table āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°āĻ¤ā§‡ āĻĒāĻžāĻ°āĻž āĻ¯āĻžā§ŸāĨ¤

– run as superuser: CREATE EXTENSION pg_cron;

– optionally, grant usage to regular users: GRANT USAGE ON SCHEMA cron TO postgre_user_name;

Important: by default pg_Cron, libpq āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ āĻāĻ•āĻŸāĻŋ āĻ¨āĻ¤ā§āĻ¨ connection āĻ•ā§‡ local database āĻ āĻ¤ā§ˆāĻ°āĻŋ āĻ•āĻ°ā§‡āĨ¤ āĻ¯āĻž pg_hba.conf āĻĨā§‡āĻ•ā§‡ allowed āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšā§ŸāĨ¤ database āĻāĻ° user authentication āĻ trust enable āĻĨāĻžāĻ•āĻ¤ā§‡ āĻšāĻŦā§‡ āĻ¯ā§‡āĻ¨ localhost āĻ cron job running āĻĨāĻžāĻ•ā§‡ āĨ¤ āĻāĻ‡ āĻœāĻ¨ā§āĻ¯ postgreuser āĻāĻ° password āĻŸāĻŋ .pgpass file āĻ āĻ°āĻžāĻ–āĻ¤ā§‡ āĻšāĻŦā§‡, āĻ¯āĻž libpq āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ connection open āĻ•āĻ°āĻŦā§‡āĨ¤

.pgpass āĻāĻ‡ file āĻ postgresql āĻāĻ° credential āĻ¨āĻŋāĻŽā§āĻ¨ āĻ°ā§‚āĻĒā§‡ āĻĨāĻžāĻ•ā§‡,

hostname:port:database:username:password#

localhost:5432:demo_db:postgres:postgres

pg_cron āĻāĻ° background workers āĻāĻ° number of concurrent job āĻāĻ° limit āĻ•ā§‡ max_worker_processes āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ setting āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

Schedule jobs via background workers instead of localhost connections#

cron.use_background_workers = on

Increase the number of available background workers from the default of 8#

max_worker_processes = 20

āĻāĻ›āĻžā§œāĻž Unix domain socket directory āĻĨā§‡āĻ•ā§‡ hostname āĻ•ā§‡ trust permission āĻĻāĻŋā§Ÿā§‡ pg_cron āĻāĻ° libpq āĻāĻ° connection established āĻ•āĻ°āĻž āĻ¯āĻžā§ŸāĨ¤

Pg_cron āĻ•ā§‡ operational āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻšā§‡āĻ° step āĻ—ā§āĻ˛ā§‹ follow āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

Step 1: demo_db āĻāĻ‡ database āĻ pg_cron extension āĻ¨āĻŋā§Ÿā§‡ āĻ•āĻžāĻœ āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ at first postgreSQL āĻ CLI terminal āĻĨā§‡āĻ•ā§‡ connect āĻšāĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

psql -h localhost -U postgres demo_db;

Step 2: step 1 āĻ connect āĻĨāĻžāĻ•āĻž āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¤ā§‡ demo_db database āĻ Pg_cron āĻāĻ° plug-in create āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

CREATE EXTENSION pg_cron;
GRANT USAGE ON SCHEMA cron TO postgre_user_name;

Step 1 āĻ connect āĻĨāĻžāĻ•āĻž āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¤ā§‡ demo_db āĻĨā§‡āĻ•ā§‡ create āĻ•āĻ°āĻž extension remove āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻšā§‡āĻ° command run āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤
DROP EXTENSION pg_cron;

Step 1 āĻ connect āĻĨāĻžāĻ•āĻž āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¤ā§‡ pg_cron āĻĨā§‡āĻ•ā§‡ schedule āĻ•āĻ°āĻž āĻ¸āĻ•āĻ˛ queryāĻ—ā§āĻ˛ā§‹ āĻ¨āĻŋāĻšā§‡āĻ° query āĻĻā§āĻŦāĻžāĻ°āĻž āĻĻā§‡āĻ–āĻž āĻ¯āĻžā§ŸāĨ¤

    select * from cron.job;

    jobid |  schedule   |   command                       | nodename  | nodeport |  database   | username | active | jobname
    -------+----------------+----------------------------------+---------------+-------------+----------------+--------------+--------+---------

Step 3: Step 1 āĻ connect āĻĨāĻžāĻ•āĻž āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¤ā§‡ pg_cron āĻ postgreSQL āĻāĻ° query āĻŸāĻŋ shedule āĻ•āĻ°āĻžāĻ° āĻœāĻ¨ā§āĻ¯ āĻ¨āĻŋāĻšā§‡āĻ° query execute āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤ SELECT cron.schedule(‘0 3 * * *’, $$DELETE FROM public.auth_user_app_user_unmatch WHERE user_unmatch_created_at < now() - interval ‘40 days’$$);

Schedule query āĻŸāĻŋāĻ° structure SELECT cron.schedule(’* * * * *’, $$$$);

    ┌───────────── min (0 - 59)
    │ ┌────────────── hour (0 - 23)
    │ │ ┌─────────────── day of month (1 - 31)
    │ │ │ ┌──────────────── month (1 - 12)
    │ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to
    │ │ │ │ │ Saturday, or use names; 7 is also Sunday)
    │ │ │ │ │
    │ │ │ │ │

    * * * * *

Pg_cron āĻāĻ° āĻ•ā§‹āĻ¨ schedule āĻ•ā§‡ unschedule āĻ•āĻ°āĻ¤ā§‡ āĻšāĻ˛ā§‡ āĻ¨āĻŋāĻšā§‡āĻ° command āĻŸāĻŋ Step 1 āĻ connect āĻĨāĻžāĻ•āĻž āĻ…āĻŦāĻ¸ā§āĻĨāĻžāĻ¤ā§‡ run āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤
SELECT cron.unschedule(jobid); Or SELECT cron.unschedule(jobid) FROM cron.job;

SELECT \* FROM cron.job; āĻĨā§‡āĻ•ā§‡ Jobid āĻ¨āĻŋā§Ÿā§‡ āĻ¸ā§‡āĻ‡ jobid user āĻ•āĻ°ā§‡ unschedule āĻ•āĻ°āĻ¤ā§‡ āĻšāĻŦā§‡āĨ¤

    jobid | schedule | command | nodename | nodeport | database | username | active | jobname
    -------+-------------+-----------------------+-----------+----------+-------------+----------+--------+---------
    3 | 0 3 \* \* \* | DELETE FROM public.auth_user_app_user_unmatch WHERE user_unmatch_created_at < now() - interval '2 MINUTE' | localhost | 5432 | demo_db | postgres | t |
    (1 rows)

āĻ‰āĻĻāĻžāĻšāĻ° āĻ¸āĻ°ā§‚āĻĒ SELECT cron.unschedule(3); āĻŦā§āĻ¯āĻŦāĻšāĻžāĻ° āĻ•āĻ°ā§‡ schedule āĻŸāĻŋ unschedule āĻ•āĻ°āĻž āĻ¯āĻžā§ŸāĨ¤