Beginnend mit der Versionierung von MySQL-Schemata ohne Overkill. Gute Lösungen?

7

Ich bin an dem Punkt angekommen, an dem ich feststelle, dass ich mit der Versionierung meiner Datenbankschemata und Änderungen beginnen muss. Ich lese daher die bestehenden Beiträge zu SO über dieses Thema, aber ich bin nicht sicher, wie es weitergehen soll.

Ich bin im Grunde eine Ein-Mann-Firma und vor nicht allzu langer Zeit habe ich nicht einmal die Versionskontrolle für meinen Code verwendet. Ich bin in einer Windows-Umgebung, mit Aptana (IDE) und SVN (mit Tortoise). Ich arbeite an PHP / MySQL Projekten.

Was ist ein effizienter und ausreichender (kein Overkill) Weg, um meine Datenbankschemata zu versionieren?

Ich habe einen oder zwei Freiberufler in einigen Projekten, aber ich erwarte nicht viel Verzweigung und Verschmelzung. Also im Grunde würde ich gerne gleichzeitige Schemata zu meinen Code-Revisionen verfolgen.

[edit] Momentane Lösung : Im Moment habe ich entschieden, dass ich einfach einen Schemadump machen und einen mit den notwendigen Anfangsdaten erstellen werde, wann immer ich ein Tag festlege (stabile Version). Das scheint gerade für mich gerade genug zu sein. [/ Edit]

[edit2] plus Ich benutze jetzt auch eine dritte Datei namens increments.sql, in der ich alle Änderungen mit Datumsangaben usw. hinterlege, um den Änderungsverlauf in einer Datei zu verfolgen. Von Zeit zu Zeit integriere ich die Änderungen in die beiden anderen Dateien und leere die increments.sql [/ edit]

    
markus 16.04.2009, 11:28
quelle

11 Antworten

1

Ich denke, diese Frage verdient eine moderne Antwort, also werde ich sie mir selbst geben. Als ich die Frage im Jahr 2009 geschrieben habe, glaube ich nicht, dass Phinx bereits existierte und Laravel definitiv nicht.

Heute ist die Antwort auf diese Frage sehr klar: Schreibe inkrementelle DB-Migrationsskripte mit jeweils einer up - und einer down -Methode und führe all diese Skripte oder ein Delta davon aus, wenn du deine App installierst oder aktualisierst. Und fügen Sie natürlich die Migrationsskripte zu Ihrem VCS hinzu.

Wie bereits erwähnt, gibt es heute in der PHP-Welt hervorragende Werkzeuge, mit denen Sie Ihre Migrationen einfach verwalten können. Laravel verfügt über integrierte DB-Migrationen einschließlich der entsprechenden Shell-Befehle. Jeder andere hat eine ähnlich leistungsstarke Framework-Agnostic-Lösung mit Phinx.

Sowohl Artisan Migrationen (Laravel) als auch Phinx funktionieren gleich. Erstellen Sie für jede Änderung in der DB eine neue Migration, verwenden Sie Plain SQL oder den integrierten Abfrage-Generator, um die Hoch- und Runtermethoden zu schreiben, und führen Sie artisan migrate bzw. phinx migrate in der Konsole.

    
markus 13.03.2015, 01:43
quelle
7

Einfacher Weg für ein kleines Unternehmen: Speichern Sie Ihre Datenbank in SQL und fügen Sie sie Ihrem Repository hinzu. Fügen Sie dann jedes Mal, wenn Sie etwas ändern, die Änderungen in der Dump-Datei hinzu.

Sie können dann diff verwenden, um Änderungen zwischen den Versionen zu sehen, ganz zu schweigen von Kommentaren, die Ihre Änderungen erklären. Dies macht Sie auch praktisch immun gegen MySQL-Upgrades.

Der einzige Nachteil, den ich gesehen habe, ist, dass Sie daran denken müssen, das SQL manuell zu Ihrer Dump-Datei hinzuzufügen. Du kannst dich trainieren, dich immer daran zu erinnern, aber sei vorsichtig, wenn du mit anderen arbeitest. Ein Update zu verpassen könnte später ein Problem sein.

Dies könnte gemildert werden, indem man ein ausgeklügeltes Skript erstellt, um es für dich zu tun, wenn du Subversion einreichst, aber es ist ein bisschen viel für eine Ein-Mann-Show.

Bearbeiten: In dem Jahr, das seit dieser Antwort vergangen ist, musste ich ein Versionsschema für MySQL für ein kleines Team implementieren. Das manuelle Hinzufügen jeder Änderung wurde als umständliche Lösung angesehen, ähnlich wie es in den Kommentaren erwähnt wurde. Daher haben wir die Datenbank gedumpt und diese Datei der Versionskontrolle hinzugefügt.

