2014-01-10 12 views
26

Ich habe eine Django-Anwendung, die eine Postgres db verwendet. Ich muss in der Lage sein, die db zu sichern und wiederherzustellen - sowohl um sicherzustellen, dass keine Daten verloren gehen, als auch um Daten während des Tests vom Produktionsserver auf den Entwicklungsserver kopieren zu können.Wie man eine django db sichert

Es scheint ein paar verschiedene Möglichkeiten, dies zu tun:

1) Nur mit dem db direkt interagieren. Also, für Postgres könnte ich ein Skript mit pg_dumpall und psql schreiben.

2) Verwenden Sie die Befehle "sqlclear/sqlall", die mit Django geliefert werden.

3) Verwenden Sie die Befehle "dumpdata/loaddata", die mit Django geliefert werden. Erstellen Sie also neue Fixtures aus der Datenbank, die Sie sichern möchten, und laden Sie sie dann in die Datenbank, die Sie wiederherstellen möchten.

4) Verwenden Sie ein Django-Plugin wie django-dbbackup.

Ich verstehe wirklich nicht die Vor-/Nachteile dieser verschiedenen Techniken.

Direkt neben meinem Kopf ist Option 1 db-spezifisch, und Option 3 scheint eher für die Einrichtung von Anfangsdaten geeignet. Aber ich bin immer noch nicht sicher, welche Vorteile Option 4 gegenüber Option 2 hat.

Danke.

+0

warum nicht Sie erstellen nur eine Kopie der gesamten Datenbank? http://www.postgresql.org/docs/8.1/static/backup.html#BACKUP-DUMP – karthikr

+2

funktioniert django-dbbackup überhaupt? Ich sehe klar Code dort, der keine Chance hat zu arbeiten: https://bitbucket.org/mjs7231/django-dbbackup/src/4702d2cf91987fd8a4122b95afca5d42cd477d00/dbbackup/storage/s3_storage.py?at=default#cl-56 – vartec

+0

@ Karthikr - Das würde funktionieren, aber die Befehle sind spezifisch für Postgres; Wenn sich die zugrunde liegende Datenbank ändert, müsste ich das Skript neu schreiben. – trubliphone

Antwort

16

Für regelmäßige Backups würde ich für Option 1 gehen, mit PostgreSQL eigenen nativen Werkzeug, wie es wahrscheinlich am effizientesten ist.

Ich würde argumentieren, dass Option 2 in erster Linie mit dem Erstellen der Tabellen und dem Laden von Anfangsdaten befasst ist, so dass nicht für Sicherungen geeignet ist.

Option 3 kann für Sicherungen verwendet werden und wäre besonders nützlich, wenn Sie auf eine andere Datenbankplattform migrieren müssten, da die Daten in einer Nicht-SQL-Form, d. H. JSON, von Django verstanden werden.

Option 4 das Plugin erscheint db eigene Backup-Tools (gemäß Option 1), sondern zusätzlich bietet Hilfe Ihre Backups in Cloud-Speicher schieben in Amazon S3 oder Dropbox

+1

Ich schrieb meine eigenen Python-Skripte zum Sichern/Wiederherstellen der Datenbank. Sie lesen aus dem Django-Einstellungsmodul, um herauszufinden, um welchen Dateityp es sich handelt. Momentan werden nur Postgres unterstützt. Aber es gibt Haken für andere Formate. – trubliphone

17

Das Problem mit Optionen 1-3 zu verwenden sind Diese Mediendateien (alles, was über FileField hochgeladen wurde) sind nicht enthalten in der Sicherung. Es ist möglich, das Verzeichnis mit den Mediendateien separat zu sichern. Da Django jedoch keine Dateien entfernt, wenn sie nicht mehr von FileField referenziert werden, landen Sie zwangsläufig mit Dateien im Backup, die nicht vorhanden sein müssen.

Deshalb würde ich mit Option # 4 gehen. Insbesondere empfehle ich django-archive*. Einige seiner Eigenschaften sind:

  • Dumps den Inhalt aller wichtigen Modelle (Standard ContentType, Permission und Session ausgeschlossen werden, da sie von manage.py migrate bestückt sind) und können Sie weitere Modelle wählen auszuschließen.

  • Enthält Mediendateien, die von FileField und ImageField Feldern referenziert werden. Beachten Sie, dass nur die Dateien enthalten, auf die durch Zeilen in der Datenbank verwiesen wird; Dateien, die von gelöschten Zeilen übrig bleiben, werden ignoriert.

  • Erzeugt ein einzelnes Archiv, das sowohl die Datenbanksicherungs- als auch die Mediendateien enthält.

  • Bietet Optionen zum Anpassen des Speicherorts, in dem Archive gespeichert werden sollen, des Dateinamensformats und des Archivtyps (gz und bz2).

Installation ist so einfach wie das Hinzufügen django_archive-INSTALLED_APPS und Einstellungsoptionen in settings.py, wenn nötig. Einmal installiert, können Sie sofort ein Archiv Ihrer gesamten Datenbank (einschließlich Mediendateien) erstellen, indem Sie:

./manage.py archive 

* Haftungsausschluss: Ich bin der Autor des Pakets

+1

Das ist ein guter Punkt. Für mein spezielles Projekt musste ich mich nicht um Mediendateien kümmern. Aber andere Benutzer können Ihr Paket nützlich finden. – trubliphone

Verwandte Themen