Mechanismen für die Verfolgung von DB-Schemaänderungen

stimmen
128

Was sind die besten Methoden für die Verfolgung und / oder DB-Schemaänderungen zu automatisieren? Unser Team nutzt Subversion für die Versionskontrolle und konnten wir einige unserer Aufgaben auf diese Weise (Pushing baut bis zu einem Staging-Server, Bereitstellung getesteten Code auf einem Produktionsserver) automatisieren, aber wir sind noch Datenbank-Updates manuell zu tun. Ich möchte eine Lösung finden oder erstellen, die wir effizient über mehrere Server mit unterschiedlichen Umgebungen arbeiten kann, während weiterhin Subversion als Backend zu verwenden, durch den Code und DB-Updates um auf verschiedene Server geschoben werden.

Viele beliebte Software-Pakete umfassen Auto-Update-Skripte, die DB-Version und anwenden, um die notwendigen Veränderungen zu erkennen. Ist dies der beste Weg, dies sogar in einem größeren Maßstab zu tun (über mehrere Projekte und manchmal mehr Umgebungen und Sprachen)? Wenn ja, gibt es eine bestehende Code gibt, die den Prozess vereinfacht oder ist es am besten, nur unsere eigene Lösung zu rollen? Hat jemand etwas ähnliches vor implementiert und integriert es in Subversion post-commit Haken, oder ist dies eine schlechte Idee?

Während eine Lösung, wäre vorzuziehen, mehrere Plattformen unterstützt, müssen wir auf jeden Fall die Linux / Apache / MySQL / PHP-Stack zu unterstützen, da die meisten unserer Arbeit auf dieser Plattform ist.

Veröffentlicht am 04/08/2008 um 22:31
quelle vom benutzer
In anderen Sprachen...                            


20 antworten

stimmen
54

In der Rails-Welt gibt es das Konzept der Migrationen, Skripte, in denen auf die Datenbank Änderungen vorgenommen werden in Ruby eher als eine Datenbank-spezifische Geschmack von SQL. Ruby Migrationscode endet umgewandelt werden in die DDL speziell auf Ihre aktuellen Datenbank; dies macht Datenbank-Plattformen sehr einfach wechseln.

Für jede Änderung, die Sie an der Datenbank vornehmen, schreiben Sie eine neue Migration. Migrations haben typischerweise zwei Verfahren: ein „up“ Verfahren, bei dem die Änderungen angewandt werden, und ein „down“ Verfahren, bei dem die Änderungen rückgängig gemacht werden. Ein einziger Befehl bringt die Datenbank auf dem neuesten Stand, und auch verwendet werden kann, um die Datenbank zu einer bestimmten Version des Schemas zu bringen. In Rails, Migrationen werden in einem eigenen Verzeichnis im Projektverzeichnis gehalten und wie jeder anderer Projekt-Code nur in der Versionskontrolle erhalten überprüft.

Diese Oracle Leitfaden für Rails - Migrationen deckt ganz gut Migrationen.

Entwickler , die mit anderen Sprachen haben bei Migrationen geschaut und haben ihre eigenen sprachspezifische Versionen implementiert. Ich kenne Ruckusing , ein PHP - Migrationen System , das nach dem Rails - Migrationen modelliert; es könnte sein , was Sie suchen.

Beantwortet am 04/08/2008 um 23:45
quelle vom benutzer

stimmen
48

Wir verwenden etwas Ähnliches wie bcwoord unserer Datenbank Schemen über 5 verschiedene Installationen (Produktion, Inszenierung und einigen Entwicklungsanlagen) synchronisiert zu halten, und unterstützt in der Versionskontrolle, und es funktioniert ziemlich gut. Ich werde ein bisschen erarbeiten:


Um die Datenbankstruktur zu synchronisieren, haben wir ein einziges Skript, update.php, und eine Reihe von Dateien nummerierten 1.sql, 2.sql, 3.sql usw. Das Skript eine zusätzliche Tabelle verwendet die aktuelle Versionsnummer der zu speichern, Datenbank. Die N.sql Dateien werden von Hand gefertigt, ab Version (N-1) auf der Version N der Datenbank zu gehen.

Sie können verwendet werden, um Tabellen hinzuzufügen, fügen Sie Spalten, Migration von Daten von einem alten auf ein neues Spaltenformat dann die Spalte fallen, legen Sie „Master“ Datenzeilen wie Benutzertypen usw. Grundsätzlich kann alles tun, und mit dem richtigen Daten Migrationsskripte Sie nie Daten verloren gehen.