Was wir herausfanden, war, dass die Testdaten in der Müllkippe landeten und es ziemlich schwierig machte, herauszufinden, was sich geändert hatte. Dies könnte nur durch Dumping des Schemas gelöst werden, aber dies war für unsere Projekte nicht möglich, da unsere Anwendungen davon abhängig waren, dass bestimmte Daten in der Datenbank funktionierten. Schließlich kehrten wir zu dem manuellen Hinzufügen von Änderungen zu dem Datenbank-Abbild zurück.

Dies war nicht nur die einfachste Lösung, sondern löste auch einige Probleme, die einige Versionen von MySQL beim Exportieren / Importieren haben. Normalerweise müssten wir die Entwicklungsdatenbank auslagern, Testdaten entfernen, Einträge protokollieren usw., ggf. bestimmte Namen entfernen / ändern und erst dann die Produktionsdatenbank erstellen. Durch das manuelle Hinzufügen von Änderungen konnten wir genau kontrollieren, was genau in der Produktion enden würde, so dass am Ende alles bereit war und der Umzug in die Produktionsumgebung so schmerzlos wie möglich war.

    
Manos Dilaverakis 16.04.2009 11:32
quelle
2

Wie wäre es mit einer Versionsdatei, die dadurch erzeugt wird:

%Vor%     
vartec 16.04.2009 11:34
quelle
2

Wo ich arbeite, haben wir ein Installationsskript für jede neue Version der App, die die SQL hat, die wir für das Upgrade ausführen müssen. Dies funktioniert gut genug für 6 Entwickler mit einigen Verzweigungen für Wartungsversionen. Wir ziehen in Erwägung, zu Auto Patch Ссылка zu wechseln, um herauszufinden, welche Patches für die zu aktualisierende Datenbank gelten. Es sieht so aus, als ob es eine kleine Komplikation geben könnte, die Verzweigung mit automatischem Patch behandelt, aber es klingt nicht so, als wäre das ein Problem für dich.

    
Robin 16.04.2009 11:40
quelle
2

Ich würde raten, eine Batch-Datei wie diese sollte den Job machen (nicht hart zu tun) ...

  

mysqldump --no-data -ufoo -pbar dbname > path/to/app/schema.sql
svn commit path/to/app/schema.sql

einfach die Batch-Datei nach dem Ändern des Schemas, oder lassen Sie es von einem Cron / Scheduler tun (aber ich weiß nicht ... ich denke, commits Arbeit, wenn nur die Zeitstempel geändert, auch wenn der Inhalt der gleiche ist. weiß nicht, ob das ein Problem wäre.)

    
stefs 16.04.2009 12:15
quelle
2

Die wichtigste Idee ist, einen Ordner mit dieser Struktur in Ihrem Projektbasispfad zu haben

%Vor%

Nun, wer die ganze Sache funktioniert, ist, dass Sie 3 Ordner haben: Tabellen Hält die Tabellenerstellungsabfrage. Ich empfehle die Benennung "table_name.sql".

Daten Hält die Tabelleneinfügedatenabfrage. Ich empfehle die gleiche Benennung "table_name.sql". Hinweis: Nicht alle Tabellen benötigen eine Datendatei, sondern nur diejenigen, die diese Initialdaten für die Projektinstallation benötigen.

Änderungsmengen Dies ist der Hauptordner, mit dem Sie arbeiten werden. Dies enthält die Änderungssets, die an der Anfangsstruktur vorgenommen wurden. Dies beinhaltet eigentlich Ordner mit Changesets. Zum Beispiel habe ich einen Ordner 1123 hinzugefügt, der die Änderungen enthält, die in Revision 1123 vorgenommen wurden (die Nummer stammt von Ihrem Code-Quellcode-Steuerelement) und kann eine oder mehrere SQL-Dateien enthalten.

Ich möchte sie gruppiert in Tabellen mit der Benennung xx_tablename.sql hinzufügen - die xx ist eine Zahl, die die Reihenfolge angibt, die sie ausgeführt werden müssen, da manchmal die Änderung in einer bestimmten Reihenfolge ausgeführt werden muss.

Hinweis: Wenn Sie eine Tabelle ändern, fügen Sie diese Änderungen auch zu Tabellen- und Datendateien hinzu, da dies die Dateien sind, die für eine Neuinstallation verwendet werden.

Dies ist die wichtigste Idee.

