327 Stimmen

Wie kann ich eine Datenbank unter Git (Versionskontrolle) stellen?

Ich tue eine Webanwendung, und ich muss einen Zweig für einige wichtige Änderungen zu machen, die Sache ist, diese Änderungen erfordern Änderungen an der Datenbank-Schema, so möchte ich die gesamte Datenbank unter Git als auch setzen.

Wie mache ich das? Gibt es einen bestimmten Ordner, den ich unter einem Git-Repository behalten kann? Woher weiß ich, welcher es ist? Wie kann ich sicher sein, dass ich den richtigen Ordner verwende?

Ich muss sicher sein, denn diese Änderungen sind nicht abwärtskompatibel; ich kann es mir nicht leisten, einen Fehler zu machen.

Die Datenbank ist in meinem Fall PostgreSQL

Bearbeiten:

Jemand schlug vor, Sicherungskopien zu erstellen und die Sicherungsdatei statt der Datenbank unter Versionskontrolle zu stellen. Um ehrlich zu sein, finde ich das wirklich schwer zu schlucken.

Es muss doch einen besseren Weg geben.

Aktualisierung:

OK, es gibt also keinen besseren Weg, aber ich bin immer noch nicht ganz überzeugt, also werde ich die Frage etwas abändern:

Ich möchte die gesamte Datenbank unter Versionskontrolle stellen. Welche Datenbank-Engine kann ich verwenden, damit ich die eigentliche Datenbank unter Versionskontrolle stellen kann, anstatt ihren Dump?

Wäre Sqlite git-freundlich?

Da dies nur die Entwicklungsumgebung ist, kann ich jede beliebige Datenbank wählen.

Bearbeiten2:

Was ich wirklich möchte, ist nicht meine Entwicklungsgeschichte zu verfolgen, sondern in der Lage sein, von meinem "neuen radikalen Änderungen" Zweig auf den "aktuellen stabilen Zweig" zu wechseln und in der Lage sein, zum Beispiel einige Bugs/Probleme, etc, mit dem aktuellen stabilen Zweig zu beheben. Wenn ich also den Zweig wechsle, wird die Datenbank automatisch mit dem Zweig kompatibel, in dem ich mich gerade befinde. Die eigentlichen Daten sind mir eigentlich ziemlich egal.

2voto

Dana the Sane Punkte 14222

Ich denke, X-Istence ist auf dem richtigen Weg, aber es gibt noch einige Verbesserungen, die man an dieser Strategie vornehmen kann. Erstens, verwenden Sie:

$pg_dump --schema ... 

um die Tabellen, Sequenzen usw. zu löschen und diese Datei unter Versionskontrolle zu stellen. Sie verwenden diese Datei, um die Kompatibilitätsänderungen zwischen Ihren Zweigen zu trennen.

Führen Sie als nächstes einen Datendump für die Tabellen durch, die die Konfiguration enthalten erforderlich für Ihre Anwendung zu arbeiten (sollte wahrscheinlich überspringen Benutzerdaten, etc.), wie Formularvorgaben und andere Daten nicht Benutzer veränderbare Daten. Sie können dies selektiv tun, indem Sie:

$pg_dump --table=.. <or> --exclude-table=..

Das ist eine gute Idee, denn das Repo kann sehr unhandlich werden, wenn die Datenbank bei einem vollständigen Datendump auf über 100 MB kommt. Eine bessere Idee ist es, einen minimalen Satz von Daten zu sichern, die Sie zum Testen Ihrer Anwendung benötigen. Wenn Ihre Standarddaten jedoch sehr groß sind, kann dies trotzdem Probleme verursachen.

Wenn Sie unbedingt vollständige Sicherungen im Projektarchiv ablegen müssen, sollten Sie dies in einem Zweig außerhalb des Quellbaums tun. Ein externes Backup-System mit einem Verweis auf die passende svn rev ist dafür wahrscheinlich am besten geeignet.

Außerdem schlage ich vor, für Revisionszwecke Dumps im Textformat statt im Binärformat zu verwenden (zumindest für das Schema), da diese leichter zu vergleichen sind. Sie können diese immer komprimieren, um Platz zu sparen, bevor Sie sie einchecken.

Schauen Sie sich auch die Dokumentation zur Postgres-Sicherung wenn Sie es nicht schon getan haben. Die Art und Weise, wie Sie die Sicherung "der Datenbank" und nicht eines Dumps kommentieren, lässt mich vermuten, dass Sie an dateisystembasierte Sicherungen denken (siehe Abschnitt 23.2 für Vorbehalte).

2voto

Peter Eisentraut Punkte 33105

Was Sie im Grunde genommen wollen, ist vielleicht so etwas wie Postfaktisch die Versionen einer Datenbank in einer Datenbank speichert. Dies prüfen Präsentation .

Das Projekt wurde anscheinend nie wirklich umgesetzt, so dass es Ihnen wahrscheinlich nicht sofort weiterhilft, aber es ist ein interessantes Konzept. Ich fürchte, dass es sehr schwierig wäre, dies richtig zu machen, denn selbst bei Version 1 müssten alle Details stimmen, damit die Leute ihre Arbeit darauf abstützen.

1voto

OzzyTheGiant Punkte 609

