PostgreSQL 9.1 Hot Backup-Fehler: Das Datenbanksystem wird gestartet


16

Ich habe eine Weile an einem Hot-Backup für Postgres 9.1 gearbeitet und bin auf ein konsistentes Problem gestoßen. Nach dem Neustart von Postgres auf dem Slave-Server werden die Protokolldatei pgstartup und die tägliche Protokolldatei im Verzeichnis pg_log fehlerfrei gelesen. Wenn ich jedoch versuche, mit dem Befehl psql in die Datenbank einzutreten, wird der folgende Fehler angezeigt:

FATAL: Das Datenbanksystem wird gestartet.

Die Datei recovery.conf wechselt auch nicht zu recovery.done. Ich habe diesen Fehler eingehend untersucht und finde immer die gleiche Antwort: Die Datenbank wurde nicht ordnungsgemäß heruntergefahren, bevor ich versuchte, Postgres neu zu starten. Ich habe Postgres nur über die Befehle service postgresql-9.1 restartoder neu gestartet /etc/init.d/postgresql-9.1 restart. Nachdem ich diesen Fehler erhalten habe, bringe ich alle Prozesse zum Stillstand und versuche erneut, die Datenbank neu zu starten, und erhalte weiterhin den gleichen Fehler. Ich weiß nicht, wohin ich von hier aus gehen soll und wie ich dieses Problem beheben soll. Nachstehend ist der genaue Vorgang aufgeführt, den ich ausgeführt habe, um das Hot-Backup abzuschließen.

Master-Server-Konfigurationen:

pg_hba.conf hat folgende Zeile hinzugefügt:

Host-Replikation postgres IPAddressOfSlaveServer-Vertrauensstellung

postgresql.conf:

wal_level = hot_standby
max_wal_senders = 5
listen_address = '*'
port = 5432
max_wal_senders = 5
wal_keep_segments = 32

Slave-Serverkonfigurationen:

postgresql.conf:

hot_standby = ein

recovery.conf:

standby_mode = on
primary_conninfo = host = IPAddressOfMasterServer
port = 5432
Benutzer = Postgres
restore_command = 'cp /var/lib/pgsql/9.1/data/pg_xlog/%f "% p"'

Nach der Konfiguration beider Server

Ich wechsle zum Benutzer postgres auf dem Masterserver und führe die folgenden Befehle aus:

psql -c "Select pg_start_backup ('label', true);";
rsync -a -v -e ssh /var/lib/pgsql/9.1/data slave: /var/lib/pgsql/9.1/data \
        - postmaster.pid ausschließen
pgsql -c "select pg_stop_backup ();";

Nach dem Synchronisieren der Datenbank mit dem Slave-Server

Ich starte den Slave-Server neu und der Start schlägt nicht fehl. Die Datei pgstartup.log lautet:

Erfolg. Sie können den Datenbankserver jetzt über Folgendes starten:

    /usr/pgsql-9.1/bin/postgres -D /var/lib/pgsql/9.1/data
oder
    /usr/pgsql/9.1/bin/pg_ctl -D /var/lib/pgsql/9.1/data -l Start der Protokolldatei

Die aktuelle Tagesprotokolldatei postgresql-Thu.log lautet:

Protokoll: Herunterfahren
Protokoll: Das Datenbanksystem wird heruntergefahren
Protokoll: Das Datenbanksystem wurde bei der Wiederherstellung am 10.04.2012 heruntergefahren
Protokoll: Aufrufen des Standby-Modus
Protokoll: Wiederhergestellte Protokolldatei "logFileName" aus dem Archiv
Protokoll: Konsistenter Wiederherstellungsstatus erreicht bei 0 / BF0000B0
Protokoll: Wiederholen beginnt bei 0 / BF000020
Protokoll: Wiederhergestellte Protokolldatei "logFileName" aus dem Archiv
Protokoll: unerwartetes pageaddr 0/85000000 in Protokolldatei 0, Segment 192, Offset 0
Protokoll: unerwartetes pageaddr 0/85000000 in Protokolldatei 0, Segment 192, Offset 0
Protokoll: Die Streaming-Replikation wurde erfolgreich mit dem primären Server verbunden

Ich habe unerwartetes pageaddr recherchiert und aus den Postgres-Archiven habe ich verstanden, dass es ganz normal ist und eine der erwarteten Möglichkeiten ist, das Ende von WAL zu erkennen.

Jeder Rat wäre sehr dankbar.

Antworten:


11

Die Meldung "Das Datenbanksystem wird gestartet." zeigt keinen Fehler an. Der Grund dafür, dass es auf der Ebene FATAL liegt, ist, dass es immer in das Protokoll aufgenommen wird, unabhängig von der Einstellung von log_min_messages:

http://www.postgresql.org/docs/9.1/interactive/runtime-config-logging.html#RUNTIME-CONFIG-LOGGING-WHEN

Hast du nach dem rsync wirklich ausgeführt, was du zeigst ?:

pgsql -c "select pg_stop_backup ();";

