pg_cron: Cron-Jobs direkt in der Datenbank

Screenshot

Ein Cron-Job ist bekanntlich ein zeitgesteuerter Hintergrundprozess in Unix- und Linux-Betriebssystemen, welcher dazu dient, wiederkehrende Aufgaben automatisiert auszuführen. Die Admins kennen das und nutzen diese Cron-Jobs für viele sich wiederholende Aufgaben. Aber wusstet Ihr auch, dass man mit PostgreSQL Extension pg_cron [1] auch direkt in der Datenbank solche automatischen Aufgaben ablaufen lassen kann?

Die Installation ist denkbar einfach, ein einfacher Befehl reicht aus:

CREATE EXTENSION pg_cron; oder
CREATE EXTENSION IF NOT EXISTS pg_cron;

Die Syntax für die zeitliche Steuerung der Aufgaben lehnt sich an die aus den Cron-Jobs auf Betriebssystem-Basis bekannte an:

* * * * *
│ │ │ │ │
│ │ │ │ └── Wochentag (0–7, So = 0/7)
│ │ │ └──── Monat (1–12)
│ │ └────── Tag des Monats (1–31)
│ └──────── Stunde (0–23)
└────────── Minute (0–59)

Ein tägliches Datenbank-Vacuum nachts um 3 Uhr würde z. B. so aussehen:

SELECT cron.schedule(
    'nightly-maintenance',
    '0 3 * * *',
    $$VACUUM ANALYZE my_schema.my_table$$
);

Die wesentlichen Vorteile von pg_cron:

  • zeitgesteuerte Aufgabe werden dort definiert wird, wo die eigentliche Aufgabe stattfindet, nämlich in der Datenbank und damit eine saubere Trennung von automatisierten OS-Jobs und Datenbank-Jobs.
  • keine Berücksichtigung von OS-Benutzer/Passwort, Umgebungsvariablen, Dateirechten und Pfaden nötig, der pg_cron-Job arbeitet mit den Rechen des Benutzers, der ihn eingerichtet hat

Wer an einem detaillierteren Vergleich von Cron-Jobs auf Betriebssystem-Ebene mit denen direkt in der Datenbank wünscht, kann sich gern mal meinen Chat auf ChatGPT [3] anschauen.

Hier der Original-Tweet [4]:

[1] … https://access.crunchydata.com/documentation/pg_cron/latest/
[2] … https://neon.com/docs/extensions/pg_cron
[3] … https://chatgpt.com/s/t_6ab1f3fd59fc819182bdc6529f045507
[4] … https://x.com/crunchydata/status/2072006839533756610

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert