Mechanismen zum Verfolgen von DB-Schemaänderungen [geschlossen]

  • Was sind die besten Methoden zum Verfolgen und / oder Automatisieren von DB-Schemaänderungen? Unser Team verwendet Subversion für die Versionskontrolle. Wir konnten einige unserer Aufgaben auf diese Weise automatisieren (Builds auf einen Staging-Server übertragen, getesteten Code auf einem Produktionsserver bereitstellen), aber Datenbankaktualisierungen werden immer noch manuell durchgeführt. Ich möchte eine Lösung finden oder erstellen, mit der wir effizient über Server mit unterschiedlichen Umgebungen hinweg arbeiten können und Subversion weiterhin als Backend verwenden, durch das Code- und Datenbankaktualisierungen auf verschiedene Server übertragen werden.

    Viele gängige Softwarepakete enthalten Auto-Update-Skripts, die die DB-Version erkennen und die erforderlichen Änderungen vornehmen. Ist dies der beste Weg, dies auch in größerem Maßstab (über mehrere Projekte und manchmal mehrere Umgebungen und Sprachen hinweg) zu tun? Wenn ja, gibt es einen vorhandenen Code, der den Prozess vereinfacht, oder ist es am besten, nur unsere eigene Lösung zu rollen? Hat jemand zuvor etwas Ähnliches implementiert und in Subversion Post-Commit-Hooks integriert, oder ist dies eine schlechte Idee?

    Eine Lösung, die mehrere Plattformen unterstützt, wäre zwar vorzuziehen, aber wir brauchen sie auf jeden Fall Unterstützung des Linux / Apache / MySQL / PHP-Stacks, da sich der Großteil unserer Arbeit auf dieser Plattform befindet.

    29 August 2008
    Polsonby
