Ist das Sichern einer MySQL-Datenbank in Git eine gute Idee?


57

Ich versuche, die Sicherungssituation für meine Anwendung zu verbessern. Ich habe eine Django-Anwendung und eine MySQL-Datenbank. Ich habe einen Artikel gelesen, in dem vorgeschlagen wird, die Datenbank in Git zu sichern.

Einerseits gefällt es mir, da es eine Kopie der Daten und des Codes synchron hält.

Git ist jedoch für Code konzipiert, nicht für Daten. Als solches wird es eine Menge zusätzlicher Arbeit tun, die den MySQL-Speicherauszug bei jedem Commit unterscheidet, was nicht wirklich notwendig ist. Wenn ich die Datei vor dem Speichern komprimiere, unterscheidet git die Dateien trotzdem?

(Die Dump-Datei ist derzeit 100 MB unkomprimiert, 5,7 MB, wenn es um Informationen geht.)

Bearbeiten: Die Code- und Datenbankschemadefinitionen befinden sich bereits in Git. Es handelt sich tatsächlich um die Daten, die ich jetzt sichern möchte.


13
Wenn Ihr Unternehmen über eine IT-Abteilung (Operations Department) verfügt, sollte diese für Sie zuständig sein.
Michael Hampton

1
ist der Datenteil der Anwendung oder was wird durch die Anwendung erstellt?
Winston Ewert

1
Git versucht beim Ausführen, alle Dateien zu unterscheiden git gc(oder die zugrunde liegenden Dateien git repack; git führt sie standardmäßig gelegentlich automatisch aus). Es wird sie auch immer entleeren , daher ist es möglicherweise besser, sie unkomprimiert zu speichern.
Jan Hudec

1
Um welche Art von Datenbank handelt es sich: handelt es sich um eine Produktions- oder Entwicklungsdatenbank?
el.pescado

6
viget.com/extend/backup-your-database-ingit , er ist ein "Senior Developer".
wobbily_col

Antworten:


101

Bevor Sie Daten verlieren, möchte ich versuchen, diese Frage aus der Perspektive eines Systemadministrators zu betrachten.

Es gibt nur einen Grund, warum wir Backups erstellen: Es ist möglich, Backups wiederherzustellen, wenn etwas schief geht, wie es ausnahmslos der Fall ist. Als solches hat ein richtiges Backup-System Anforderungen , die weit über das hinausgehen, was Git vernünftigerweise handhaben kann.

Hier sind einige der Probleme, die ich beim Versuch, Ihre Datenbank in git zu sichern, vorhersehen kann:

  • Das Repository wird mit jedem "Backup" dramatisch wachsen. Da git ganze Objekte speichert (wenn auch komprimiert) und sie später ändert (z. B. wenn Sie ausführen git gc) und den Verlauf für immer beibehält , werden sehr viele Daten gespeichert, die Sie nicht wirklich benötigen oder sogar wollen. Möglicherweise müssen Sie die Menge oder den Aufbewahrungszeitraum von Backups einschränken, um Speicherplatz zu sparen, oder aus rechtlichen Gründen. Es ist jedoch schwierig , alte Revisionen aus einem Git-Repo zu entfernen, ohne dass dabei viel Kollateralschaden entsteht.
  • Die Wiederherstellung ist auf Zeitpunkte beschränkt, die Sie im Repository gespeichert haben, und da die Daten so groß sind, kann es langsam sein, mehr als eine unbedeutende Zeitspanne zurückzulegen. Ein speziell für diesen Zweck entwickeltes Backup-System begrenzt die Menge der gespeicherten Daten, bietet jedoch möglicherweise mehr Granularität und ermöglicht schnellere Wiederherstellungen, wodurch Ausfallzeiten im Katastrophenfall verringert werden. Datenbank-fähige Backup-Lösungen ( Beispiel ) können auch kontinuierliche Backups bereitstellen , um sicherzustellen, dass keine einzige Transaktion verloren geht.
  • Commits sind wahrscheinlich ebenfalls langsam und werden langsamer, wenn die Datenbank wächst. Denken Sie daran, dass git im Wesentlichen ein Schlüsselwertdatenspeicher ist, der einem Dateisystem zugeordnet ist und daher den Leistungsmerkmalen des zugrunde liegenden Dateisystems unterliegt. Es ist möglich, dass dieser Zeitraum das Sicherungsintervall überschreitet und Sie Ihr SLA zu diesem Zeitpunkt nicht mehr einhalten können. Richtige Sicherungssysteme benötigen mit zunehmender Datenmenge auch mehr Zeit für die Sicherung, sind jedoch bei weitem nicht so umfangreich, da sie automatisch ihre eigene Größe basierend auf der von Ihnen konfigurierten Aufbewahrungsrichtlinie verwalten.

