Meine Schritte:
- Führen Sie das Finale
pg_dumpall
auf einem Server ausprod-server-old
prod-server-old
Für immer herunterfahren .- Kopieren Sie die Ausgabe auf einen anderen Server (
prod-server-new
) - Stellen Sie dort die Datenbank wieder her.
- Der gesamte Verkehr geht
prod-server-new
jetzt
Wie kann ich Änderungen an der Datenbank während pg_dumpall
(zwischen Schritt 1 und Schritt 2) vermeiden, damit Änderungen während dieser Zeit nicht verloren gehen können?
In meinem Fall ist es 100% OK, eine kleine Ausfallzeit zu haben.
Es gibt mehrere Datenbanken im "Cluster" (übrigens mag ich das Wort "Cluster" nicht. Ich denke, die meisten Leute denken, ein "Cluster" ist eine Gruppe von mehreren Computern, aber in diesem Fall bedeutet dies einen Postgres-Server, der hält mehrere Datenbanken).
Meine Frage wurde als mögliches Duplikat für "Postgres-Datenbank vorübergehend schreibgeschützt machen (zum Durchführen von Volume-Snapshots)" markiert. Ich denke nicht, dass es ein Duplikat ist, da es in meinem Fall anders ist, da ich nicht nach einem temporären schreibgeschützten Zustand frage.
quelle
Antworten:
Zwei Möglichkeiten, dies zu tun:
Widerrufen Sie das
connect
Privileg für diepublic
Gruppe. Dadurch wird verhindert, dass sich alle außer den Superusern verbinden. Starten Sie dann den Server neu oder beenden Sie alle Verbindungen . Fahren Sie dann mit der Sicherung mit einem Superuser-Konto fort.Versetzen Sie Ihre Datenbank in den schreibgeschützten Modus:
Fahren Sie fort mit
pg_dumpall
. Kein Neustart erforderlich und keine Ausfallzeiten.Natürlich müssen Sie dies für jede Datenbank wiederholen, die Sie "sperren" möchten. Wenn Sie über eine signifikante Anzahl von Datenbanken verfügen, können Sie den gesamten Cluster schreibgeschützt machen:
default_transaction_read_only = on;
Legen Sie dies in Ihrer postgresql.conf fest und laden Sie den postgres-Dienst neu.Bitte beachten Sie, dass ich keinen dieser Befehle getestet habe. Fahren Sie auf eigenes Risiko fort.
quelle
prod-server-new
. Oder werden die obigen Einstellungen nicht von pg_dumpall ausgegeben?Eine Umgehung:
Ändern Sie den Port von PostgreSQL auf
prod-server-old
. Auf diese Weise ist es unwahrscheinlich, dass Clients während eine Verbindung zur Datenbank herstellenpg_dumpall --port=OTHER_PORT
.quelle
Ich bin ein SQL Server-Administrator (nicht Postgres), daher bin ich mir nicht 100% sicher, aber wenn Ausfallzeiten kein Problem darstellen, können Sie:
?
quelle
Verwenden von Triggern:
Dann machen Sie die Datenbank schreibgeschützt:
und um es wieder bearbeitbar zu machen:
quelle