20 answers
  • In der Rails-Welt gibt es das Konzept von Migrationen, Skripts, bei denen Änderungen an der Datenbank in Ruby vorgenommen werden und nicht an einer datenbankspezifischen Variante von SQL. Ihr Ruby-Migrationscode wird in eine DDL konvertiert, die für Ihre aktuelle Datenbank spezifisch ist. Dadurch wird das Wechseln von Datenbankplattformen sehr einfach.

    Für jede Änderung, die Sie an der Datenbank vornehmen, schreiben Sie eine neue Migration. Bei Migrationen gibt es normalerweise zwei Methoden: eine Up-Methode, in der die Änderungen angewendet werden, und eine Down-Methode, bei der die Änderungen rückgängig gemacht werden. Ein einzelner Befehl aktualisiert die Datenbank und kann auch dazu verwendet werden, die Datenbank auf eine bestimmte Version des Schemas zu bringen. In Rails werden Migrationen in einem eigenen Verzeichnis im Projektverzeichnis abgelegt und wie alle anderen Projektcodes in der Versionskontrolle überprüft.

    Dieser Oracle-Leitfaden für Rails-Migrationen behandelt Migrationen recht gut

    Entwickler, die andere Sprachen verwenden, haben sich Migrationen angesehen und ihre eigenen sprachspezifischen Versionen implementiert. Ich kenne Ruckusing , ein PHP-Migrationssystem das ist den Migrationen von Rails nachempfunden; Es könnte sein, wonach Sie suchen.

    02 May 2016
    AndreasJoey deVilla
  • Wir verwenden etwas Ähnliches wie bcwoord, um unser Datenbankschema in 5 verschiedenen Installationen (Produktion, Staging und einige Entwicklungsinstallationen) synchron zu halten und in der Versionskontrolle zu sichern. Das funktioniert ziemlich gut. Ich werde ein wenig näher darauf eingehen:


    Um die Datenbankstruktur zu synchronisieren, haben wir ein einzelnes Skript, update.php und eine Reihe von Dateien mit der Nummer 1.sql, 2.sql, 3.sql usw. Das Skript verwendet eine zusätzliche Tabelle, um die aktuelle Versionsnummer der Datenbank zu speichern. Die N.sql-Dateien werden von Hand erstellt, um von Version (N-1) zur Version N der Datenbank zu gelangen.

    Sie können dazu verwendet werden, Tabellen hinzuzufügen, Spalten hinzuzufügen, Migrieren Sie Daten von einem alten in ein neues Spaltenformat, löschen Sie dann die Spalte, fügen Sie "master" -Datenzeilen ein, z. B. Benutzertypen usw. Grundsätzlich können Sie alles tun, und mit den richtigen Datenmigrationsskripts verlieren Sie niemals Daten.

    Das Aktualisierungsskript funktioniert folgendermaßen:

    • Stellen Sie eine Verbindung zur Datenbank her.
    • Erstellen Sie eine Sicherungskopie der aktuellen Datenbank (da sich nicht richtig verhält) [mysqldump].
    • Erstellen Sie eine Buchhaltungstabelle (_meta). Wenn es nicht existiert.
    • Liest die aktuelle VERSION aus der _meta-Tabelle. Nehmen Sie an, dass 0 nicht gefunden wird.
    • Führen Sie sie für alle .sql-Dateien, die höher als VERSION sind, in der folgenden Reihenfolge aus.
    • Wenn eine der Dateien zu einem Fehler führte: roll zurück zur Sicherung
    • Andernfalls aktualisieren Sie die Version in der Buchhaltungstabelle auf die höchste ausgeführte .sql-Datei.

    Alles geht in die Quellcodeverwaltung über, und zu jeder Installation gehört ein Skript, das mit einer einzigen Skriptausführung auf die neueste Version aktualisiert werden kann (Aufruf von update.php mit dem richtigen Datenbankkennwort usw.). Wir aktualisieren SVN-Staging- und Produktionsumgebungen über ein Skript, das das Datenbank-Aktualisierungsskript automatisch aufruft, sodass eine Codeaktualisierung mit den erforderlichen Datenbankaktualisierungen geliefert wird.

    Wir können dasselbe Skript auch verwenden Erstellen Sie die gesamte Datenbank neu

    05 December 2013
    Dinah
  • Mein Team schreibt alle Datenbankänderungen aus und überträgt diese mit jeder Version der Anwendung an SVN. Dadurch können inkrementelle Änderungen der Datenbank vorgenommen werden, ohne dass Daten verloren gehen.

    Um von einer Version zur nächsten zu wechseln, müssen Sie nur die Änderungsskripts ausführen, und Ihre Datenbank ist auf dem neuesten Stand, und Sie haben noch alles deine Daten. Es ist vielleicht nicht die einfachste Methode, aber sie ist definitiv effektiv.

    05 August 2008
    Brandon Wood
  • Wenn Sie noch nach Lösungen suchen, schlagen wir ein Tool namens neXtep designer vor. Es ist eine Datenbankentwicklungsumgebung, mit der Sie Ihre gesamte Datenbank unter Versionskontrolle stellen können. Sie arbeiten an einem versionsgesteuerten Repository, in dem jede Änderung verfolgt werden kann.

    Wenn Sie ein Update freigeben müssen, können Sie Ihre Komponenten festschreiben, und das Produkt generiert automatisch das SQL-Upgrade-Skript aus der vorherigen Version. Natürlich können Sie dieses SQL aus zwei beliebigen Versionen generieren.

    Dann haben Sie viele Möglichkeiten: Sie können diese Skripte nehmen und mit Ihrem App-Code in Ihren SVN einfügen, so dass dies möglich ist Wird von Ihrem vorhandenen Mechanismus bereitgestellt. Eine weitere Option ist die Verwendung des Übermittlungsmechanismus von neXtep: Skripts werden in ein sogenanntes "Übermittlungspaket" (SQL-Skripts + XML-Deskriptor) exportiert. Ein Installationsprogramm kann dieses Paket verstehen und auf einem Zielserver bereitstellen, wobei gleichzeitig die Abhängigkeit von der Konsistenz von Abschnitten sichergestellt wird prüfen, installierte Version registrieren, etc.

    Das Produkt ist GPL und basiert auf Eclipse, sodass es auf Linux, Mac und Windows ausgeführt werden kann. Derzeit werden auch Oracle, Mysql und Postgresql unterstützt (DB2-Unterstützung ist unterwegs). Schauen Sie sich das Wiki an, in dem Sie weitere Informationen finden: http: //www.nextep- softwares.com/wiki

    25 October 2010
    Christophe Fondacci
  • Das Problem hier macht es Entwicklern wirklich leicht, eigene lokale Änderungen in die Quellcodeverwaltung zu schreiben, um sie mit dem Team zu teilen. Ich habe dieses Problem seit vielen Jahren angetreten und wurde von der Funktionalität von Visual Studio for Database Professionals inspiriert. Wenn Sie ein Open-Source-Tool mit denselben Funktionen wünschen, versuchen Sie Folgendes: http://dbsourcetools.codeplex.com/ Viel Spaß, - Nathan.

    07 July 2009
  • Legen Sie Ihr Schema in einer Datei ab und fügen Sie es der Quellcodeverwaltung hinzu. Dann zeigt ein einfacher Unterschied, was sich geändert hat.

    06 August 2008
    deadprogrammer
  • Scott Ambler produziert eine große Reihe von Artikeln (und hat gemeinsam ein Buch ) über das Datenbank-Refactoring mit der Idee, dass Sie grundsätzlich TDD-Prinzipien und -Praktiken zur Verwaltung Ihres Schemas anwenden sollten. Sie richten eine Reihe von Struktur- und Seed-Data-Unit-Tests für die Datenbank ein. Bevor Sie irgendetwas ändern, modifizieren / schreiben Sie Tests, um diese Änderung widerzuspiegeln.

    Wir machen das jetzt schon eine Weile und es scheint zu funktionieren. Wir haben Code geschrieben, um grundlegende Spaltennamen- und Datentypprüfungen in einer Einheitstestsuite zu generieren. Wir können diese Tests jederzeit wiederholen, um zu überprüfen, ob die Datenbank in der SVN-Kasse mit der Live-Datenbank übereinstimmt, in der die Anwendung tatsächlich ausgeführt wird.

    Wie sich herausstellt, optimieren Entwickler auch manchmal ihre Sandbox-Datenbank und vernachlässigen die Aktualisierung der Schemadatei in SVN. Der Code hängt dann von einer Db-Änderung ab, die nicht eingecheckt wurde. Diese Art von Fehler kann verblüffend schwer zu bezeichnen sein, aber die Testsuite wird den Fehler sofort beheben. Dies ist besonders dann von Vorteil, wenn Sie es in einen größeren Continuous Integration-Plan eingebaut haben.

    29 August 2008
    Sam McAfee
  • Es ist ein bisschen technisch ausgereift und es gibt vielleicht eine bessere Lösung, aber Sie können Ihr Schema einfach in einem SQL-Skript speichern, das zur Erstellung der Datenbank ausgeführt werden kann. Ich denke, Sie können einen Befehl ausführen, um dieses Skript zu generieren, aber ich kenne den Befehl leider nicht.

    Dann übergeben Sie das Skript zusammen mit dem Code, der funktioniert, in der Quellcodeverwaltung es. Wenn Sie das Schema zusammen mit dem Code ändern müssen, kann das Skript zusammen mit dem Code eingecheckt werden, der das geänderte Schema erfordert. Die Unterschiede im Skript weisen dann auf Unterschiede bei Schemaänderungen hin.

    Mit diesem Skript könnten Sie es mit DBUnit oder einer Art Build-Skript integrieren, sodass es so aussieht, als würde es passen mit Ihren bereits automatisierten Prozessen.

    05 August 2008
    Mike Stone
  • Wenn Sie C # verwenden, werfen Sie einen Blick auf Subsonic, ein sehr nützliches ORM-Tool, das jedoch auch ein SQL-Skript generiert, um Ihr Schema und \ oder Ihre Daten neu zu erstellen. Diese Skripte können dann in die Quellcodeverwaltung eingefügt werden.

    http://subsonicproject.com /

    05 August 2008
    Dan
  • K. Scott Allen hat ein oder zwei anständige Artikel zur Schemaversionierung, die das inkrementelle Update-Skript / Migrationskonzept verwenden, auf das in anderen Antworten hier verwiesen wird. http://odetocode.com/Blogs/scott/archive/ 2008/01/31 / 11710.aspx .

    29 August 2008
    Rob