Der Update-Skript funktioniert wie folgt:

  • Mit der Datenbank verbinden.
  • Erstellen Sie eine Sicherung der aktuellen Datenbank (weil Sachen wird schief gehen) [mysqldump].
  • Erstellen Buchhaltung Tabelle (genannt _meta), wenn sie noch nicht existiert.
  • Lesen Sie aktuelle Version von _meta Tabelle. Es sei angenommen, 0 wenn nicht gefunden.
  • Für alle SQL-Dateien nummeriert höher als VERSION, führen sie um
  • Wenn eine der Dateien einen Fehler erzeugt hat: ein Rollback auf den Backup
  • Andernfalls aktualisieren Sie die Version in der Buchhaltung Tabelle auf die höchsten SQL-Datei ausgeführt.

Alles geht in der Quellcodeverwaltung, und jede Installation hat einen Skript auf die neueste Version mit einer einzigen Ausführung des Skripts zu aktualisieren (Aufruf update.php mit dem richtigen Datenbank-Passwort etc.). Wir SVN Update Staging und Produktionsumgebungen über ein Skript, das den Datenbank-Update-Skript ruft automatisch, so dass ein Code-Update mit dem notwendigen Datenbank-Updates kommt.

Wir können auch das gleiche Skript verwenden, um die gesamte Datenbank von Grund auf neu zu erstellen; wir löschen und neu erstellen Sie einfach die Datenbank, dann das Skript ausführen, die die Datenbank vollständig neu zu besiedeln wird. Wir können auch das Skript verwenden, um eine leere Datenbank für automatisierte Tests zu füllen.


Es dauerte nur ein paar Stunden, dieses System einzurichten, ist es vom Konzept her einfach und jeder bekommt das Versionsnummernschema, und es hat mich in mit der Fähigkeit, vorwärts zu bewegen und sie entwickelnden das Datenbank-Design, ohne kommunizieren oder manuell ausführen, um die Änderungen von unschätzbarem Wert auf alle Datenbanken.

Hüten Sie sich vor , wenn zwar Anfragen von phpMyAdmin einfügen! Diese erzeugten Abfragen sind in der Regel den Namen der Datenbank, die Sie definitiv nicht wollen , da es Ihre Skripte brechen! So etwas wie CREATE TABLE mydb. newtable(...) schlagen fehl , wenn die Datenbank auf dem System nicht meinedb genannt wird. Wir haben einen SVN Haken pre-Kommentars, die SQL - Dateien enthalten , die nicht zulassen wird mydbZeichenfolge, die ein sicheres Zeichen , dass jemand Kopie / von phpMyAdmin geklebt ohne ordnungsgemäße Prüfung.

Beantwortet am 22/08/2008 um 15:44
quelle vom benutzer

stimmen
11

Mein Team Skripte aus allen Datenbankänderungen, und verpflichtet diese Skripte zu SVN, zusammen mit jeder neuen Version der Anwendung. Dies ermöglicht eine inkrementelle Änderungen der Datenbank, ohne Daten zu verlieren.

Um von einer Version zur nächsten zu gehen, brauchen Sie nur die Menge der Änderung Skripte auszuführen, und Ihre Datenbank ist up-to-date, und Sie haben noch haben alle Ihre Daten. Es kann nicht die einfachste Methode sein, aber es ist auf jeden Fall wirksam.

Beantwortet am 05/08/2008 um 20:56
quelle vom benutzer

stimmen
9

Wenn Sie noch auf der Suche nach Lösungen: wir ein Werkzeug schlagen Nextep Designer genannt. Es ist eine Datenbank-Entwicklungsumgebung, mit der Sie Ihre gesamten Datenbank unter Versionskontrolle gestellt werden. Sie arbeiten an einer Version gesteuert Repository, in dem jede Änderung verfolgt werden kann.

Wenn Sie ein Update freigeben möchten, können Sie Ihre Komponenten begehen und das Produkt wird die SQL-Upgrade-Skript aus der vorherigen Version automatisch generieren. Natürlich können Sie diese SQL aus beliebigen zwei Versionen erzeugen.

