Es fiel mir schwer, gute Beispiele für die Verwaltung von Datenbankschemata und -daten zwischen Entwicklungs-, Test- und Produktionsservern zu finden.
Hier ist unser Setup. Jeder Entwickler hat eine virtuelle Maschine, auf der unsere App und die MySQL-Datenbank ausgeführt werden. Es ist ihre persönliche Sandbox, um zu tun, was sie wollen. Derzeit nehmen Entwickler Änderungen am SQL-Schema vor und führen einen Speicherauszug der Datenbank in eine Textdatei durch, die sie in SVN festschreiben.
Wir möchten einen Entwicklungsserver für die kontinuierliche Integration bereitstellen, auf dem immer der neueste festgeschriebene Code ausgeführt wird. Wenn wir das jetzt tun, wird die Datenbank für jeden Build von SVN neu geladen.
Wir haben einen (virtuellen) Testserver, auf dem "Release Candidates" ausgeführt werden. Die Bereitstellung auf dem Testserver ist derzeit ein sehr manueller Vorgang. In der Regel lade ich das neueste SQL aus SVN und optimiere es. Außerdem sind die Daten auf dem Testserver inkonsistent. Sie erhalten die Testdaten, die der letzte Entwickler auf seinem Sandbox-Server festgeschrieben hat.
Wo alles zusammenbricht, ist die Bereitstellung in der Produktion. Da wir die Live-Daten nicht mit Testdaten überschreiben können, müssen alle Schemaänderungen manuell neu erstellt werden. Wenn es eine große Anzahl von Schemaänderungen oder Konvertierungsskripten gab, um die Daten zu manipulieren, kann dies sehr haarig werden.
Wenn das Problem nur das Schema wäre, wäre es ein einfacheres Problem, aber es gibt "Basis" -Daten in der Datenbank, die auch während der Entwicklung aktualisiert werden, wie z. B. Metadaten in Sicherheits- und Berechtigungstabellen.
Dies ist das größte Hindernis, das ich sehe, wenn es um kontinuierliche Integration und One-Step-Builds geht. Wie lösen Sie es?
Eine Folgefrage: Wie verfolgen Sie Datenbankversionen, damit Sie wissen, welche Skripte ausgeführt werden müssen, um eine bestimmte Datenbankinstanz zu aktualisieren? Befindet sich eine Versionstabelle wie Lance unterhalb des Standardverfahrens?
Vielen Dank für den Hinweis auf Tarantino. Ich bin nicht in einer .NET-Umgebung, aber ich fand die DataBaseChangeMangement-Wiki-Seite sehr hilfreich. Besonders diese Powerpoint-Präsentation (.ppt)
Ich werde ein Python-Skript schreiben, das die Namen von *.sql
Skripten in einem bestimmten Verzeichnis mit einer Tabelle in der Datenbank vergleicht und diejenigen, die nicht vorhanden sind, in der Reihenfolge basierend auf einer Ganzzahl ausführt, die den ersten Teil des Dateinamens bildet. Wenn es eine ziemlich einfache Lösung ist, wie ich vermute, werde ich sie hier posten.
Ich habe ein funktionierendes Skript dafür. Die DB wird initialisiert, wenn sie nicht vorhanden ist, und bei Bedarf Upgrade-Skripte ausgeführt. Es gibt auch Schalter zum Löschen einer vorhandenen Datenbank und zum Importieren von Testdaten aus einer Datei. Es sind ungefähr 200 Zeilen, also werde ich es nicht posten (obwohl ich es bei Interesse auf Pastebin legen könnte).