pg_cron
Job scheduler for PostgreSQL
Overview
| Package | Version | Category | License | Language |
|---|---|---|---|---|
pg_cron | 1.6.7 | TIME | PostgreSQL | C |
| ID | Extension | Bin | Lib | Load | Create | Trust | Reloc | Schema |
|---|---|---|---|---|---|---|---|---|
| 1070 | pg_cron | No | Yes | Yes | Yes | No | No | pg_catalog |
| Related | timescaledb_toolkit timescaledb periods temporal_tables pg_task pg_later emaj table_version |
|---|---|
| Depended By | documentdb pg_incremental timeseries vectorize pgmb |
require cron.database_name
Version
| Type | Repo | Version | PG Ver | Package | Deps |
|---|---|---|---|---|---|
| EXT | PGDG | 1.6.7 | 1817161514 | pg_cron | - |
| RPM | PGDG | 1.6.7 | 1817161514 | pg_cron_$v | - |
| DEB | PGDG | 1.6.7 | 1817161514 | postgresql-$v-cron | - |
Install
You can install pg_cron directly. First, make sure the PGDG repository is added and enabled:
pig repo add pgdg -u # Add PGDG repo and update cache
Install the extension using pig or apt/yum/dnf:
pig install pg_cron; # Install for current active PG version
pig ext install -y pg_cron -v 18 # PG 18
pig ext install -y pg_cron -v 17 # PG 17
pig ext install -y pg_cron -v 16 # PG 16
pig ext install -y pg_cron -v 15 # PG 15
pig ext install -y pg_cron -v 14 # PG 14
dnf install -y pg_cron_18 # PG 18
dnf install -y pg_cron_17 # PG 17
dnf install -y pg_cron_16 # PG 16
dnf install -y pg_cron_15 # PG 15
dnf install -y pg_cron_14 # PG 14
apt install -y postgresql-18-cron # PG 18
apt install -y postgresql-17-cron # PG 17
apt install -y postgresql-16-cron # PG 16
apt install -y postgresql-15-cron # PG 15
apt install -y postgresql-14-cron # PG 14
Preload:
shared_preload_libraries = 'pg_cron';
Create Extension:
CREATE EXTENSION pg_cron;
Usage
beware that cron.database has to be set before adding to shared_preload_libraries
-- Delete old data on Saturday at 3:30am (GMT)
SELECT cron.schedule('30 3 * * 6', $$DELETE FROM events WHERE event_time < now() - interval '1 week'$$);
schedule
----------
42
-- Vacuum every day at 10:00am (GMT)
SELECT cron.schedule('nightly-vacuum', '0 10 * * *', 'VACUUM');
schedule
----------
43
-- Change to vacuum at 3:00am (GMT)
SELECT cron.schedule('nightly-vacuum', '0 3 * * *', 'VACUUM');
schedule
----------
43
-- Stop scheduling jobs
SELECT cron.unschedule('nightly-vacuum' );
unschedule
------------
t
SELECT cron.unschedule(42);
unschedule
------------
t
-- Vacuum every Sunday at 4:00am (GMT) in a database other than the one pg_cron is installed in
SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'some_other_database');
schedule
----------
44
-- Call a stored procedure every 5 seconds
SELECT cron.schedule('process-updates', '5 seconds', 'CALL process_updates()');
-- Process payroll at 12:00 of the last day of each month
SELECT cron.schedule('process-payroll', '0 12 $ * *', 'CALL process_payroll()');
Crontab format:
┌───────────── min (0 - 59)
│ ┌────────────── hour (0 - 23)
│ │ ┌─────────────── day of month (1 - 31) or last day of the month ($)
│ │ │ ┌──────────────── month (1 - 12)
│ │ │ │ ┌───────────────── day of week (0 - 6) (0 to 6 are Sunday to
│ │ │ │ │ Saturday, or use names; 7 is also Sunday)
│ │ │ │ │
│ │ │ │ │
* * * * *
Feedback
Was this page helpful?
Thanks for the feedback! Please let us know how we can improve.
Sorry to hear that. Please let us know how we can improve.