Dann haben Sie viele Möglichkeiten: Sie diese Skripte nehmen und sie mit Ihrem App-Code in Ihren SVN gelegt, so dass sie von Ihrem bestehenden Mechanismus eingesetzt würden. Eine weitere Option ist die Lieferung Mechanismus der Nextep zu verwenden: Skripte in etwas exportiert wird ein „Lieferumfang“ (SQL-Scripts + XML-Descriptor) genannt, und ein Installationsprogramm kann dieses Paket verstehen und es zu einem Zielserver bereitstellen, während strcutural Konsistenz zu gewährleisten, Abhängigkeit überprüfen, installierte Version Registrierung etc.

Das Produkt ist GPL und basiert auf Eclipse , so dass es auf Linux, Mac und Windows läuft. Es unterstützt auch Oracle, MySQL und PostgreSQL zur Zeit (DB2 - Unterstützung auf dem Weg). Werfen Sie einen Blick auf die Wiki , wo Sie weitere Informationen finden: http://www.nextep-softwares.com/wiki

Beantwortet am 25/10/2010 um 06:46
quelle vom benutzer

stimmen
9

Das Problem hier ist wirklich macht es einfach für Entwickler Skript ihre eigenen lokalen Änderungen in der Quellcodeverwaltung mit dem Team zu teilen. Ich habe dieses Problem seit vielen Jahren konfrontiert, und wurde durch die Funktionalität von Visual Studio für Datenbank - Profis inspiriert. Wenn Sie ein Open-Source - Tool mit den gleichen Funktionen nutzen möchten, versuchen Sie dies: http://dbsourcetools.codeplex.com/ Viel Spaß, - Nathan.

Beantwortet am 07/07/2009 um 14:26
quelle vom benutzer

stimmen
6

Scott Ambler produziert eine große Reihe von Artikeln (und Co-Autor ein Buch ) auf Datenbank - Refactoring, mit der Idee , dass Sie sollten im Wesentlichen TDD Prinzipien und Praktiken zur Erhaltung Ihr Schema anzuwenden. Sie legen für die Datenbank eine Reihe von Struktur und Saatgutdaten Unit - Tests auf. Dann, bevor Sie etwas ändern, ändern Sie / Tests schreiben , um diese Änderung widerzuspiegeln.

Wir machen das jetzt für eine Weile und es scheint zu funktionieren. Wir schrieben Code grundlegende Spaltennamen und Datentyp überprüft in einer Unit-Test-Suite zu erzeugen. Wir können diese Tests jederzeit zu überprüfen, erneut aus, dass die Datenbank im SVN Kasse stimmt die Live-db der Anwendung tatsächlich läuft.

Wie sich herausstellt, Entwickler zwicken auch manchmal ihre Sandbox-Datenbank und Vernachlässigung die Schemadatei in SVN zu aktualisieren. Der Code hängt dann von einer db Änderung, die in nicht geprüft hat. Diese Art von Fehler kann unerträglich schwer zu fassen, aber die Test-Suite wird es sofort abholen. Dies ist besonders schön, wenn man es in einen größeren Continuous Integration Plan gebaut hat.

Beantwortet am 29/08/2008 um 05:51
quelle vom benutzer

stimmen
6

Dump Ihr ​​Schema in eine Datei und fügen Sie die Quellcodeverwaltung. Dann wird ein einfaches diff wird Ihnen zeigen, was sich verändert.

Beantwortet am 06/08/2008 um 17:59
quelle vom benutzer

stimmen
5

K. Scott Allen hat einen anständigen oder zwei Artikel auf Schema Versionsverwaltung , die das inkrementellen Update - Skripte / Migrationen Konzept in anderen Antworten hier verwiesen wird verwendet; siehe http://odetocode.com/Blogs/scott/archive/2008/01/31/11710.aspx .

Beantwortet am 29/08/2008 um 06:11
quelle vom benutzer

stimmen
5

Wenn Sie C # verwenden, haben einen Blick auf Subsonic, ein sehr nützliches ORM-Tool, sondern erzeugt auch SQL-Skript Ihr Schema neu erstellt und \ oder Daten. Diese Skripte können dann in der Quellcodeverwaltung werden.

http://subsonicproject.com/

Beantwortet am 04/08/2008 um 23:47
quelle vom benutzer

stimmen
5

Es ist ein bisschen Low-Tech, und es könnte eine bessere Lösung da draußen sein, aber man konnte das Schema in einem SQL-Skript nur speichern, die zum Erstellen der Datenbank ausgeführt werden kann. Ich glaube, Sie einen Befehl ausführen können diesen Skript zu generieren, aber ich weiß nicht, den Befehl leider.

