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.
quelle
Antworten:
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 ... TEMPLATE
Funktionalität verwenden. Nach dem Test werfen Sie diese Datenbank weg. Dann ist Ihre Geschwindigkeitsbeschränkung im Wesentlichen nur die Zeit biscp -R
zum Datenbankverzeichnis. Das ist ungefähr so schnell, wie Sie es ohne die Snapshot-Magie des Dateisystems bekommen werden.quelle
Verwenden Sie Stellar , es ist wie Git für Datenbanken:
quelle
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).
quelle
Wahrscheinlich nicht die Antwort, die Sie sich erhoffen, aber haben Sie eine niedrigere Ebene für Schnappschüsse in Betracht gezogen - zum Beispiel LVM?
quelle
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:
quelle
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.
quelle
Obwohl ich sagen muss, dass das
Stellar
undgit reset --hard
eine interessante Lösung ist, werde ich ein Problem mit größeren Datenbanken und Tests haben, und ich verwende dieVirtualbox
etc.-Lösungen, aber in größeren Tests werden diese etwas "problematischer", wenn Sie verwenden Bare-Metal-Lösungen usw.Daher MUSS ich
ZFS
aus den folgenden Gründen, die @Peter Eisentraut auch erwähnte, als Dateisystem erwähnen , um diese in Zukunft zu berücksichtigen:Um einen Test durchzuführen, führen Sie kurz vor dem Test einen Postgresql-Stopp wie oben beschrieben durch,
zfs snapshot $SNAPSHOT
starten 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
Komprimierung - Postgresql erhält eine typische 3: 1-Komprimierung in meinen Datenbanken, sodass Sie viel mehr testen können;)
quelle