Behandeln von Datenbankschemaänderungen beim Pushen neuer Versionen

17

In Zeiten starker Entwicklung ändert sich das Datenbankschema schnell und kontinuierlich, und bis unser wöchentlicher Push für die Betaversion eintritt, hat sich das Schema so stark geändert, dass die einzig sinnvolle Option darin besteht, alle Tabellen, die ich kann und kann, zu nuklearisieren Kopieren Sie die neuen Versionen aus meiner Entwicklerdatenbank. Offensichtlich wird dies nach dem Start nicht funktionieren, da das Löschen von Produktionsdaten ein Rezept für eine Katastrophe ist. Daher habe ich mich gefragt, welche Strategien es gibt, um Datenbankschemaänderungen von einer Version / Revision zu einer anderen zu verwalten.

Einige, die ich gefunden oder erlebt habe:

  1. Nuke-and-Dump von einer Datenbank in eine andere (was ich gerade mache)
  2. Verwalten einer UPDATE.sql-Datei mit SQL-Anweisungen, die entweder per Skript oder von Hand ausgeführt werden.
  3. Verwalten einer update.php-Datei mit einem entsprechenden Wert für "db-schema-version" in der aktiven Datenbank

Die dritte Option scheint die sinnvollste zu sein, es besteht jedoch weiterhin die Möglichkeit, dass eine schlecht konstruierte SQL-Abfrage mitten im Skript fehlschlägt und die Datenbank in einem halb aktualisierten Zustand bleibt, sodass eine Sicherung wiederhergestellt werden muss.

Es scheint kein Problem zu sein, aber es passiert, da wir als Team phpMyAdmin verwenden und ich mich nicht einmal darauf verlassen kann, dass ich die ausgeführte SQL-Anweisung kopiere, um sie in die Datei update.php einzufügen. Wenn Sie zu einer anderen Seite navigieren, muss ich die SQL-Anweisung von Hand neu schreiben oder meine Änderung rückgängig machen und erneut ausführen.

Ich vermute, ich erhoffe mir eine Lösung, die sich nicht auf unseren etablierten Entwicklungsworkflow auswirkt.

Julian H. Lam
quelle
Aber natürlich würden Sie Ihre update.phpoder update.sql-Datei in einer Testumgebung testen, bevor Sie sie auf die aktive Datenbank anwenden, oder? Und PHPMyAdmin wird für die möglichen Probleme verantwortlich gemacht, die beispielsweise bei Skripten auftreten können. Vielleicht ist es an der Zeit, ein anderes / besseres Tool zu suchen?
FrustratedWithFormsDesigner
Haha, ja, du hast mich erwischt. Ich versuche, meine eigenen Fehler zu umgehen, anstatt sie erst zu lösen.
Julian H. Lam
Wenn Sie diese Arbeit hätten, würden Sie bitte ein Beispielskript zeigen? Ich versuche dies auch zu tun, aber ich kann nicht zwischen MS SQL und MySQL übersetzen: stackoverflow.com/questions/26948916/…
Richard
Wir standen vor dem gleichen Problem, wir haben ein Tool geschrieben. Jedes Upgrade ist eine Datei mit einem numerischen Bezeichner (Dateien von niedriger zu höherer Nummer ausführen). Jede Datei wird vor der Freigabe in die eigentliche Datenbank gegen eine Test-DB geprüft und es wird gespeichert, welche Dateien freigegeben wurden. Natürlich ist alles automatisiert und in das Hauptsystem eingebunden.
Itay Moav-Malimovka

Antworten:

11

Automatisieren. Automatisieren. Automatisieren.

Sie sind mit einer expliziten DB-Versionsnummer auf dem richtigen Weg, aber ich würde einen Schritt weiter gehen und dem Code explizit bewusst machen, gegen welches Schema er arbeiten soll (z. B. indem Sie das eigentliche DDL-Skript ausführen und das Aktualisierungsprogramm es analysieren lassen ); Zum Aktualisierungszeitpunkt müssen Sie dann nur das vorhandene Schema über Datenbank-Metadaten und INSERT / DROP / ALTER nach Bedarf ermitteln, unabhängig davon, von welcher Version auf welche Version Sie aktualisieren. (Sie können auch eine explizite Versionsnummer in der Datenbank selbst speichern und den gesamten Schemaverlauf mit dem Installationsprogramm bereitstellen, sodass Sie nicht einmal die Schemaerkennung benötigen.)