Dann begehen Sie das Skript in der Quellcodeverwaltung zusammen mit dem Code, der auf es funktioniert. Wenn Sie das Schema zusammen mit dem Code ändern müssen, kann das Skript in zusammen mit dem Code überprüft werden, die das geänderte Schema erfordert. Dann diffs auf dem Skript diffs auf Schemaänderungen anzuzeigen.

Mit diesem Skript, können Sie es mit DBUnit oder irgendein Art von Build-Skript zu integrieren, so scheint es, es mit Ihren bereits automatisierten Prozessen passen könnte.

Beantwortet am 04/08/2008 um 23:28
quelle vom benutzer

stimmen
4

Ich habe die folgende Datenbankprojektstruktur in Visual Studio für mehrere Projekte verwendet, und es ist ziemlich gut funktioniert:

Datenbank

ändern Scripts

0.PreDeploy.sql

1.SchemaChanges.sql

2.DataChanges.sql

3.Permissions.sql

erstellen Sie Scripts

Sprocs

Funktionen

Ansichten

Unser Build-System aktualisiert dann die Datenbank von einer Version zur nächsten durch die Skripte in der folgenden Reihenfolge ausführen:

1.PreDeploy.sql

2.SchemaChanges.sql

Inhalt des Scripts Ordner erstellen

2.DataChanges.sql

3.Permissions.sql

Jeder Entwickler prüft in ihre Änderungen für einen bestimmten Bug / Feature durch ihren Code auf das Ende jeder Datei angehängt wird. Sobald eine Hauptversion abgeschlossen ist und in der Quellcodeverwaltung, die Inhalte der SQL-Dateien im Change Scripts Ordner verzweigt werden gelöscht.

Beantwortet am 08/08/2008 um 19:31
quelle vom benutzer

stimmen
4

Wir verwenden eine sehr einfache, aber dennoch effektive Lösung.

Für Neuinstallationen, haben wir eine metadata.sql Datei im Repository, das alle DB-Schema, dann in den Build-Prozess wir die Datenbank verwenden, um diese Datei zu erzeugen hält.

Für Updates, wir, die Updates in der Software fest einprogrammiert hinzuzufügen. Wir halten es hartkodierte, weil wir gerne die Lösung von Problemen nicht, bevor es wirklich ein Problem, und diese Art der Sache nicht beweisen, bisher ein Problem sein.

Also in unserer Software haben wir etwas wie folgt aus:

RegisterUpgrade(1, 'ALTER TABLE XX ADD XY CHAR(1) NOT NULL;');

Dieser Code wird überprüft, ob die Datenbank in der Version 1 (die in einer Tabelle automatisch erstellt gespeichert ist), wenn es veraltet ist, dann wird der Befehl ausgeführt.

Um die metadata.sql im Repository zu aktualisieren, führen wir diese lokal aktualisiert und extrahieren Sie die vollständigen Datenbank-Metadaten.

Das einzige, was jeder so oft der Fall ist, ist die metadata.sql zu vergessen commiting, aber das ist kein großes Problem, weil seine leicht auf den Build-Prozess zu testen und auch das einzige, was ist geschehen könnte eine neue Installation machen mit eine veraltete Datenbank und auf dem ersten Einsatz aufgerüstet.

Auch nicht Herabstufungen unterstützen wir, aber es ist von Entwurf, wenn etwas an einem Update bricht, wiederhergestellt wir die vorherige Version und beheben Sie das Update vor einem erneuten Versuch.

Beantwortet am 08/08/2008 um 19:21
quelle vom benutzer

stimmen
3

Ich Ordner erstellen nach den Build-Versionen genannt und Put-Upgrade und dort Skripte degradieren. Zum Beispiel könnten Sie die folgenden Ordner haben: 1.0.0, 1.0.1 und 1.0.2. Jedes enthält das Skript, das Sie aktualisieren oder Herabstufung Ihre Datenbank zwischen den Versionen ermöglicht.

Sollte ein Kunde oder Kunde rufen Sie mit einem Problem mit der Version 1.0.1 und Sie verwenden 1.0.2, um seine Version bringt die Datenbank wieder wird kein Problem sein.

In Ihrer Datenbank, erstellen Sie eine Tabelle mit dem Namen „Schema“, wo Sie in der aktuellen Version der Datenbank setzen. Dann schreibt ein Programm, das Upgrade oder Ihre Datenbank Herabstufung für Sie einfach ist.

Genau wie Joey sagte, wenn man in einer Rails-Welt sind, verwenden Sie Migrationen. :)

Beantwortet am 05/08/2008 um 05:36
quelle vom benutzer

