Einplanung von Wartungsaufträgen mit pg_cron
pg_cron ist eine Erweiterung von PostgreSQL, die eine datenbankinterne Auftragsplanung ermöglicht, so dass Sie SQL-Aufgaben automatisieren können, ohne auf externe Tools angewiesen zu sein. Weitere Informationen finden Sie unter
pg_cron.
Die Erweiterung pg_cron wird von PostgreSQL Version 13 und höher unterstützt.
pg_cron einrichten
-
Melden Sie sich bei der Datenbank ibmclouddb als Benutzer admin an.
\c ibmclouddb -
Aktivieren Sie die Erweiterung
pg_cron.create extension pg_cron; -
Überprüfen Sie, ob
pg_croninstalliert ist.\dxpg_cronkann nur auf ibmclouddb-Datenbanken installiert werden und kann aus Sicherheitsgründen nur von einem Admin-Benutzer verwendet werden. -
Führen Sie den folgenden Befehl aus, um Berechtigungen für
pg_cronzu erteilen.select public.grant_pgcron_privileges();
Jobs planen
Verwenden Sie cron.schedule_in_database(), um Ihre Aufträge zu planen.
SELECT cron.schedule_in_database(
job_name text,
schedule text, -- cron expression
command text, -- SQL command to run
database_name text -- target database
);
- So zeigen Sie geplante Aufträge an:
select * from cron.job;
- So zeigen Sie den Status von Zeitplanaufträgen an:
select * from cron.job_run_details;
- So heben Sie die Terminierung von Aufträgen auf:
ibmclouddb=> SELECT cron.unschedule(jobid);
unschedule
------------
t
(1 row)
Beispiel für die Verwendung pg_cron
- Melden Sie sich bei der Datenbank ibmclouddb an:
\c ibmclouddb
- Aktivieren Sie die Erweiterung
pg_cron:
ibmclouddb=> \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(1 row)
ibmclouddb=> create extension pg_cron;
CREATE EXTENSION
ibmclouddb=>
ibmclouddb=> \dx
List of installed extensions
Name | Version | Schema | Description
---------+---------+------------+------------------------------
pg_cron | 1.6 | pg_catalog | Job scheduler for PostgreSQL
plpgsql | 1.0 | pg_catalog | PL/pgSQL procedural language
(2 rows)
- Erteilen Sie Privilegien für
pg_cron:
ibmclouddb=> select public.grant_pgcron_privileges();
grant_pgcron_privileges
--------------------------------
Granted permission on pg_cron
(1 row)
- Einplanen eines VACUUM-Jobs, der jeden Sonntag um 4:00 Uhr morgens ausgeführt wird.
SELECT cron.schedule_in_database(
job_name text,
schedule text, -- cron expression
command text, -- SQL command to run
database_name text -- target database
);
ibmclouddb=> SELECT cron.schedule_in_database('weekly-vacuum', '0 4 * * 0', 'VACUUM', 'test');
schedule_in_database
----------------------
35
(1 row)
- So zeigen Sie geplante Aufträge an:
ibmclouddb=> select * from cron.job;
jobid | schedule | command | nodename | nodeport | database | username | active | jobname
-------+-----------+---------+-----------+----------+----------+----------+--------+---------------
35 | 0 4 * * 0 | VACUUM | localhost | 5432 | test | admin | t | weekly-vacuum
(1 row)
- So zeigen Sie Details zur Auftragsausführung an:
ibmclouddb=> select * from cron.job_run_details;
jobid | runid | job_pid | database | username | command | status | return_message | start_time | end_time
-------+-------+---------+----------+----------+---------+-----------+----------------+-------------------------------+-------------------------------
35 | 85 | 33810 | test | admin | VACUUM | succeeded | VACUUM | 2025-09-23 15:48:00.013814+00 | 2025-09-23 15:48:01.29763+00
- So heben Sie die Terminierung von Aufträgen auf:
ibmclouddb=> SELECT cron.unschedule(35);
unschedule
------------
t
(1 row)
- Die Einträge in
cron.job_run_detailswerden nicht automatisch bereinigt, sondern jeder Benutzer, der Cron-Jobs planen kann, hat auch die Berechtigung, seine eigenen cron.job_run_details Einträge zu löschen.
ibmclouddb=> SELECT cron.schedule('delete-job-run-details', '0 12 * * *', $$DELETE FROM cron.job_run_details WHERE end_time < now() - interval '7 days'$$);
-
pg_cronjobs werden beendet, wenn die Datenbank aufgrund von Aktivitäten wie Skalierung, Failover oder Switchover neu gestartet wird. Da es keinen Wiederholungsmechanismus gibt, wird der Auftrag nicht automatisch fortgesetzt. Sie müssen entweder auf den nächsten geplanten Lauf warten oder den Zeitplan nach Bedarf anpassen. -
Bis zu 5 pg_cron-Jobs laufen gleichzeitig; weitere Jobs warten in einer Warteschlange.