postgresql error PANIC: Es konnte kein gültiger Prüfpunktdatensatz gefunden werden

75

Wenn ich den Postgres-Server (v9.0.1) lade, bekomme ich eine Panik, die den Start verhindert:

PANIC: Es konnte kein gültiger Prüfpunktdatensatz gefunden werden

Wie kann ich das beheben?

nathan_scott
quelle
Bitte posten Sie die Lösung nicht in der Frage selbst. Die Beantwortung Ihrer eigenen Fragen wird nicht entmutigt, aber Sie sollten Lösungen als Antworten veröffentlichen. Ich habe die Lösung dieses Mal außer Frage gestellt. Fühlen Sie sich frei, es als Antwort nach Belieben zu posten.
Adam Lear
1
Ich bin eigentlich neugierig, was die Antwort war, bevor Anna sie herausgeschnitten hat :-)
Filiprem
Wenn sich dies auf einem Slave- / Leseserver befindet und Sie nach dem Kopieren über die Basissicherung gestartet haben, stellen Sie sicher, dass Sie die beim Erstellen der Basissicherung erstellte Etikettendatei im lokalen Datenordner haben.
Daniel Gee

Antworten:

122

Es wird nach einem Prüfpunktdatensatz im Transaktionsprotokoll gesucht, der wahrscheinlich nicht vorhanden oder beschädigt ist. Sie können feststellen, ob dies der Fall ist, indem Sie Folgendes ausführen:

# Postgres >= 10
pg_resetwal DATADIR

# Postgres < 10
pg_resetxlog DATADIR

Wenn das Transaktionsprotokoll beschädigt ist, wird folgende Meldung angezeigt:

Der Datenbankserver wurde nicht sauber heruntergefahren. Das Zurücksetzen des Transaktionsprotokolls kann zum Verlust von Daten führen. Wenn Sie trotzdem fortfahren möchten -f, erzwingen Sie das Zurücksetzen.

Sie können dann den Anweisungen folgen und mit ausführen -f, um das Update zu erzwingen:

# Postgres >= 10
pg_resetwal -f DATADIR

# Postgres < 10
pg_resetxlog -f DATADIR 

Das sollte das Transaktionsprotokoll zurücksetzen, es könnte jedoch dazu führen, dass Ihre Datenbank in einem unbestimmten Zustand bleibt, wie in der PostgreSQL-Dokumentation zu folgenden Themenpg_resetwal erläutert :

Wenn Sie sich pg_resetwalbeschweren, dass keine gültigen Daten für ermittelt werden können pg_control, können Sie die Ausführung erzwingen, indem Sie die -fOption (force) angeben. In diesem Fall werden die fehlenden Daten durch plausible Werte ersetzt. Es ist zu erwarten, dass die meisten Felder übereinstimmen. Für die nächste OID, die nächste Transaktions-ID und -Epoche, die nächste Multitransaktions-ID und den nächsten Offset sowie die Felder für den WAL-Startort ist möglicherweise manuelle Unterstützung erforderlich. Diese Felder können mit den unten beschriebenen Optionen festgelegt werden. Wenn Sie nicht für alle diese Felder die richtigen Werte ermitteln können,-fkann weiterhin verwendet werden, aber die wiederhergestellte Datenbank muss mit noch mehr Misstrauen als gewöhnlich behandelt werden: Ein sofortiger Speicherauszug und ein erneutes Laden sind unerlässlich. Führen Sie vor dem Dump keine datenmodifizierenden Vorgänge in der Datenbank aus, da eine solche Aktion die Beschädigung wahrscheinlich verschlimmern wird.

Erwin Brandstetter
quelle
Zurücksetzen über pg_resetwal /usr/local/var/postgres/dann laufende Postgres wie postgres -D /usr/local/var/postgresbei mir funktioniert.
heisenBug
22

Ich verwende 9.1.7 und finde, dass Folgendes erfolgreich ausgeführt wurde:

/usr/lib/postgresql/9.1/bin/pg_resetxlog -f /var/lib/postgresql/9.1/main

Ihr letztes Argument für den pg_resetxlogBefehl sollte der Speicherort auf der Festplatte sein, an dem postgres Ihre Datenbankdaten speichert.

Limlam
quelle
9

Wie hier angegeben, sollte pg_resetxlog nicht ausgeführt werden. Die Antworten, die sich darauf beziehen, sind schlechte Ratschläge. Unter der Annahme, dass der Fehler in einem Kontext der Kopier- / Replikationsinstanz aufgetreten ist, bietet der Link eine prägnantere Möglichkeit zum Kopieren / Replizieren mitpg_basebackup

Hieronymus
quelle
3

Führen Sie eine kontinuierliche Archivierung durch? Wenn Sie zu diesem Zeitpunkt ein Backup erstellen, ist es möglicherweise vorsichtiger, backup_label zu entfernen. pg_resetxlogist eine schwere Sache.

fdr
quelle
1

Genau wie das Protokoll mit der Aufschrift: Es konnte kein gültiger Prüfpunktdatensatz gefunden werden. Postgres kann im Verzeichnis $ PGDATA / pg_xlog / keine ordnungsgemäße WAL finden. Versuchen Sie, pg_resetxlog zu verwenden

sgzhan
quelle