Ist es möglich, Datenbank-Snapshots mit PostgreSQL schnell zu erstellen / wiederherzustellen?


51

Zuallererst bin ich ein Entwickler, kein DBA oder Sysadmin; bitte sei höflich :)

Ich arbeite an einem Anwendungsworkflow, bei dem eine einzelne Benutzeraktion komplexe Änderungen in der Datenbank auslöst - Erstellen von Hunderten von Datensätzen in einigen Tabellen, Aktualisieren von Hunderten von Datensätzen in anderen usw. Insgesamt ungefähr 12 Tabellen (von ~ 100) ) sind von dieser Aktion berührt. Aufgrund der Komplexität fällt es mir sehr schwer, alle Änderungen manuell zurückzusetzen, bevor ich einen weiteren Test durchführen kann. Während des größten Teils meiner Entwicklungszeit kann ich am Ende des Workflows einfach eine "ROLLBACK" -Anweisung einfügen. Wenn ich mich jedoch dem Festschreiben meiner Änderungen nähere, muss ich das Original testen.

Ich habe eine lokale Kopie der Produktionsdatenbank, mit der ich arbeiten kann. In meinem Fall ist das Sichern und Wiederherstellen zwischen Tests schneller als das Schreiben eines Skripts, um alle Änderungen rückgängig zu machen. Es ist schneller, verlangsamt mich aber immer noch sehr (die Wiederherstellung auf meinem veralteten Laptop dauert ungefähr 20 Minuten). Kann ich auf irgendeine Weise einen Schnappschuss des aktuellen Status der Datenbank speichern und dann schnell wiederherstellen?

Ich bin garantiert der einzige Benutzer auf dem System, und ich habe root-Zugriff. Der Datenbankspeicherauszug ist ~ 100 MB, wenn tar'ed und gzip'ed. Die PostgreSQL-Version ist 8.3.

Vielen Dank im Voraus für hilfreiche Ideen.


Sie sagen, Sie haben den Datenbankspeicherauszug, ist das nicht ausreichend? Testen Sie Ihr System. Wenn etwas schief geht, verwenden Sie den Dump, um die Datenbank wieder in den ursprünglichen Zustand zu versetzen und mit der Entwicklung fortzufahren.
DrColossos

1
Stellen Sie nur die geänderten Tabellen wieder her?
Jack Douglas

1
@ Jack Douglas: Ich stelle die komplette DB aus dem Dump wieder her. Die fraglichen Tabellen machen ungefähr 2/3 der Daten aus, und ich muss mich immer noch um die richtige Wiederherstellungsreihenfolge und Fremdschlüsseleinschränkungen kümmern.
Zilk

1
@DrColossus: Ja, die Dumps reichen aus, um den vorherigen Status wiederherzustellen, aber das Erstellen und Anwenden ist sehr langsam.
Zilk

Antworten:


35

Sie können Snapshots auf Dateisystemebene verwenden, dies ist jedoch häufig recht umständlich, erfordert spezielle Dateisysteme und ist insbesondere bei älteren Laptops nicht immer verfügbar. ;-)

Wie wäre es, wenn Sie Ihren Basisstatus als Datenbank erstellen und dann eine neue Datenbank daraus für Ihren Testlauf erstellen, indem Sie die CREATE DATABASE ... TEMPLATEFunktionalität verwenden. Nach dem Test werfen Sie diese Datenbank weg. Dann ist Ihre Geschwindigkeitsbeschränkung im Wesentlichen nur die Zeit bis cp -Rzum Datenbankverzeichnis. Das ist ungefähr so ​​schnell, wie Sie es ohne die Snapshot-Magie des Dateisystems bekommen werden.


Das ist eine sehr gute Idee. Ich hatte überhaupt nicht an Datenbankvorlagen gedacht. Danke!
Zilk

1
Dies ist eine großartige Lösung, die 5-mal schneller ist als Drop-Restore, aber einen Nachteil hat: Sie müssen die aktuellen Verbindungen trennen, bevor Sie dies tun können, da sie sonst nicht ausgeführt werden können.
Sorin

Update: Dies funktioniert in der Produktion nicht, da die Quelldatenbank Verbindungen zu ihr hat. Wir brauchen eine andere Lösung.
Sorin

11

Verwenden Sie Stellar , es ist wie Git für Datenbanken:

Mit Stellar können Sie die Datenbank schnell wiederherstellen, wenn Sie z. B. Datenbankmigrationen schreiben, Zweige wechseln oder mit SQL arbeiten. PostgreSQL und MySQL (teilweise) werden unterstützt.



liquibase unterstützt es nicht wie Stellar, wo Sie möglicherweise mit der Datenbank arbeiten (z. B. in Komponententests) und möglicherweise einen Rollback zu einem früheren Status oder einer früheren Zeit ausführen müssen.
Andreas Dietrich

