Ich teste ein Upgrade von PostgreSQL 8.2.1 auf 9.2 auf einer virtuellen Maschine, auf der eine benutzerdefinierte Linux-Distribution ausgeführt wird. Das Upgrade-Verfahren ist wie folgt:
- Starten Sie den
pg
Dienst - Saugen Sie alle DBs ab (nicht sicher, ob dies erforderlich ist)
- Backup mit
pg_dumpall
- Beenden Sie den
pg
Dienst - Verschieben Sie das Verzeichnis, in dem die Daten gespeichert sind (
/var/pg
es handelt sich um eine einfache Einrichtung mit nur einem Server). - Installieren Sie PostgreSQL 9.2
initdb
- Starten Sie den Server
- Stellen Sie die gespeicherten Daten wieder her
reindexdb
alle DBs- Erstellen Sie die
referential_constraints
Ansicht neu - Staubsaugen Sie alle DBs (AFAIK nach diesem Upgrade erforderlich)
Dieses Verfahren funktioniert problemlos auf einem Host und kann problemlos gesichert und wiederhergestellt werden. Auf einem anderen Computer mit einer anderen Datenbank funktionieren die Punkte 1 bis 7 einwandfrei, aber der Server wird erst gestartet, wenn ich ein sleep 1
After hinzufüge initdb
, und selbst dann können die ausgegebenen Daten nicht wiederhergestellt werden, da "das Datenbanksystem gestartet wird". Was sind die Standardmethoden, um damit umzugehen, abgesehen von diesen schrecklichen Hacks:
sleep
für eine großzügige Zeitspanne vor jeder Operation,- Schleifen, bis es funktioniert oder bis eine großzügige Zeitüberschreitung erreicht ist, oder
- Schleife, bis eine triviale Abfrage akzeptiert wird oder eine Zeitüberschreitung erreicht ist.
Edit: Die " Lösung " hat doch nicht funktioniert. Was ist erforderlich, um sicherzustellen, dass die Datenbank bereit ist, eine Wiederherstellung auszuführen?
quelle
initdb
Exit-Status testen ? Ich nehme an, wenn die Arbeit erledigt ist.initdb
wird synchron ausgeführt, sodass der Start des Serversinitdb
bereits erfolgreich abgeschlossen wurde.Antworten:
initdb kehrt erst zurück, wenn es fertig ist. Daher sollte zwischen dem Start und dem Serverstart keine Pause erforderlich sein. Es gab Fehler in PostgreSQL, bei denen es abgeschlossen wurde, ohne dass zuerst alles auf die Festplatte geschrieben wurde. Ich kenne momentan keine Links, aber die Natur der Fehler ist, dass Sie nicht immer über sie Bescheid wissen.
Wenn Sie den Befehl pg_ctl zum Starten der Datenbank verwenden, warten Sie mit den Parametern "-w", bis der Start abgeschlossen ist, bevor Sie zurückkehren. Es macht nichts Besonderes - es macht nur das "Ist es schon fertig?" Schleife für Sie.
Beachten Sie, dass bei einem Serverabsturz mit vielen Daten, die erneut abgespielt werden müssen, bevor der Server gestartet werden kann, das durch "-t" beim Warten auf pg_ctl festgelegte Zeitlimit möglicherweise zu niedrig ist.
Es gibt keinen Grund, die Quelldatenbanken VACUUM zu machen, bevor Sie einen pg_dump von ihnen ausführen. Während es den Dump etwas beschleunigen könnte, wird das Vakuum selbst länger dauern als diese Verbesserung.
quelle
pg_restore -j
{morethan1} fast zusammenhängend ).postmaster
, um den Daemon zu starten, und es scheint keine solche Option zu geben.Das
ArbeitenEine fehlerhafte Lösung bestand darin, das Init-Skript so zu ändern, dass wiederholt überprüft wird, ob der entsprechende Port verwendet wird. Wenn es nach einer Minute nicht angezeigt wird, gilt der Start als fehlgeschlagen. Pseudocode:Bearbeiten: Es stellt sich heraus, dass dies nicht ausreicht. Der Wiederherstellungsschritt:
Fehlermeldung:
quelle