Trotz der Tatsache, dass es anscheinend einige interessante Dinge gibt, die Sie mit einem Datenbank-Dump tun können, wenn Sie ihn in git einfügen, kann ich ihn insgesamt nicht empfehlen, um Backups zu erstellen. Vor allem, da Backup-Systeme weit verbreitet sind (und viele sogar Open Source- Systeme sind ) und die Sicherheit Ihrer Daten erheblich verbessern und eine schnellstmögliche Wiederherstellung ermöglichen.


Dies ist die beste Antwort, da Michael Konsistenzprobleme behandelt hat. Abhängig von der Größe und Nutzung der Datenbank kann ein Snapshot die Daten zu einem bestimmten Zeitpunkt nicht zuverlässig reproduzieren, und es ist wahrscheinlich, dass Einschränkungen auftreten. Replikation kann etwas sein, das Sie untersuchen möchten - dev.mysql.com/doc/refman/5.0/en/replication.html
Aaron Newton

4
Dies ist nicht nur die beste Antwort, es ist die einzige Antwort. In der Regel sind Sie Entwickler, daher sind Backups nicht Ihre Sache. Jemand anderes kümmert sich bereits um sie (oder sollte es auch sein), und wenn Sie anfangen, sich zu engagieren, stören Sie möglicherweise ein System, das bereits funktioniert. Diese Boxen sollten bereits gesichert werden, damit Sie ein Backup, ein eigenes Backup und ein Backup Ihres eigenen Backups erstellen können, und das alles mit immer größerer Größe. Das ist nur verrückt. Plus: Sie sind Entwickler: Warum gehen Sie (wahrscheinlich) in die Nähe von Produktionsboxen?
Maximus Minimus

2
@JimmyShelter Es gibt eine Schule des Denkens , dass DevOps bedeutet nicht , dass Dev und Ops eng zusammenarbeiten, aber das Dev tatsächlich tut Ops. Normalerweise funktioniert es nicht gut, aber das hindert die Leute nicht daran, es zu versuchen.
Michael Hampton

Dies sollte die akzeptierte Antwort sein. Es werden die Anforderungen und der Zweck eines Backup-Systems klar erläutert und dann gezeigt, wie Git nicht passt. Zusätzliche Bonuspunkte für die Diskussion über Konsistenz und Leistung.
Gabriel Bauman

Lassen Sie mich bemerken, dass ich meine Antwort gepostet habe, vorausgesetzt, dass das OP kein Operations-Team hat, das dieses Problem für ihn lösen kann. Ich stimme Ihnen zu, dass diese Art von Aufgabe am besten denen überlassen wird, die das System tatsächlich bedienen und sich damit auskennen. Es gibt jedoch Situationen, in denen Sie einen Hut aufsetzen müssen, der nicht genau Ihrem entspricht, und ich glaube, dass es in dieser Situation besser ist, einige bewährte Methoden zu erlernen, als einfach eine eigene Lösung zu finden. Ich muss sagen, ich habe auch Ihre Antwort sehr lehrreich gefunden!
Logc

39