Mögliche Syntaxfehler im Update-SQL-Skript sind ein Problem. Sie können dies jedoch beheben, indem Sie sicherstellen, dass der Updater nur korrekte DDL-Anweisungen erstellen kann. (Formale Beweise lohnen sich in der Entwicklung von Unternehmenssoftware so gut wie nie - zu viel Aufwand für zu wenig Sicherheit -, aber ich bin der Meinung, dass die Datenbankintegrität eine der wenigen Ausnahmen ist: Grundlegendes SQL ist keine besonders schwer zu erfassende Sprache und der Vorteil von Der Schutz der Produktionsdaten ist so groß, dass nahezu jeder einmalige Aufwand gerechtfertigt ist, insbesondere, wenn es sich um eine unbeaufsichtigte Installation handelt.)

Kilian Foth
quelle
Toller Rat Kilian, danke. Ich hatte schließlich gehofft, dies zu automatisieren, aber irgendwann scheint es immer noch notwendig zu sein, die UPDATE / ALTER-Anweisungen unter menschlicher Beteiligung zu generieren.
Julian H. Lam
2

Die Versionsverwaltung für das Datenbankschema ist der richtige Weg - jede Version hat nur eine Änderung an der Datenbank oder zumindest Änderungen, die als Ganzes rückgängig gemacht werden können. DBDeploy ist ein großartiges Tool, um dies zu automatisieren.

Einige nützliche Dinge, die ich gelernt habe, sind:

  1. Immer Ihre Änderung testen lokal und testen Sie den Code mit ihm, nur die ALTERWeitergabe ist nicht genug
  2. Sie müssen synchronisieren, welche Änderungen zuerst vorgenommen werden sollen - eine einfache Wiki-Seite, auf der Sie "eine Zahl nehmen" können, hat sich für mein Team ausgezeichnet bewährt.
  3. Versuchen Sie nicht, kaputte Änderungen zu korrigieren, fügen Sie eine neue Gegenänderung hinzu, um sie zu annullieren, es ist sehr schmerzlos
  4. Ihr Code hängt von diesen Änderungen ab - stellen Sie sicher, dass Sie die Probleme in Ihrem Bug-Tracking-System mit den DB-Änderungen verknüpfen. Dies ist zum Zeitpunkt der Bereitstellung sehr hilfreich.
  5. DB-Änderungen in Ihr CI einbeziehen - Übernehmen Sie Ihre Änderungen beim Festschreiben in eine CI-Datenbank. Wenn Sie Tests haben, die eine Datenbank verwenden, führen Sie diese beim Festschreiben aus.
jmruc
quelle
Ich bin froh,
Ihnen behilflich
0

Da Sie phpMyAdmin verwenden, gehe ich davon aus, dass Sie auch MySQL verwenden.

Schauen Sie sich die EER-Modelldiagramme in MySQL Workbench an. Sie waren für mich eine große Hilfe bei der Pflege und Aktualisierung von Schemata.

Zunächst können Sie das Modell mit einer Datenbankquelle synchronisieren. Damit werden Änderungen im Diagramm als ALTER TABLE-Befehle gepusht. Auf diese Weise können Sie Ihre Schemaänderungen am Diagramm vornehmen, es immer auf dem neuesten Stand halten und bei Bedarf auch Aktualisierungen an Ihrer Entwicklungsdatenbank vornehmen.

Zweitens können Sie ein EER-Diagramm aus einer Datenbankquelle zurückentwickeln. Dies kann nützlich sein, indem Sie Änderungen an einer Entwicklungsdatenbank vornehmen und eine Produktionsdatenbank aktualisieren, da die Unterschiede berechnet werden.

Drittens kann es verwendet werden, um die SQL zu erstellen, die in Ihre "update.sql" -Datei aufgenommen werden soll.

Nachteile:

Datenbankauslöser und -einschränkungen sind ein Problem mit dem Aktualisierungsprogramm für die Synchronisierung. Es scheint nicht die richtige Reihenfolge der Dinge zu kennen. Fremdschlüsseleinschränkungen führen häufig zu Fehlern. Dies kann jedoch durch Bearbeiten der von ihnen generierten SQL behoben werden.

Dies ist kein Datenmigrationstool. Alle Änderungen, die über das reine Schema hinausgehen, erfordern weiterhin benutzerdefiniertes SQL.

Reactgular
quelle
0

Schauen Sie sich http://south.aeracode.org an - es ist eine DB-Migrationsbibliothek für Django (ein Python-Framework), aber:

  1. Sie können daraus großartige Ideen gewinnen (und vielleicht sogar einen PHP-Klon finden)
  2. Sie können es tatsächlich unabhängig vom Rest von Django verwenden, um die Tabellen Ihrer PHP / MySQL-App zu verwalten.

Es kann auch Schemaaktualisierungsskripts generieren. Meistens werden auch Änderungsstornierungen automatisch verarbeitet.

Erik Kaplun
quelle
Leider haben sie es zu einem Teil des Django-Kerns gemacht und stehen nicht mehr allein
Itay Moav-Malimovka