Mechanismen zum Verfolgen von DB-Schemaänderungen
Was sind die besten Methoden für die überwachung und/oder Automatisierung von DB-schema ändert? Unser team verwendet Subversion für die Versionskontrolle und das haben wir in der Lage, zu automatisieren einige unserer Aufgaben dieser Art (schieben baut bis zu einem staging-server, die Bereitstellung von getesteten code zu einem Produktions-server), aber wir sind immer noch so machen Datenbank-updates manuell. Ich möchte zu finden, oder erstellen Sie eine Lösung, die es uns erlaubt, effizient zu arbeiten auf Servern mit verschiedenen Umgebungen, während Sie weiterhin zu verwenden Subversion als backend durch die code-und DB-updates geschoben werden, um auf verschiedenen Servern.
Viele beliebte software-Pakete beinhalten auto-update-Skripte, die erkennen, DB-version und die notwendigen änderungen. Ist dies der beste Weg, dies zu tun auch in einem größeren Maßstab (die über mehrere Projekte und manchmal mehrere Umgebungen und Sprachen)? Wenn dem so ist, ist es bereits code gibt, die den Prozess vereinfacht, oder ist es am besten, einfach zu Rollen, unsere eigene Lösung? Hat jemand etwas ähnliches umgesetzt, vor und integrierte es in Subversion mit post-commit-hooks, oder ist das eine schlechte Idee?
Während die Lösung unterstützt mehrere Plattformen wäre wünschenswert, wir müssen auf jeden Fall unterstützt der Linux/Apache/MySQL/PHP-stack, wie die Mehrheit der unsere Arbeit auf dieser Plattform.
InformationsquelleAutor der Frage pix0r | 2008-08-04
Du musst angemeldet sein, um einen Kommentar abzugeben.
In der Rails-Welt, gibt es das Konzept der Migrationen, scripts, in dem änderungen an der Datenbank vorgenommen werden, in Ruby statt einer Datenbank-spezifischen Geschmack von SQL. Ihre Ruby-migration-code endet umgewandelt werden, in die DDL-speziell zu Ihrer aktuellen Datenbank, das macht die Wechsel-Datenbank-Plattformen sehr einfach.
Für jede änderung, die Sie an die Datenbank, schreiben Sie eine neue migration. Migrationen haben in der Regel zwei Methoden: eine "up" - Methode, in dem die änderungen angewendet werden, und eine "down" - Methode, in der die änderungen rückgängig gemacht werden. Einem einzigen Befehl bringt die Datenbank auf den neuesten Stand, und kann auch verwendet werden, um die Datenbank auf eine bestimmte version des Schemas. In Rails Migrationen sind gehalten, in Ihrem eigenen Verzeichnis in das Projekt-Verzeichnis und überprüft werden, in der Versionskontrolle genau wie jedes andere Projekt-code.
Das Oracle-Handbuch zu Rails Migrationen deckt Migrationen ganz gut.
Entwickler, die mit anderen Sprachen angeschaut haben Migrationen und implementiert haben, in Ihrer eigenen Sprache-spezifische Versionen. Ich kenne Ruckusingein PHP-Migrationen-system, das modelliert wird nach der Schiene " Migrationen; es könnte das sein, was du bist suchen für.
InformationsquelleAutor der Antwort Joey deVilla
Verwenden wir etwas ähnliches wie bcwoord, um unsere Datenbank-schemata synchronisiert über 5 verschiedene Anlagen (Produktions -, staging-und ein paar development-Installationen), und unterstützt in der version Kontrolle, und es funktioniert ziemlich gut. Ich werde aufwändigen etwas:
Synchronisieren Sie die Struktur der Datenbank, wir haben ein einziges Skript, update.php und eine Reihe von Dateien mit der Nummer 1.sql-2.sql-3.sql, etc. Das Skript verwendet eine extra Tabelle speichern, um die aktuelle Versionsnummer der Datenbank. Die N. sql-Dateien sind von hand gefertigt, um von version (N-1) - version N der Datenbank.
Können Sie verwendet werden, um Tabellen hinzufügen, Spalten hinzufügen, migrieren von Daten von einer alten auf eine neue Spalte-format, dann legen Sie die Spalte, legen Sie die "master" - Daten-Zeilen wie Benutzer-Typen, etc. Im Prinzip kann es alles tun, und mit der richtigen Daten-migration von Skripts, die Sie nie Daten verlieren.
Update-Skript funktioniert wie folgt:
Geht alles in die Quellcodeverwaltung, und jede Anlage hat ein Skript zum aktualisieren auf die neueste version mit einem einzigen Skript-Ausführung (Berufung update.php mit der entsprechenden Datenbank, Passwort etc.). Wir SVN update staging-und Produktion-Umgebungen über ein Skript, das automatisch die Datenbank-update-Skript, also ein code-update kommt mit der notwendigen Datenbank-updates.
Wir können auch das gleiche Skript zu erstellen, die gesamte Datenbank von Grund auf neu, sondern nur löschen und neu erstellen der Datenbank und führen Sie anschließend das Skript, welches komplett Auffüllen der Datenbank. Wir können auch das Skript zum Auffüllen einer leeren Datenbank für den automatisierten Test.
Dauerte es nur ein paar Stunden, bis dieses system einzurichten, es ist konzeptionell einfach und jeder bekommt die version Nummerierungsschema, und es ist von unschätzbarem Wert in der Fähigkeit, vorwärts zu bewegen und sich entwickelnde Datenbank-design, die zimmerreserviereung, ohne das zu kommunizieren, oder manuell führen Sie die änderungen auf alle Datenbanken.
Vorsicht beim einfügen von Abfragen im phpMyAdmin aber! Diejenigen, die Abfragen gehören in der Regel der name der Datenbank, die Sie definitiv nicht wollen, da Sie brechen Ihre Skripte! So etwas wie CREATE TABLE
mydb
.newtable
(...) schlägt fehl, wenn die Datenbank auf dem system ist nicht namens mydb. Wir erstellt eine pre-Author SVN-hook, der wird verweigern .sql-Dateien mit denmydb
string, das ist ein Sicheres Zeichen, dass jemand copy/Paste von phpMyAdmin ohne angemessene überprüfung.InformationsquelleAutor der Antwort rix0rrr
Mein team Skripts aus alle Datenbank-änderungen, und verpflichtet sich, diese Skripte zu SVN, zusammen mit jeder neuen Version der Anwendung. Dies ermöglicht die inkrementelle änderungen von der Datenbank, ohne Daten.
Gehen von einem release auf das nächste, die Sie gerade brauchen, um ausführen die Reihe von Skripts ändern, und Ihre Datenbank up-to-date, und du hast noch alle deine Daten. Es ist vielleicht nicht die einfachste Methode, aber es ist definitiv effektiv.
InformationsquelleAutor der Antwort Brandon Wood
Die Frage ist hier wirklich, macht es einfach für Entwickler, Skript, Ihre eigenen lokalen änderungen in die Quellcodeverwaltung zu teilen mit dem team. Ich habe konfrontiert, die dieses problem für viele Jahre, und wurde inspiriert durch die Funktionalität von Visual Studio for Database professionals. Wenn Sie möchten, eine open-source-tool mit dem gleichen Funktionsumfang, versuchen Sie dies: http://dbsourcetools.codeplex.com/
Spaß haben,
- Nathan.
InformationsquelleAutor der Antwort
Wenn Sie noch auf der Suche nach Lösungen : wir schlagen ein tool namens neXtep-designer. Es ist eine Datenbank-Entwicklungsumgebung mit dem Sie Ihre gesamte Datenbank unter versions-Kontrolle. Sie arbeiten auf eine versionierte repository, in dem jede änderung nachverfolgt werden kann.
Wenn Sie Sie brauchen, zu release ein update, können Sie verpflichten, Ihre Komponenten und das Produkt generiert automatisch die SQL upgrade-script aus der vorherigen version. Natürlich generieren Sie mit dieser SQL-von jedem 2 Versionen.
Dann haben Sie viele Möglichkeiten : Sie können diese Skripte und setzen Sie Sie in Ihrem SVN-mit Ihrem app-code so, dass es dann bereitgestellt werden, die von Ihrem bestehenden Mechanismus. Eine weitere option ist die Nutzung der Lieferung Mechanismus der neXtep : Skripte exportiert werden in ein so genanntes "Lieferumfang" (SQL-Skripts + XML-Deskriptor), und ein Installateur kann verstehen, dieses Paket und installieren Sie es zu einem Ziel-server bei gleichzeitiger Gewährleistung strcutural Konsistenz, Abhängigkeitsprüfung, Registrierung der installierten version, etc.
Das Produkt ist mit der GPL und basiert auf Eclipse läuft also auf Linux, Mac und windows. Es unterstützt auch Oracle -, Mysql-und Postgresql im moment (DB2-Unterstützung ist auf dem Weg). Haben Sie einen Blick auf die wiki-wo finden Sie mehr detaillierte Informationen :
http://www.nextep-softwares.com/wiki
InformationsquelleAutor der Antwort Christophe Fondacci
Dump-schema in eine Datei und fügen Sie es zur Quellcodeverwaltung. Dann eine einfache diff wird Ihnen zeigen, was sich geändert hat.
InformationsquelleAutor der Antwort deadprogrammer
Scott Ambler produziert eine große Reihe von Artikeln (und co-Autor von einem buchen) auf Datenbank-refactoring, mit der Idee, dass Sie sollten im wesentlichen gelten TDD-Prinzipien und Praktiken für die Wartung Ihrer schema. Richten Sie eine Reihe von Struktur-und seed-Daten unit-tests für die Datenbank. Dann, bevor Sie etwas ändern, Sie ändern/schreiben von tests, um die änderung widerzuspiegeln.
Wir haben das getan, für eine Weile nun und es scheint zu funktionieren. Wir schrieben code zu generieren basic-Spalte-name und Datentyp prüft in einem unit-Test-suite. Wir können, erneut führen Sie die tests jederzeit sicher, dass die Datenbank im SVN-checkout-entspricht der live-db in der Anwendung tatsächlich ausgeführt wird.
Wie sich herausstellt, haben die Entwickler auch manchmal zwicken Ihre sandbox-Datenbank und-Vernachlässigung zur Aktualisierung der schema-Datei im SVN. Der code hängt dann davon ab, eine db zu ändern, wurden noch nicht überprüft. Diese Art von Fehler kann maddeningly schwer zu fassen, aber der test suite wird es abholen sofort. Dies ist besonders schön, wenn Sie es eingebaut in einen größeren Continuous Integration plan.
InformationsquelleAutor der Antwort Sam McAfee
Es ist ein bisschen low-tech, und es könnte eine bessere Lösung gibt, aber Sie könnte nur speichern Sie Ihr schema in einer SQL-Skript, welches ausgeführt werden kann, um die Datenbank zu erstellen. Ich denke, man kann einen Befehl ausführen, generieren Sie das Skript, aber ich weiß den Befehl leider.
Dann Begehen Sie das Skript in die Quellcodeverwaltung zusammen mit dem code, der funktioniert. Wenn Sie brauchen, um das schema ändern, das zusammen mit dem code, das Skript geprüft werden kann, zusammen mit dem code, der erfordert, daß das geänderte schema. Dann, diffs auf das script zeigen diffs auf schema-änderungen.
Mit diesem Skript könnten Sie integrieren es mit DBUnit oder irgendeine Art von build-Skript, so dass es scheint, es könnte passen mit Ihrem bereits automatisierte Prozesse.
InformationsquelleAutor der Antwort Mike Stone
Wenn Sie C# verwenden, müssen Sie einen Blick auf Subsonic, eine sehr nützliche ORM-tool, sondern wird auch erzeugt sql-script neu erstellt, Ihr Schema und\oder Daten. Diese Skripte können dann gesteckt werden in die Quellcodeverwaltung ein.
http://subsonicproject.com/
InformationsquelleAutor der Antwort Dan
K. Scott Allen hat eine anständige Artikel oder zwei auf die Versionierung von Schemas, welche mit der inkrementellen update-scripts/Migration-Konzept verwiesen, die in anderen Antworten hier; siehe http://odetocode.com/Blogs/scott/archive/2008/01/31/11710.aspx.
InformationsquelleAutor der Antwort Rob
Habe ich die folgende Datenbank Projektstruktur in Visual Studio für mehrere Projekte und es funktionierte ziemlich gut:
Datenbank
Unser build-system aktualisiert dann die Datenbank von einer version auf die nächste durch ausführen des Skripts in der folgenden Reihenfolge:
Jeder Entwickler checkt seine änderungen für einen bestimmten bug/feature indem Ihr code wird an das Ende jeder Datei. Einmal eine major-version abgeschlossen ist und verzweigt in die source-control, die Inhalte der .sql-Dateien in die Skripts Ändern, die Ordner werden gelöscht.
InformationsquelleAutor der Antwort tbreffni
Verwenden wir eine sehr einfache, aber dennoch effektive Lösung.
Für neue Installationen, wir haben Metadaten.sql-Datei in das repository hält alle DB-schema, dann in den build-Prozess, den wir verwenden diese Datei, um die Datenbank zu erzeugen.
Für updates, fügen wir die updates in die software hartcodiert. Wir halten es hardcoded, da wir keine Probleme lösen, bevor es wirklich ein problem IST, und diese Art der Sache nicht beweisen, um ein problem so weit.
So, in unserer software haben wir so etwas wie dieses:
RegisterUpgrade(1, 'ALTER TABLE XX ADD XY CHAR(1) NOT NULL;');
Dieser code wird geprüft, ob die Datenbank in der version 1 (die in einer Tabelle abgelegt, automatisch erstellt), wenn es veraltet ist, dann wird der Befehl ausgeführt wird.
Aktualisieren Sie die Metadaten.sql in das repository, führen wir diese upgrades vor Ort und dann extrahieren Sie die vollständigen Datenbank-Metadaten.
Das einzige, was passiert, jeder so oft, wird vergessen, Begehen die Metadaten.sql, aber dies ist nicht ein großes problem, weil es einfach zu testen, die auf den build-Prozess und auch das einzige, was passieren könnte, ist, um eine neue Installation mit einer veralteten Datenbank und aktualisiert Sie bei der ersten Verwendung.
Haben auch wir unterstützen keine Politik, aber es ist design, wenn etwas kaputt geht auf ein update, wir wieder die Vorherige version und fix das update, bevor Sie es erneut versuchen.
InformationsquelleAutor der Antwort Fabio Gomes
Erstelle ich Ordner nach dem build-Versionen und setzen Sie upgrade-und downgrade-Skripte drin. Sie können beispielsweise die folgenden Ordner vorhanden: 1.0.0, 1.0.1 und 1.0.2. Jedes enthält das Skript, das Ihnen erlaubt, um ein upgrade oder downgrade Ihrer Datenbank zwischen den Versionen.
Sollte ein client oder Kunden rufen Sie bei einem problem mit der version 1.0.1 und 1.0.2, bringen Sie die Datenbank zurück, um seine-version wird kein problem sein.
Erstellen Sie In der Datenbank eine Tabelle namens "schema", wo Sie in der aktuellen version der Datenbank. Dann ein Programm schreiben, das ein upgrade oder downgrade Ihre Datenbank für Sie ist einfach.
Genau wie Joey gesagt, wenn Sie in einer Rails-Welt, Migrationen verwenden. 🙂
InformationsquelleAutor der Antwort Louis Salin
Für mein Aktuelles PHP-Projekt verwenden wir die Idee der Schienen-Migrationen und wir haben ein Migrationen Verzeichnis, in dem wir verhindern, dass Dateien Titel "migration_XX.sql" wobei XX die Nummer der migration. Derzeit sind diese Dateien von hand angelegt, da updates vorgenommen werden, aber Ihre Erstellung konnte leicht geändert werden.
Dann haben wir ein Skript namens "Migration_watcher", die, wie wir in der pre-alpha läuft momentan auf jeder Seite laden und prüft, ob es eine neue migration_XX.sql-Datei, wo " XX " ist größer als die aktuelle migration version. Wenn dem so es läuft alles migration_XX.sql-Dateien bis zu der größten Anzahl der auf die Datenbank und voila! schema-änderungen sind automatisiert.
Wenn Sie die Fähigkeit erfordern, um wieder das system erfordern würde eine Menge tweaken, aber es ist einfach und arbeitet schon sehr gut für unsere relativ kleinen team so weit ist.
InformationsquelleAutor der Antwort Eric Scrivner
Ich würde empfehlen, mit Ant (cross-Plattform) für die "scripting" - Seite (da kann es praktisch sprechen alle db heraus über jdbc) und Subversion für das Quell-repository.
Ant hilft, Sie zu "sichern" Ihre db auf lokale Dateien, bevor Sie änderungen vornehmen.
1. backup der bestehenden db-schema-Datei über die Ameise
2. version control Subversion repository via Ant
3. senden von sql-Anweisungen auf db per Ameise
InformationsquelleAutor der Antwort Cruz
Toad for MySQL hat eine Funktion namens schema vergleichen, das Ihnen erlaubt, zu synchronisieren, 2 Datenbanken. Es ist das beste Werkzeug, das ich verwendet habe, so weit.
InformationsquelleAutor der Antwort Petah
IMHO Migrationen haben ein riesiges problem:
Upgrade von einer version zur anderen funktioniert, sondern tun, eine frische Installation von einer bestimmten version könnte ewig dauern, wenn Sie haben Hunderte von Tischen und eine lange Geschichte der änderungen (wie wir tun).
Läuft die ganze Geschichte des deltas seit der baseline bis zur aktuellen version (für Hunderte von Kunden-Datenbanken) könnten eine sehr lange Zeit dauern.
InformationsquelleAutor der Antwort Edson Medina
Ich mag die Art, wie Yii Griffe Datenbank-Migrationen. Eine migration ist im Prinzip ein PHP-Skript implementieren
CDbMigration
.CDbMigration
definiert eineup
Methode, enthält der Migrations-Logik. Es ist auch möglich, implementieren einedown
Methode zur Unterstützung der Umkehr der migration. AlternativsafeUp
odersafeDown
können verwendet werden, um sicherzustellen, dass die migration erfolgt im Rahmen einer Transaktion.Yii ' s Kommandozeilen-Werkzeug
yiic
enthält Unterstützung für das erstellen und ausführen von Migrationen. Migrationen können angewendet werden oder Umgekehrt, entweder einzeln oder in einem batch. Erstellen eines Migrations-Ergebnisse in code für eine PHP-Klasse dieCDbMigration
eindeutigen Namen basierend auf einem Zeitstempel und migration name, den der Benutzer angegeben. Alle Migrationen, die zuvor für die Datenbank gespeichert sind, in eine migration Tabelle.Weitere Informationen finden Sie in der Datenbank-Migration Artikel aus dem Handbuch.
InformationsquelleAutor der Antwort Ton van den Heuvel
Versuchen db-bereitstellen - in Erster Linie ein Java-tool, arbeitet aber mit php als gut.
InformationsquelleAutor der Antwort cwash
Es ist ein command-line mysql-diff tool vergleicht Datenbank-schemas, die in dem schema kann eine live-Datenbank oder einen SQL-script auf der Festplatte. Es ist gut für die meisten schema-Migrations-Aufgaben.
InformationsquelleAutor der Antwort stepancheg