Ich sage nein. Daten können sich jederzeit ändern. Stattdessen sollten Sie nur Datenmodelle in Ihrem Code, Schema und Tabellendefinitionen festlegen ( create database y create table Anweisungen) und Beispieldaten für Einheitstests. Dies ist in etwa die Art und Weise, wie Laravel es tut, Datenbankmigrationen und Seeds zu begehen.

1voto

Ceddy Muhoza Punkte 606

Update 26. Aug. 2019:

Netlify CMS macht es mit GitHub, eine Beispielimplementierung finden Sie hier mit allen Informationen, wie sie es implementiert haben netlify-cms-backend-github

1voto

Florian Mertens Punkte 2287

Wir haben früher eine soziale Website mit einer Standard-LAMP-Konfiguration betrieben. Wir hatten einen Live-Server, einen Testserver und einen Entwicklungsserver sowie die lokalen Entwicklerrechner. Alle wurden mit GIT verwaltet.

Auf jedem Rechner befanden sich die PHP-Dateien, aber auch der MySQL-Dienst und ein Ordner mit den Bildern, die die Benutzer hochladen wollten. Der Live-Server wuchs auf etwa 100.000 (!) wiederkehrende Benutzer an, der Speicherauszug war etwa 2 GB (!) groß, der Bildordner etwa 50 GB (!). Als ich das Unternehmen verließ, stieß unser Server an die Grenzen seiner CPU, seines Arbeitsspeichers und vor allem an die Grenzen der gleichzeitigen Netzverbindungen (wir kompilierten sogar unsere eigene Version des Netzwerkkartentreibers, um den Server voll auszulasten 'lol'). Wir konnten nicht ( Sie sollten auch nicht davon ausgehen, dass Sie mit Ihrer Website ) 2 GB an Daten und 50 GB an Bildern in GIT zu speichern.

Um all dies unter GIT einfach zu verwalten, ignorierten wir die Binärordner (die Ordner mit den Bildern), indem wir diese Ordnerpfade in .gitignore einfügten. Wir hatten auch einen Ordner namens SQL außerhalb des Apache documentroot-Pfads. In diesen SQL-Ordner legten wir unsere SQL-Dateien von den Entwicklern in inkrementeller Nummerierung ab (001.florianm.sql, 001.johns.sql, 002.florianm.sql usw.). Diese SQL-Dateien wurden ebenfalls mit GIT verwaltet. Die erste sql-Datei würde in der Tat einen großen Satz von DB-Schemata enthalten. Wir fügen in GIT keine Benutzerdaten hinzu (z. B. die Datensätze der Benutzertabelle oder der Kommentartabelle), aber Daten wie Konfigurationen oder Topologie oder andere standortspezifische Daten wurden in den SQL-Dateien (und damit von GIT) verwaltet. Meistens sind es die Entwickler (die den Code am besten kennen), die bestimmen, was in Bezug auf SQL-Schema und Daten von GIT gepflegt wird und was nicht.

Wenn es zu einer Veröffentlichung gekommen ist, meldet sich der Administrator auf dem Entwicklungsserver an, führt den Live-Zweig mit allen Entwicklern und den benötigten Zweigen auf dem Entwicklungsrechner zu einem Update-Zweig zusammen und schiebt ihn auf den Testserver. Auf dem Testserver prüft er, ob der Aktualisierungsprozess für den Live-Server noch gültig ist, und leitet in schneller Folge den gesamten Datenverkehr im Apache auf eine Platzhalter-Site um, erstellt einen DB-Dump, leitet das Arbeitsverzeichnis von 'live' auf 'update' um, führt alle neuen Sql-Dateien in mysql aus und leitet den Datenverkehr wieder auf die korrekte Site zurück. Wenn alle Beteiligten nach der Überprüfung des Test-Servers zugestimmt haben, führt der Administrator das Gleiche vom Test-Server zum Live-Server durch. Anschließend führte er den Live-Zweig auf dem Produktionsserver mit dem Master-Zweig auf allen Servern zusammen und stellte alle Live-Zweige neu ein. Die Entwickler waren selbst dafür verantwortlich, ihre Zweige zu rebasen, aber sie wissen im Allgemeinen, was sie tun.

Wenn es auf dem Testserver Probleme gab, z. B. zu viele Konflikte bei den Zusammenführungen, wurde der Code rückgängig gemacht (indem der Arbeitszweig wieder auf "live" gesetzt wurde) und die SQL-Dateien wurden nie ausgeführt. In dem Moment, in dem die SQL-Dateien ausgeführt wurden, wurde dies als nicht rückgängig zu machende Aktion betrachtet. Wenn die SQL-Dateien nicht ordnungsgemäß funktionierten, wurde die DB mit dem Dump wiederhergestellt (und die Entwickler wegen der Bereitstellung schlecht getesteter SQL-Dateien verwarnt).

Heute unterhalten wir sowohl einen sql-up- als auch einen sql-down-Ordner mit äquivalenten Dateinamen, in denen die Entwickler testen müssen, ob die aktualisierenden sql-Dateien gleichermaßen heruntergestuft werden können. Dies könnte letztlich mit einem Bash-Skript durchgeführt werden, aber es ist eine gute Idee, wenn menschliche Augen den Upgrade-Prozess überwachen.

Es ist nicht großartig, aber es ist überschaubar. Ich hoffe, dies gibt einen Einblick in eine reale, praktische, relativ hochverfügbare Website. Sei es ein bisschen veraltet, aber immer noch gefolgt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X