stimmen
2

Versuchen Sie db-deploy - in erster Linie ein Java-Tool, sondern funktioniert auch mit PHP.

Beantwortet am 19/01/2012 um 02:52
quelle vom benutzer

stimmen
2

Ich mag die Art und Weise , wie Datenbank Migrationen behandelt. Eine Migration ist im Grunde eine PHP - Skript Implementierung CDbMigration. CDbMigrationdefiniert ein upVerfahren, das die Migrationslogik enthält. Es ist auch möglich , eine zu implementieren downVerfahren zur Unterstützung der Umkehrung der Migration. Alternativ safeUpoder safeDownkann verwendet , um sicherzustellen, dass die Migration im Rahmen einer Transaktion durchgeführt wird.

Yü Kommandozeilen - Tool yiicenthält Unterstützung Migrationen zu erstellen und auszuführen. Migrationen können angewendet oder umgekehrt, entweder einzeln oder in einer Charge werden. Erstellen ein Migrationsergebnisses in Code für eine PHP - Klasse Implementierung CDbMigration, eindeutig benannte basierend auf einem Zeitstempel und eine Migration Namen vom Benutzer festgelegt. Alle Migrationen , die bisher angewendet wurden , um die Datenbank in einer Migrationstabelle gespeichert.

Weitere Informationen finden Sie die Datenbankmigration Artikel aus dem Handbuch.

Beantwortet am 25/06/2011 um 14:18
quelle vom benutzer

stimmen
2

IMHO Migrationen tun ein großes Problem haben:

Ein Upgrade von einer Version auf eine andere funktioniert gut, aber eine neue Installation einer bestimmten Version zu tun für immer könnte nehmen, wenn Sie Hunderte von Tabellen und eine lange Geschichte der Änderungen haben (wie wir).

Läuft die ganze Geschichte von Deltas seit der Basislinie bis zur aktuellen Version (für Hunderte von Kunden-Datenbanken) könnte eine sehr lange Zeit in Anspruch nehmen.

Beantwortet am 12/03/2011 um 15:15
quelle vom benutzer

stimmen
2

Toad for MySQL hat eine Funktion namens Schema vergleichen, mit dem Sie zwei Datenbanken synchronisieren. Es ist das beste Werkzeug, das ich bisher benutzt habe.

Beantwortet am 05/02/2011 um 12:08
quelle vom benutzer

stimmen
2

Ich würde mit Ant (Cross-Plattform) für die „Scripting“ Seite empfehlen und Subversion für den Quell-Repository (da es praktisch in jedes db da draußen über jdbc reden). Ant finden Sie alow Ihre db auf lokale Dateien zu „sichern“, bevor Sie Änderungen vornehmen. 1. Sicherung der vorhandenen db Schema über Ant 2. Versionskontrolle Subversion-Repository über Ant 3. senden, um neue SQL-Anweisungen in Datei über Ant db

Beantwortet am 17/09/2008 um 17:54
quelle vom benutzer

stimmen
2

Für mein aktuelles PHP-Projekt verwenden wir die Idee der Schienen-Migrationen und wir haben ein Verzeichnis Migrationen, in denen wir Dateien Titel „migration_XX.sql“ halten, wobei XX die Nummer der Migration ist. Derzeit werden diese Dateien von Hand erstellt als Updates vorgenommen werden, aber ihre Schöpfung leicht modifiziert werden könnte.

Dann haben wir ein Skript namens „Migration_watcher“, die, wie wir im Pre-Alpha sind, läuft derzeit auf jeder Seite laden und prüft, ob es eine neue migration_XX.sql Datei ist, wo XX größer als die aktuelle Migrations Version. Wenn so läuft es alle migration_XX.sql Dateien bis zu der größten Zahl für die Datenbank und voila! Schemaänderungen automatisiert.

Wenn Sie benötigen die Möglichkeit, das System zurückkehren würde eine Menge Tweaking erfordern, aber es ist einfach und hat bisher für unser relativ kleines Team sehr gut gearbeitet.

Beantwortet am 23/08/2008 um 13:58
quelle vom benutzer

stimmen
0

Es gibt eine Befehlszeile mysql-Diff - Tool , das Datenbankschema vergleicht, in dem Schema eine Live - Datenbank oder SQL - Skript auf der Festplatte sein kann. Es ist gut für die meisten Schemamigrationsaufgaben.

Beantwortet am 04/11/2009 um 20:43
quelle vom benutzer

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more