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:
- Nuke-and-Dump von einer Datenbank in eine andere (was ich gerade mache)
- Verwalten einer UPDATE.sql-Datei mit SQL-Anweisungen, die entweder per Skript oder von Hand ausgeführt werden.
- 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.
quelle
update.php
oderupdate.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?Antworten:
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.)
quelle
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:
ALTER
Weitergabe ist nicht genugquelle
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.
quelle
Schauen Sie sich http://south.aeracode.org an - es ist eine DB-Migrationsbibliothek für Django (ein Python-Framework), aber:
Es kann auch Schemaaktualisierungsskripts generieren. Meistens werden auch Änderungsstornierungen automatisch verarbeitet.
quelle