Immer wieder kommt es bei PostgreSQL zu der Frage, wie lange denn eine Recovery dauert. Sei es beim Hochfahren einer Instanz nach einem System-Crash oder nach der Wiederherstellung des Clusters aus einer Sicherung.
Wird beim Start diese Meldung ausgeben?
pg_ctl: server did not start in time
Wird bei der Anmeldung mit psql diese Meldung ausgegeben?
FATAL: the database system is starting up
In diesem Fall ist Ihre Datenbankinstanz vermutlich gerade im Recovery-Modus. Normalerweise dauert so ein Vorgang nur wenige Sekunden. Allerdings gibt es Ausnahmesituationen, in denen dies länger dauern kann. Eine Abfrage des aktuellen Zustandes über Systemkatalog-Tabellen ist in diesem Zustand leider nicht möglich. Auch die postgresql.log gibt in diesem Zusammenhang ungünstigerweise keinen Aufschluss über den Fortschritt.
Um während der Recovery trotzdem auf dem Laufenden zu bleiben, kann man sich mit dem Kommando pg_controldata
einen Überblick über den momentanen Zustand des Clusters verschaffen. Dies ist eines der wenigen Kommandos, das auch funktioniert, wenn der Cluster (noch) nicht online ist.
Ausgabe (Auszug):
Das zeigt uns zumindest an, dass der Cluster wiederhergestellt wird ("in crash recovery") und in welcher WAL-Datei der letzte Checkpoint stattgefunden hat ("Latest checkpoint's REDO WAL file"). An dieser Stelle erwartet man möglicherweise instinktiv eine Art Fortschrittsanzeige. Aber bis zum Abschuss des Recoverys wird sich an dieser Anzeige leider nichts ändern.
Als Nächstes werfen wir einen Blick in das Verzeichnis $PGDATA/pg_wal. Dort befinden sich alle wiederherzustellenden WALs, in der folgenden Ansicht nach Zeitpunkt absteigend sortiert:
Wir können Linux das Zählen überlassen:
[pg_wal]$ ls -ltr 0* | wc -l
Ergebnis: 904 WAL-Segmente müssen für die Recovery durchlaufen werden.
Das momentan in Recovery befindliche WAL-Segment finden wir mit einer der folgenden Methoden heraus.
Wenn PostgreSQL als Service gestartet wurde:
Ansonsten kommt die letzte Zeile auch etwas weniger schön heraus, wenn wir eingeben:
Nur den Dateinamen des aktuell verarbeiteten WAL-Segments bekommen wir so:
[pg_wal]$ pgrep -a postgres | grep startup | awk '{print $NF}
All diese Erkenntnisse können wir nun nutzen, um ein kleines Shell-Programm zu verfassen:
Wenn man das Skript alle paar Sekunden laufen lässt, erhält man eine Fortschrittsanzeige:
Das Fazit
Eine Überwachung des Recovery-Prozesses ist möglich. Typisch für PostgreSQL ist dabei, dass wir sehr nahe am Betriebssystem arbeiten müssen.
Sie haben Fragen rund um den Betrieb von PostgreSQL? Sprechen Sie mit uns.
Seminarempfehlung
POSTGRESQL ADMINISTRATION DB-PG-01
Mehr erfahren