Zurück zum Blog
    Server MonitoringMay 1, 20269 min read

    Was ist PostgreSQL-Monitoring? Die Metriken, die Ausfälle verhindern

    Teilen
    Was ist PostgreSQL-Monitoring? Die Metriken, die Ausfälle verhindern

    PostgreSQL hat sich durchgesetzt. Vor sechs Jahren konnte man noch ernsthafte Unternehmen finden, die MySQL, MS SQL oder Oracle als primäre OLTP-Datenbank betrieben. 2026 ist die Standardantwort für nahezu jedes neue System – managed, selbst gehostet oder in einen Serverless-Stack eingebettet – Postgres.

    Diese Allgegenwart hat ein Problem geschaffen, das die meisten Teams noch nicht verinnerlicht haben: Sie überwachen Postgres immer noch wie jede andere Datenbank. Connection-Counts. CPU. Festplatte. Dasselbe Dashboard wie 2019, nur mit anderem Logo.

    Dann bricht etwas um 3 Uhr morgens. Autovacuum bleibt auf einer stark beanspruchten Tabelle stehen. Eine lang laufende Transaktion blockiert zwanzig Minuten lang jeden Schreibvorgang. Das Transaction-ID-Alter klettert über 1,8 Milliarden, und Postgres lehnt neue Schreibvorgänge ab, bis ein Notfall-Vacuum durchgelaufen ist. Nichts davon erscheint in einem generischen Datenbank-Dashboard. Alles davon ist sichtbar – wenn Sie wissen, welche Postgres-spezifischen Metriken Sie beobachten müssen.

    Genau das bedeutet PostgreSQL-Monitoring im Jahr 2026.

    Was PostgreSQL-Monitoring ist – und was die meisten Teams falsch machen

    PostgreSQL-Monitoring ist die Praxis, den Laufzeitzustand einer Postgres-Instanz zu beobachten: die ausgeführten Queries, die verbrauchten Ressourcen, die Replikationstopologie, in die sie eingebettet ist, und die internen Wartungsprozesse – Autovacuum, WAL-Flushing, Statistik-Erfassung – die sie stabil halten.

    Richtig gemacht, fängt es Probleme Stunden oder Tage ab, bevor Nutzer etwas merken. Als Nachgedanke betrieben – an ein generisches Infrastruktur-Dashboard angeflanscht – fängt es kaum etwas Postgres-spezifisches ab, bis die Produktion bereits brennt.

    Der Fehler, den die meisten Teams machen, ist, Postgres als Black Box zu behandeln: CPU, Speicher, Festplatte und Uptime überwachen – und davon ausgehen, dass alles Interne in einer dieser vier Größen sichtbar wird. Das wird es nicht. Postgres ist ein System mit eigenständigen Eigenheiten, die in MySQL oder generischen „Datenbank-Health"-Dashboards keine Entsprechung haben: MVCC, Autovacuum, das WAL, die Lebensdauer von Transaktions-IDs und die Art, wie sich Locks über abhängige Transaktionen fortpflanzen.

    Wenn Ihr Monitoring diese Sprache nicht spricht, werden Sie sich wundern – und die Überraschungen kommen fast immer um 3 Uhr morgens.

    Die fünf Postgres-spezifischen Failure Modes, auf die sich ein Alarm lohnt

    Diese Fälle reißen die Produktion runter. Generisches Infrastruktur-Monitoring sieht keinen davon.

    1. Autovacuum und Tabellen-Bloat

    Postgres nutzt MVCC: Wenn Sie ein UPDATE oder DELETE auf einer Zeile ausführen, bleibt die alte Version auf der Festplatte, bis Autovacuum sie aufräumt. Das ist so gewollt – so liefert Postgres Snapshot-Isolation, ohne Leser zu blockieren.

    Der Haken: Wenn Autovacuum mit der Änderungsrate nicht mithält, sammeln sich Dead Tuples an. Tabellen und Indizes wachsen unkontrolliert. Die Statistiken des Planers veralten. Sequential Scans werden langsamer, weil mehr Pages für dieselbe Anzahl an Live-Zeilen gelesen werden müssen. Die I/O steigt. p99-Latenzen kriechen nach oben – langsam genug, dass kein Alarm anschlägt, schnell genug, um ein Quartal zu ruinieren.

    Was Sie überwachen sollten:

    • pg_stat_user_tables.n_dead_tup und das Verhältnis zu n_live_tup, pro Tabelle
    • last_autovacuum- und last_autoanalyze-Zeitstempel
    • Aktive Autovacuum-Worker im Verhältnis zu autovacuum_max_workers
    • Index-Bloat – über pgstattuple oder Community-Queries

    Das typische Symptom sind „Queries, die über Monate hinweg ohne Code-Änderung langsamer geworden sind". Wenn Ihr Dashboard die Frage „Welche Tabellen wurden in der letzten Woche nicht autovacuumed?" nicht beantworten kann, können Sie das Problem nicht erkennen.

    Tunen Sie autovacuum_vacuum_scale_factor pro Tabelle für Tabellen mit hoher Änderungsrate – der Standardwert von 0.2 (20 % Dead Tuples) ist für Tabellen mit Hunderten Millionen Zeilen zu lasch.

    2. WAL und Replication Lag

    Streaming-Replikation überträgt Write-Ahead-Log-Records vom Primary zu den Replicas. Zwei Dinge gehen schief, wenn Sie das nicht beobachten: Read Replicas liefern veraltete Daten, und Ihr RPO bei einem Failover beträgt genau so viel Lag, wie zum Zeitpunkt des Primary-Ausfalls bestand.

    Was Sie überwachen sollten:

    • pg_stat_replication.write_lag, flush_lag, replay_lag pro Replica
    • LSN-Diff zwischen Primary und jeder Replica: pg_wal_lsn_diff(pg_current_wal_lsn(), replay_lsn)
    • WAL-Erzeugungsrate (Bytes pro Sekunde) auf dem Primary
    • Fehlerzähler von archive_command, falls Sie WAL-Archiving für PITR nutzen

    Ein häufiger stiller Ausfall: archive_command fängt an zu scheitern – S3-Credentials wurden rotiert, das Archive-Ziel hat keinen Plattenplatz mehr –, niemand bemerkt es, das WAL stapelt sich auf dem Primary, und Ihr Point-in-Time-Recovery-Fenster ist defekt, obwohl die Replikation noch gesund aussieht.

    Replication Lag sollte in Sekunden alarmieren, nicht in Minuten. Sobald Sie minutenlangen Lag sehen, liefert die Anwendung bereits veraltete Reads, oder Ihr Failover-RPO ist bereits kompromittiert. Der „Wir merken es schon, wenn es wichtig wird"-Ansatz beim Lag ist genau die Art, wie Sie erfahren, dass es gestern wichtig gewesen wäre.

    3. Transaction-ID-Wraparound

    Jede Transaktion in Postgres erhält eine 32-Bit-Transaktions-ID. Das ergibt rund vier Milliarden, bevor der Zähler überläuft. Um Korruption zu verhindern, vacuumed Postgres alte Daten aggressiv, um XIDs mit zunehmendem Alter zu „freezen". Wenn Freeze-Vacuum nicht hinterherkommt und die älteste XID sich dem Wraparound-Horizont nähert, geht Postgres in den Notfall-Vacuum-Modus – und am Limit lehnt es neue Schreib-Transaktionen vollständig ab, bis Vacuum aufgeholt hat.

    Das ist der Failure Mode, der eine Site stundenlang lahmlegt. Und er ist vollständig vermeidbar.

    Was Sie überwachen sollten:

    • age(datfrozenxid) für jede Datenbank
    • age(relfrozenxid) speziell für schreiblastige Tabellen
    • Warning bei 1 Milliarde, Critical bei 1,5 Milliarden – reichlich Vorlauf zum Handeln, aber nur, wenn Sie hinschauen

    Die Teams, die der Wraparound erwischt, sind meist nicht die mit den höchsten Schreibraten. Es sind die mit ein oder zwei schreiblastigen Tabellen, die Autovacuum immer wieder überspringt – oft, weil eine lang laufende Transaktion das Freeze blockiert. Das Dashboard sieht in Ordnung aus. Dann nimmt die Datenbank keine Schreibvorgänge mehr an.

    Wenn Sie 2026 nur einen Postgres-spezifischen Alarm einrichten, dann diesen.

    4. Lock-Chains und blockierte Queries

    Eine einzelne lang laufende Transaktion, die einen Row- oder Tabellen-Lock hält, kann jede abhängige Query blockieren. Die Anwendung sieht Timeouts. Das Dashboard sieht „alles ist langsam" bei normaler CPU und normalem Speicher. Standard-Infrastruktur-Monitoring ist hier nutzlos.

    Was Sie überwachen sollten:

    • pg_stat_activity gefiltert auf state = 'idle in transaction' mit Dauer über fünf Minuten
    • Blockierte Queries via pg_blocking_pids() zusammen mit pg_stat_activity
    • Anzahl von wait_event_type = 'Lock' über die Zeit
    • Deadlock-Anzahl aus pg_stat_database.deadlocks

    Idle-in-Transaction-Sessions sind der übliche Verursacher. Sie kommen fast immer von Anwendungsfehlern: Eine Connection eröffnet eine Transaktion und wartet dann auf etwas Externes – einen HTTP-Call, eine Queue, einen Menschen in einem UI – ohne zu committen oder zurückzurollen. Solange sie idle ist, werden ihre Locks nicht freigegeben.

    Alarmieren Sie auf jede Idle-in-Transaction-Session, die länger als fünf Minuten dauert. Ihre Anwendung hat keinen legitimen Grund, eine Transaktion so lange offen zu halten – die Alternative ist, davon zu erfahren, wenn die Produktion ins Stocken gerät.

    5. Buffer-Cache-Hit-Ratio – mit Vorbehalten

    In vielen älteren Postgres-Ratschlägen heißt es: „Strebe eine Buffer-Cache-Hit-Ratio von 99 % an". 2026 ist diese Faustregel irreführend.

    Die Buffer-Cache-Hit-Ratio – blks_hit / (blks_hit + blks_read) aus pg_stat_database – sagt Ihnen, welcher Anteil der Block-Reads aus shared_buffers bedient wurde, statt in den OS-Page-Cache oder auf die Festplatte zu gehen. Mit NVMe-Storage und Maschinen mit Hunderten Gigabyte RAM sind „Disk"-Reads ohnehin häufig OS-Page-Cache-Hits – schnell genug, dass eine Buffer-Cache-Hit-Ratio von 95 % völlig in Ordnung ist und ein 99-%-Ziel nur eine Ausrede dafür, shared_buffers zu groß zu dimensionieren.

    Was Sie überwachen sollten:

    • Buffer-Cache-Hit-Ratio als Trend über die Zeit, nicht als statisches SLA
    • Plötzliche Einbrüche, die meist auf eine Working-Set-Änderung oder eine Query-Plan-Regression hinweisen
    • Kombiniert mit Checkpoint-Frequenz und bgwriter-Statistiken, um zu erkennen, ob Sie unterdimensioniert sind

    Nutzen Sie sie, um Veränderungen zu erkennen. Setzen Sie sie nicht als absoluten Zielwert.

    Die langweiligen Metriken zählen weiterhin

    Die Postgres-spezifischen Failure Modes kommen zu den klassischen Infrastruktur-Metriken hinzu, nicht an deren Stelle. Sie brauchen weiterhin:

    • Connection-Count – gesamt, idle, aktiv und das Verhältnis zu max_connections. Erschöpfung des Connection-Pools ist einer der häufigsten Produktions-Vorfälle.
    • Slow Queries – über pg_stat_statements. Tracken Sie mean_exec_time, total_exec_time und Call-Counts für die Top-N-Queries.
    • Host-Metriken – CPU, Speicher, Disk-I/O, Festplattenplatz und speziell freier Platz auf dem WAL-Volume.
    • Deadlocks pro Minute – eine ungleich-null Rate, die im Zeitverlauf wächst, ist ein Code-Problem, das behoben werden sollte, bevor es kaskadiert.

    Lassen Sie diese aus, fangen Sie die exotischen Ausfälle ab, übersehen aber die offensichtlichen.

    Tools, denen Sie in der Praxis begegnen

    Tool Am besten für Trade-off
    pg_stat_statements Grundlage für Query-Level-Metriken Eingebaut. Aktivieren Sie es ab Tag eins.
    pgBadger Periodische Tiefenanalysen von Postgres-Logs Kostenlos, aber Offline-Reports – kein Live-Monitoring.
    pganalyze Tiefes, Postgres-spezifisches SaaS Best-in-Class für Postgres; teurer pro Instanz.
    Datadog DBM Postgres neben dem Rest Ihres Datadog-Stacks Weniger Postgres-tief als pganalyze; bei Skalierung teuer.
    Prometheus + postgres_exporter Teams, die bereits Prometheus betreiben Open Source. Erfordert Aufbau und Dashboard-Arbeit.
    Xitoring Postgres neben Servern, Uptime, SSL und Synthetics All-in-One-Plattform; ideal, wenn Postgres ein Teil eines breiteren Bildes ist.

    Die richtige Wahl hängt weniger an der Feature-Liste als an dem, was Sie sonst noch überwachen. Wenn Postgres das einzige System ist, das Sie wirklich interessiert, und Sie eine oder zwei Produktionsdatenbanken haben, ist pganalyze schwer zu schlagen. Wenn Sie vierzig Server, zehn Datenbanken, öffentliche Endpunkte und Zertifikatsablauf überwachen, ist eine integrierte Plattform, die den Rest bereits abdeckt, meist besser als ein zusätzliches Postgres-Spezialtool obendrauf.

    So richten Sie Postgres-Monitoring ein, ohne es zu überfrachten

    Eine pragmatische Baseline für 2026:

    • pg_stat_statements auf jeder Postgres-Instanz aktivieren. Kostenlos, geringer Overhead, Grundlage fast jeder weiteren Prüfung.
    • Auf Transaction-ID-Alter alarmieren. Warning bei 1 Milliarde, Critical bei 1,5 Milliarden. Dieser eine Alarm verhindert den schlimmsten Postgres-Ausfall.
    • Autovacuum-Aktivität pro Tabelle tracken, nicht nur „läuft er global". Tunen Sie Scale Factors für Tabellen mit hoher Änderungsrate.
    • Auf Replication Lag in Sekunden alarmieren, nicht in Minuten. Tracken Sie alle drei Lag-Spalten – write, flush, replay – sie scheitern unterschiedlich.
    • Auf Idle-in-Transaction-Sessions über fünf Minuten alarmieren. Fast immer ein Anwendungsfehler, der behoben werden sollte.
    • Nicht auf absolute Buffer-Cache-Hit-Ratio alarmieren. Alarmieren Sie auf plötzliche Einbrüche.
    • Erfolg von archive_command überwachen, falls Sie WAL-Archiving für Backups nutzen. Stilles Versagen hier zerstört PITR.
    • p99-Query-Latenz aus pg_stat_statements tracken, nicht den Durchschnitt. Durchschnitte verbergen die Queries, die Nutzer wirklich treffen.

    Das ist eine vertretbare Baseline. Sie können immer mehr hinzufügen – Sie sollten nie weniger haben.

    Postgres hat gewonnen. Überwachen Sie es entsprechend.

    Die Failure Modes, die Postgres niederreißen – Autovacuum-Hunger, Transaction-ID-Wraparound, Lock-Chains, Archive-Fehler – sind vorhersehbar, beobachtbar und vollständig sichtbar, wenn Ihr Monitoring Postgres spricht. Für ein generisches Datenbank-Dashboard sind sie unsichtbar.

    Wählen Sie einen Stack, der die Postgres-spezifischen Signale sichtbar macht, alarmieren Sie auf die obigen Metriken – und Sie verbringen deutlich weniger Sonntagnachmittage damit, herauszufinden, warum die Produktion keine Schreibvorgänge mehr annimmt.

    Wenn Sie Ihre Postgres-Instanzen lieber gemeinsam mit Ihren Servern, öffentlichen Endpunkten und SSL-Zertifikaten an einem Ort überwachen wollen – statt vier Tools zusammenzustückeln – ist Xitoring genau dafür gebaut. Kostenlos starten und Ihren ersten Alarm in wenigen Minuten sehen.

    Tired of alert fatigue?

    Smart alerting with root cause analysis and 20+ notification channels. Alerts that actually matter.

    See How It Works