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

  1. Melden Sie sich bei der Datenbank ibmclouddb als Benutzer admin an.

     \c ibmclouddb
    
  2. Aktivieren Sie die Erweiterung pg_cron.

     create extension pg_cron;
    
  3. Überprüfen Sie, ob pg_cron installiert ist.

     \dx
    

    pg_cron kann nur auf ibmclouddb-Datenbanken installiert werden und kann aus Sicherheitsgründen nur von einem Admin-Benutzer verwendet werden.

  4. Führen Sie den folgenden Befehl aus, um Berechtigungen für pg_cron zu 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_details werden 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_cron jobs 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.