Stellar klingt nach einer großartigen Idee, funktioniert aber nicht für mich
Orlando

5

Wenn Ihre Datenbank in Virtualbox ausgeführt wird , können Sie problemlos Snapshots speichern und Snapshots sowohl des Datenbankstatus als auch des Betriebssystems selbst in wenigen Sekunden wiederherstellen (oder 1-2 Minuten, wenn Sie wirklich viele Daten in der Datenbank oder im Betriebssystem haben oder sehr wenig Speicher für die virtuelle Maschine) kostenlos.

In den meisten Fällen ist es am besten, ein leichtes Linux (als einen Windows-Server) zu installieren, um die virtuelle Maschine auszuführen, auf der die Datenbank gehostet wird, da Sie angeben, dass auf Ihrem Laptop nur wenige Ressourcen verfügbar sind.


Auf der Produktionsseite verwende ich die Snapshot-Backups von MediaTemple , um das gleiche Ergebnis zu erzielen (allerdings sind es 20 US-Dollar pro Backup-Slot und spezifisch für diesen Webhosting-Service, sodass das möglicherweise nicht zu Ihnen passt).


Ach egal, ich habe Ihren Kommentar nicht gesehen, in dem erwähnt wird, dass Sie bereits über virtualbox Bescheid wissen.
Wildpeaks

3

Wahrscheinlich nicht die Antwort, die Sie sich erhoffen, aber haben Sie eine niedrigere Ebene für Schnappschüsse in Betracht gezogen - zum Beispiel LVM?


Ja, das ist mir eingefallen. Leider werden Dateisystem-Snapshots von der aktuell verwendeten FS (ext3) nicht unterstützt. Eine andere Möglichkeit wäre, eine VM wie Virtualbox für die Testläufe einzurichten.
Zilk

2

Ich habe diese Frage gefunden, als ich versucht habe, dasselbe zu tun, und habe schließlich git im postgresql-Datenverzeichnis verwendet. Das Verwerfen der Änderungen ist so einfach wie:

git reset --hard

6
Dies ist für große Datenbanken nicht von Nutzen. Plus, warum Quälgeist mit Binärdateien unterschiedlicher Größe?
RolandoMySQLDBA

0

Eine weitere Möglichkeit, die ausprobiert werden könnte, besteht darin, eine Kopie des postgresql-Datenverzeichnisses zu speichern und dann das vorhandene Verzeichnis mit der Kopie neu zu schreiben, wenn Sie es wiederherstellen möchten. Es wird mehr Speicherplatz auf der Festplatte benötigen, ist aber definitiv schneller als die Wiederherstellung von einem Backup. Ich bin mir jedoch nicht sicher, ob dies schneller als die Template-Methode ist. Daher ist es eine gute Idee, zuerst einige Tests durchzuführen.


0

Obwohl ich sagen muss, dass das Stellarund git reset --hardeine interessante Lösung ist, werde ich ein Problem mit größeren Datenbanken und Tests haben, und ich verwende die Virtualboxetc.-Lösungen, aber in größeren Tests werden diese etwas "problematischer", wenn Sie verwenden Bare-Metal-Lösungen usw.

Daher MUSS ich ZFSaus den folgenden Gründen, die @Peter Eisentraut auch erwähnte, als Dateisystem erwähnen , um diese in Zukunft zu berücksichtigen:

  1. Snapshots - Insbesondere bei der Replikation von Prod nach QA / DR können Sie dasselbe "Dateisystem" für die Tests verwenden:
#On a replication node, rather stop, snap, restore for a "consistent" backup ;)
su -l -c "/usr/bin/m2ee stop" acw_qa
pg_ctlcluster ${=QA} stop --force
zfs destroy -R $SNAPSHOT
pg_ctlcluster ${=REPLICATION} stop --force
zfs snapshot $SNAPSHOT
pg_ctlcluster ${=REPLICATION} start

zfs destroy $CLONE
zfs clone -o mountpoint=$CLONEDIR $SNAPSHOT $CLONE
rm $CLONEDIR/$CLUSTER/recovery.conf
pg_ctlcluster ${=QA} start
su -l -c "/usr/bin/m2ee start" acw_qa
  1. Um einen Test durchzuführen, führen Sie kurz vor dem Test einen Postgresql-Stopp wie oben beschrieben durch, zfs snapshot $SNAPSHOTstarten Sie den Postgresql-Neustart, führen Sie dann einen Rollback durch, stoppen Sie den Postgresql-Neustart und führen Sie einfach einen Neustart durchzfs rollback $SNAPSHOT

  2. Komprimierung - Postgresql erhält eine typische 3: 1-Komprimierung in meinen Datenbanken, sodass Sie viel mehr testen können;)

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.