Meine zwei Cent: Ich halte es nicht für eine gute Idee. GIT tut so etwas wie „Speichern von Snapshots eines Satzes von Dateien an verschiedenen Punkten in der Zeit“, so dass Sie kann perfekt GIT verwenden für so etwas, aber das bedeutet nicht , Sie sollten . GIT wurde entwickelt, um Quellcode zu speichern, so dass Ihnen die meisten Funktionen fehlen und Sie viel Leistung für ein wenig Bequemlichkeit eintauschen würden.

Lassen Sie mich annehmen, dass der Hauptgrund, warum Sie darüber nachdenken, darin besteht, "eine Kopie der Daten und des Codes synchron zu halten". Dies bedeutet, dass Sie befürchten, dass Version 2.0 Ihres Codes ein anderes Datenbankschema als Version 1.0 benötigt . Eine einfachere Lösung wäre, das Datenbankschema als eine Reihe von SQL-Skripten mit CREATEAnweisungen zusammen mit dem Quellcode in Ihrem Git-Repository zu speichern . Ein Teil Ihrer Installationsprozedur besteht dann darin, diese Skripte auf einem zuvor installierten Datenbankserver auszuführen.

Der tatsächliche Inhalt dieser CREATETabellen hat nichts mit der Version Ihres Quellcodes zu tun. Stellen Sie sich vor, Sie installieren Ihre Software, Version 1.0, auf Server A und Server B, die in verschiedenen Unternehmen von verschiedenen Teams verwendet werden. Nach einigen Wochen wird der Inhalt der Tabellen sehr unterschiedlich sein, obwohl die Schemata genau gleich sind.

Da Sie den Inhalt der Datenbank sichern möchten, empfehle ich Ihnen, ein Sicherungsskript zu verwenden, das den Sicherungsspeicherauszug mit der aktuellen Version der Software kennzeichnet, zu der der Speicherauszug gehört. Das Skript sollte sich im GIT-Repository befinden (damit es Zugriff auf die Quellcode-Versionszeichenfolge hat), die Speicherauszüge selbst gehören jedoch nicht zu einem Versionskontrollsystem.

EDIT :

Nachdem ich den ursprünglichen Beitrag gelesen habe, der die Frage motiviert hat , finde ich dies eine noch zweifelhaftere Idee. Der entscheidende Punkt ist, dass der mysqldumpBefehl den aktuellen Status einer Datenbank in eine Reihe von SQL- INSERTAnweisungen umwandelt und GIT diese unterscheiden kann, um nur die aktualisierten Tabellenzeilen abzurufen.

Der mysqldumpTeil ist solide, da dies eine der Sicherungsmethoden ist, die in der MySQL-Dokumentation aufgeführt sind. Im GIT-Teil merkt der Autor nicht, dass Datenbankserver ein Transaktionsprotokoll führen , um Abstürze, einschließlich MySQL , zu beheben . Es wird mit diesem Protokoll , nicht GIT, dass Sie inkrementelle Backups für Ihre Datenbank erstellen soll. Dies hat in erster Linie den Vorteil, dass Sie die Protokolle nach der Wiederherstellung rotieren oder leeren können, anstatt ein GIT-Repository bis ins Unendliche und darüber hinaus aufzublähen ...


2
Ich bin nicht sicher, ob das Speichern des Datenbankschemas ohne die Daten in der Versionskontrolle sinnvoll ist. Die Daten sind das Wichtigste, und das möchte ich sichern. Mir gefällt jedoch die Idee, die Datenbanksicherung mit der aktuellen Softwareversion zu versehen. Ich werde versuchen, so etwas zu implementieren.
wobbily_col

10
Wenn Sie das Schema ohne die Daten speichern, sollte Ihre Software direkt nach der Installation "einsatzbereit" sein. Wenn es sich um ein Wiki handelt, sollte es bereit sein, Wiki-Seiten zu erstellen und etwas in sie zu schreiben. Wenn Sie das Schema und den Inhalt installieren , ist Ihr Wiki nach der Installation bereits mit X Wiki-Seiten gefüllt. .
Logc

