In Derby (einer in Java geschriebenen eingebetteten Datenbank, die hauptsächlich zum Testen oder Prototyping verwendet wird) gibt es die Befehle "Freeze" und "Unfreeze", die während einer Online-Sicherung verwendet werden können . "Freeze" bewirkt einfach, dass alle Datenbankzugriffe blockiert werden, bis "unfreeze" aufgerufen wird. Dies ist nützlich für die Sicherung mit einem externen Programm. Dies ist möglicherweise der Fall, wenn das externe Programm viel schneller ist als die Verwendung der internen Sicherungslösung von Derby. Für meinen Anwendungsfall kann ich mit einigen integrierten Dateisystem-Dienstprogrammen fast sofort einen Schnappschuss erstellen, sodass es sich um eine zeitkonstante Operation handelt (nicht O(length of DB files)
).
Ich migriere eine Anwendung, die Derby entwachsen ist, zu PostgreSQL und habe mich gefragt, ob es dort etwas Vergleichbares gibt, mit dem ich alle Verbindungen stilllegen kann. Außerdem möchte ich lieber wissen, was mein Serialisierungspunkt in meiner Anwendung ist, damit ich nicht in einen unangenehmen Zustand gerate. Daher ist es für mich sehr schön, alle anderen Zugriffe anhalten / fortsetzen zu können.
Da PostgreSQL über ein Transaktionsprotokoll verfügt, könnte ich einfach einen Snapshot erstellen, ohne ihn einzufrieren. Der Snapshot muss jedoch über den Wiederherstellungsmechanismus von PostgreSQL ausgeführt werden, bevor ich ihn verwenden kann, da sonst das, was auf der Festplatte gespeichert ist, das gleiche ist, als würde ich es ziehen der Stecker auf einem normalen Dateisystem. Diese Lösung ist nicht ideal.
BEARBEITEN Ich habe erfahren, dass dies pg_start_backup()
nahe beieinander liegt, aber eingehende Transaktionen werden erst nach einem übereinstimmenden Aufruf blockiert pg_stop_backup()
, sodass ich gezwungen bin, zu einem bestimmten Zeitpunkt eine Wiederherstellung der Transaktions-ID durchzuführen, pg_start_backup()
die von einem Dateisystem-Snapshot zurückgegeben wird. Es wäre schön, nicht zu haben , tatsächlich Shutdown PostgreSQL , um diese zu bekommen (vielleicht gibt es einen pseudo-Shutdown - Befehl, die Verbindungen offen? Hält).
pg_start_backup()
ist nah. Gibt es eine Möglichkeit, andere Schreibvorgänge tatsächlich zu blockieren, damit der Snapshot garantiert konsistent ist (außer das Herunterfahren der Datenbank vor dem Snapshot)? Andernfalls muss ich anscheinend noch eine Wiederherstellung zu einem bestimmten Zeitpunkt für die Transaktion durchführen, um pg_start_backup()
zu vermeiden, dass Transaktionen wiederhergestellt werden, die zwischen dem pg_start_backup()
Snapshot und dem Dateisystem-Snapshot auftreten.
pg_start_backup()
: postgresql.org/docs/current/static/… Aber Sie sollten dies lesen: postgresql.org/docs/current/static/backup-file.html, um zu verstehen, warum Sie nicht einfach ein Dateisystem nehmen können Backup während der Server läuft