Da es pgsqlmeines Wissens keine ausführbare Datei gibt, würde das Backup unvollständig bleiben und der Slave würde den Wiederherstellungsmodus niemals verlassen. Andererseits bist du vielleicht wirklich gelaufen psql, weil ich sonst nicht sehe, wie der Slave solche Erfolgsmeldungen protokolliert hätte wie:

Protokoll: Konsistenter Wiederherstellungsstatus erreicht bei 0 / BF0000B0

und:

Protokoll: Die Streaming-Replikation wurde erfolgreich mit dem primären Server verbunden

Haben Sie zu diesem Zeitpunkt versucht, eine Verbindung zum Slave herzustellen? Was ist passiert?

Die Meldung "Erfolg. Sie können jetzt beginnen ...", die Sie erwähnen, wird von generiert. Sie initdbsollte nicht als Teil der Einrichtung eines Slaves ausgeführt werden. Ich denke also, dass Sie wegen etwas verwirrt sein könnten. Ich mache mir auch Sorgen über diese anscheinend widersprüchlichen Aussagen:

Ich habe Postgres nur über den Dienst postgresql-9.1 restart oder /etc/init.d/postgresql-9.1 restart neu gestartet. Nachdem ich diese Fehlermeldung erhalten habe, bringe ich alle Prozesse zum Erliegen und versuche erneut, die Datenbank neu zu starten ...

Haben Sie versucht, den Dienst über das Dienstskript zu beenden? Was ist passiert? Es kann hilfreich sein, die Protokolle zu verstehen, wenn Sie Zeilen mit mehr Informationen voranstellen. Wir gebrauchen:

log_line_prefix = '[%m] %p %q<%u %d %r> '

Das recovery.confSkript sieht seltsam aus. Kopieren Sie aus dem Verzeichnis pg_xlog des Masters, dem aktiven Verzeichnis pg_xlog des Slaves oder einem Archivverzeichnis?


8

Ich hatte auch einige Probleme damit, außer ich war am 9.3, nicht am 9.1. Wie auch immer, die Lösung stellte sich als ziemlich trivial heraus:

Die postgresql.confDatei wurde vom Master zum Slave kopiert und ich ließ sie unverändert auf dem Slave. Ich dachte, alles, was Sie tun recovery.confmüssten, wäre , eine Datei hinzuzufügen , und alles würde funktionieren.

Ich habe die Sklavendatei bearbeitet postgresql.confund:

  • hat das auskommentiert archive_mode=on
  • out kommentierten archiveBefehl; und
  • auskommentiert hot_standby=on

Das hat es geschafft: Ich konnte die Datenbank als Nur-Lese-Server einrichten, der bereit ist, Nur-Lese-Abfragen anzunehmen.

Es gibt ein Skript namens pg_basebackup, das das Bootstrap-Verzeichnis für den Slave erstellt. Dies ist das Datenverzeichnis mit der Datenbank darin. Sie müssen die postgresql.confDatei ändern , bevor sie wie beschrieben als Slave verwendet werden kann, was für ein pg_basebackupPostskript ziemlich einfach ist .


1
Wenn Sie "commented out hot_standby = on" schreiben, haben Sie vermutlich "das # -Kommentar-Zeichen zuvor entfernt, um" hot_standby "tatsächlich zu aktivieren Standby, bereit für Failover, aber keine Abfrage). Beachten Sie, dass Sie die Slave-Datenbank erneut sichern und neu initialisieren müssen, damit hot_standby betriebsbereit ist, wenn Sie den Sicherungsspeicherauszug für die Basis ohne wal_level = hot_standby auf dem Master erstellt und dann hot_stanby auf dem Slave aktiviert haben. Andernfalls erhalten Sie einige schwerwiegende Fehler.
Frederik Struck-Schøning

hot_standby = on ist erforderlich, es muss da sein
Abhilash Mishra

7

Interessanterweise habe ich das Gegenteil von Paul gelöst.

Ich fügte hinzu:

hot_standby = on

oder vielmehr #hot_standby = offin das oben Gesagte geändert . (Dies wurde mit 9,5)


1

Ich habe dies in Protokollen:

MSK FATAL:  the database system is starting up

So beheben Sie den unbegrenzten Start des Servers: Beenden Sie den Dienst (falls vorhanden) und beenden Sie den Prozess 'postgres' (normalerweise ist er vorhanden). Führen Sie dies in der Konsole aus:

pg_resetxlog.exe -D ../Data -f

Diese Meldung erscheint, weil das xLog-Verzeichnis Daten enthält, die vor dem Herunterfahren des Dienstes nicht geschrieben wurden. Und dann versucht er beim Starten des Dienstes, diese Daten zu reparieren. Manchmal friert es den Start ein und endet nie. Kommando beim Aufräumen dieser nicht fixierten Daten, die den Dienst nur zum Starten mit festen Daten anwenden. Möglicherweise gehen einige Teile der nicht festgelegten Daten verloren, aber der Datenbankserver wird normal ausgeführt und kann von Apps aufgerufen werden.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.