3
Es kann eine gute Idee sein, Ihre Frage an die aktuelle Situation anzupassen, in der Sie sich befinden. Auch wenn Sie nicht alle Details veröffentlichen können, ist es wichtig anzugeben, dass viele Daten in jeder Installation unverändert angezeigt werden müssen, oder es gibt nur eine installation ...
logc

2
@wobbily_col Ein nicht auf Text basierendes, binäres Format hat im Kontext der Quellcodeverwaltung einen begrenzten Wert. Sie können nicht diff es, können Sie nicht verzweigen / fusionieren es, etc. So, während Sie sicherlich git verwenden , um die DB zu speichern, bevorzugen die meisten Menschen Skript die DB - Struktur sowie die erforderlichen Daten. Es ist ein Kompromiss zwischen etwas mehr Arbeit, aber der Bereitstellung der obigen Liste von Funktionen. Sie müssen abwägen, ob dies eine gute Idee für Ihre Lösung ist. Andernfalls können Sie wahrscheinlich GIT veranlassen, die Datenbank direkt zu speichern. Dies ist jedoch nicht die beste Lösung für die Aufgabe.
Daniel B

3
@RaduMurzea: Ich denke, das ist eine Frage der Prinzipien. Ein Versionskontrollsystem dient zum Verwalten von Quellcode und nicht von Binärdateien. Es ist keine Frage der Größe. Nein, Datenbank-Dumps sollten nicht in das Repository eingecheckt werden, genauso wie Trainingsvideos auch nicht eingecheckt werden sollten. Aber niemand hält Sie davon ab. :)
logc

7

Persönlich halte ich es nicht für eine gute Idee, ein Versionsverwaltungssystem zum Speichern der Sicherungsdateien zu verwenden, da die GIT-Versionsverwaltung für Datendateien und nicht für Binärdateien oder Sicherungsdateien wie eine MySQL-Sicherungssicherungsdatei konzipiert ist. Die Tatsache, dass Sie dies tun können, bedeutet nicht automatisch, dass Sie es tun sollten . Darüber hinaus wird Ihr Repository unter Berücksichtigung einer neuen Datenbanksicherung für jedes neue Commit dramatisch anwachsen, wobei viel Festplattenspeicher belegt wird und die Leistung von GIT beeinträchtigt wird, was zu einem langsamen Quellcodeverwaltungssystem führt. Für mich ist es in Ordnung, eine Sicherungsstrategie auszuführen und immer eine Sicherungsdatei parat zu haben, wenn Sie die Datenbank wiederherstellen müssen, wenn etwas in Ihrem Code schief geht, aber die Tools zur Versionskontrolle sind nicht dafür gemacht, Binärdaten zu speichern.

Aus diesen Gründen wird kein Dienstprogramm zum Speichern der Sicherungsdateien für Tag 1 und Tag 2 sowie zum Anzeigen der Unterschiede zwischen den beiden Sicherungsdateien angezeigt. Es wird viel zusätzliche und nutzlose Arbeit erfordern. Anstatt GIT zum Speichern von Datenbanksicherungen zu verwenden, wenn Sie neuen Code festschreiben, speichern Sie die Datenbanksicherungen in einem anderen Pfad, getrennt nach Datum und Uhrzeit, und fügen Sie in Ihren Code einen Verweis auf die neuen Datenbanksicherungen ein, die für jede Version mithilfe der Tags erstellt wurden. wie schon jemand vorgeschlagen hat.

Mein letzter Hinweis zu den Datenbank-Backups und GIT: Wenn ein Datenbankadministrator eine Datenbank wiederherstellen muss, weil einige Daten verloren gegangen sind, muss er nicht die Unterschiede zwischen der Sicherungsdatei für Tag 1 und der Sicherungsdatei für Tag 2 überprüfen, sondern nur wissen, welche Letzte Sicherungsdatei, mit der er die Datenbank ohne Fehler und Datenverlust wiederherstellen und Ausfallzeiten reduzieren kann. In der Tat besteht die Aufgabe eines Datenbankadministrators darin, die Daten so schnell wie möglich für die Wiederherstellung verfügbar zu machen, wenn das System aus bestimmten Gründen ausfällt. Wenn Sie die mit Ihren Commits verknüpften Datenbanksicherungen in GIT speichern, kann der Datenbankadministrator die Daten nicht schnell wiederherstellen, da Ihre Sicherungen auf die Zeitpunkte beschränkt sind, die Sie im GIT-Repository gespeichert haben, und um die Ausfallzeit zu verringern vom System,