Für weitere Details können Sie diesen Blogeintrag

ansehen     
Gabriel Solomon 16.04.2009 12:36
quelle
1

Sehen Sie sich SchemaSync an. Es generiert die Patch- und Reverse-Skripte (.sql-Dateien), die für die Migration und Versionierung Ihres Datenbankschemas benötigt werden. Es ist ein Befehlszeilendienstprogramm für MySQL, das sprach- und rahmenunabhängig ist.

    
Mitch 15.04.2010 22:01
quelle
1

Vor einigen Monaten habe ich das Tool zur Versionierung des MySQL-Schemas durchsucht. Ich habe viele nützliche Tools gefunden, wie Doctrine-Migration, RoR-Migration, einige Tools, die in Java und Python geschrieben wurden.

Aber keiner von ihnen war zufrieden mit meinen Anforderungen.

Meine Anforderungen:

  1. Keine Anforderungen, schließen Sie PHP und MySQL
  2. aus
  3. Keine Schemakonfigurationsdateien wie schema.yml in Doctrine
  4. Kann das aktuelle Schema aus der Verbindung lesen und ein neues Migrationsskript erstellen, als ein identisches Schema in anderen Installationen der Anwendung darzustellen.

Ich habe angefangen, mein Migrationstool zu schreiben, und heute habe ich eine Beta-Version.

Bitte versuchen Sie es, wenn Sie Interesse an diesem Thema haben. Bitte senden Sie mir zukünftige Anfragen und Fehlerberichte.

Quellcode: bitbucket.org/idler/mmp/src Übersicht auf Englisch: bitbucket.org/idler/mmp/wiki/Home Übersicht auf Russisch: antonoff.info/development/mysql-migration-with-php-project

    
Maxim Antonov 07.07.2010 21:27
quelle
1

Unsere Lösung ist MySQL Workbench. Wir entwickeln die vorhandene Datenbank regelmäßig zu einem Model mit der entsprechenden Versionsnummer zurück. Es ist dann möglich, Diffs nach Bedarf einfach zwischen Versionen auszuführen. Außerdem erhalten wir schöne EER-Diagramme usw.

    
Gary 07.07.2010 21:31
quelle
1

Bei uns haben wir es so gemacht:

Wir setzen alle Tabellen / db-Objekte in eine eigene Datei, wie tbl_Foo.sql . Die Dateien enthalten mehrere "Teile", die durch

begrenzt sind %Vor%

Dabei ist create nur eine beschreibende Bezeichnung für ein bestimmtes Teil, die Datei sieht folgendermaßen aus:

%Vor%

Dann haben wir eine XML-Datei, die jedes einzelne Teil referenziert, das ausgeführt werden soll, wenn wir die Datenbank auf ein neues Schema aktualisieren. Es sieht ungefähr so ​​aus:

%Vor%

Der <classes/> Teil wenn für GUI und <dbschema/> mit <steps/> ist um Änderungen zu partitionieren. Die <step/> : s werden sequentiell ausgeführt. Wir haben einige andere Entitäten, wie sqlclr , um verschiedene Dinge wie die Bereitstellung von Binärdateien zu tun, aber das ist es ziemlich genau.

Natürlich haben wir eine Komponente, die diese Wiedergabelistendatei und ein Ressourcen- / Dateisystem-Objekt verwendet, das die Wiedergabeliste kreuzreferenziert und gewünschte Teile herausnimmt und sie dann als Administrator für die Datenbank ausführt.

Da die "Teile" in .sqls so geschrieben sind, dass sie in jeder DB-Version ausgeführt werden können, können wir alle Teile auf jeder vorherigen / älteren DB-Version ausführen und sie so ändern, dass sie aktuell ist. Natürlich gibt es einige Fälle, in denen SQL-Server Spaltennamen "früh" analysiert und wir Teile später ändern müssen, um exec_sql s zu werden, aber es passiert nicht oft.

    
Pasi Savolainen 18.04.2009 11:54
quelle
0

Ich mache etwas ähnliches wie Manos, außer dass ich eine "Master" -Datei (master.sql) habe, die ich mit einiger Regelmäßigkeit aktualisiere (einmal alle 2 Monate). Dann erstelle ich für jede Änderung eine Version namens .sql-Datei mit den Änderungen. Auf diese Weise kann ich mit der Datei master.sql beginnen und jede Version namens .sql-Datei hinzufügen, bis ich die aktuelle Version erhalte und ich Clients mit der Version namens .sql-Dateien aktualisieren kann, um die Dinge zu vereinfachen.

    
Jason 03.08.2009 12:24
quelle