Ich empfehle dann nicht, die Sicherungen mit GIT zu speichern, sondern eine gute Sicherungssoftwarelösung zu verwenden (es gibt einige davon hier ), die mehr Granularität bietet und es Ihnen ermöglicht, Ihre Daten sicher zu verwahren und zu sichern Datenrettung im Katastrophenfall einfach und schnell.


Vielleicht erklärt der Downvoter, warum er / sie downvotiert hat.
Alberto Solano

1
Nicht der Downvoter, aber ich denke, dieser Ansatz führt zu einem allgegenwärtigen Zusammenführungskonflikt, der für den Workflow, der von den meisten Git-Benutzern bevorzugt wird, nicht besonders förderlich ist.
Daniel B

@DanielB Ich schlage vor, das Versionskontrollsystem nicht zum Speichern der Datenbanksicherungsdateien zu verwenden. Ich denke, das Datenbank-Backup-Problem könnte leicht gelöst werden, ohne ein Versionskontrollsystem zu verwenden. Die Versionskontrollsysteme (GIT, TFS, SVN usw.) wurden für Software entwickelt, nicht für das Sichern von Dateien oder Datenbanken oder nur zum Speichern von Daten (dafür gibt es viele Lösungen).
Alberto Solano

Ich denke, die meisten Benutzer lesen die ersten paar Sätze und stimmen ab, da Sie anscheinend sagen werden, dass es in Ordnung ist, sie zu verwenden.

1
@ AlbertoSolano Ich verstehe; Wenn Sie jedoch die Frage ("Kann ich meine Datenbank in GIT sichern?") und dann Ihre erste Anweisung ("Es ist in Ordnung, die Sicherungsdatei zu speichern ...") lesen, scheinen Sie das Gegenteil zu sagen. Der Rest der Antwort scheint zu sagen, dass es weder hier noch dort ist, während ich vermute, dass die meisten Leute denken, dass es ein Zugunglück ist, das darauf wartet, passiert zu sein.
Daniel B

1

Sie sollten keine Binärdaten in Git speichern - insbesondere nicht in der Datenbank.
Codeänderungen und Datenbank-DML-Änderungen sind völlig verschiedene Dinge.

MySQL und Oracle können Archivprotokolle schreiben, um sie zu jedem Zeitpunkt wiederherzustellen. Sichern Sie einfach diese Protokolle an einem sicheren Ort und Sie werden in Ordnung sein.

Die Verwendung von Git zum Sichern dieser "Archivprotokolle" ist nicht sinnvoll. Archivprotokolle in Produktionsumgebungen sind ziemlich umfangreich und sollten nach regelmäßigen vollständigen Sicherungen entfernt werden. Es ist auch sinnlos, sie in git zu setzen - diese sind in gewisser Weise bereits ein Aufbewahrungsort.


1
Warum sollte man Git nicht verwenden, um diese von MySQL erstellten "Archivprotokolle" zu sichern?
gnat

1
Nur weil es keinen Sinn ergibt. Archivprotokolle in Produktionsumgebungen sind ziemlich umfangreich und sollten nach regelmäßigen vollständigen Sicherungen entfernt werden. Es ist auch sinnlos, sie in git zu setzen - diese sind in gewisser Weise bereits ein Aufbewahrungsort. Michael Hampton gibt eine ziemlich gute Antwort zu diesem Thema (auf dieser Seite).
Jehy

1
Warum sich die Mühe machen, die Protokolle zu drehen, wenn Sie eine Kopie von allem in git behalten wollen? Könnte auch nur eine Monster-Log-Datei behalten.
wobbily_col
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.