Wie versionieren Sie Ihr Datenbankschema? [geschlossen]

128

Wie bereiten Sie Ihre SQL-Deltas vor? Speichern Sie jedes schemaänderende SQL manuell in einem Delta-Ordner oder haben Sie eine Art automatisierten Differenzierungsprozess?

Ich interessiere mich für Konventionen zur Versionierung des Datenbankschemas zusammen mit dem Quellcode. Vielleicht ein Pre-Commit-Hook, der das Schema unterscheidet?

Welche Optionen für unterschiedliche Deltas gibt es neben DbDeploy ?

BEARBEITEN: Wenn ich die Antworten sehe, möchte ich klarstellen, dass ich mit dem Standardschema für die Ausführung einer Datenbankmigration mit Deltas vertraut bin. Meine Frage ist, die Deltas selbst zu erstellen, vorzugsweise automatisch.

Die Versionierung gilt auch für PHP und MySQL, wenn es einen Unterschied macht. (Keine Ruby-Lösungen bitte).

Eran Galperin
quelle
Ich verwende schemasync , um einen Patch (und ein Rollback-Skript) zu generieren. Diese werden dem SVN-Repo hinzugefügt. Es ist nicht perfekt, aber es funktioniert gut für mich. Außerdem ist das Bereitstellen von Schemaänderungen mit schemasync
Jay Sidri
Dieser Link erscheint leer - existiert dieser noch?
Jocull
Sieht aus wie es bewegt ist: github.com/mmatuson/SchemaSync
Jay Sidri

Antworten:

61

Sehen

Gibt es ein Versionskontrollsystem für Änderungen der Datenbankstruktur?

Wie versioniere ich meine MS SQL-Datenbank in SVN?

und Jeffs Artikel

Holen Sie sich Ihre Datenbank unter Versionskontrolle

Ich fühle deinen Schmerz und ich wünschte, es gäbe eine bessere Antwort. Dies könnte näher an dem liegen, wonach Sie gesucht haben.

Mechanismen zum Verfolgen von DB-Schemaänderungen

Im Allgemeinen habe ich das Gefühl, dass es keine adäquate, akzeptierte Lösung dafür gibt, und ich rolle meine eigene in diesem Bereich.

Harpo
quelle
Wie Sie meiner Frage entnehmen können, ist mir das Konzept der Deltas bekannt. Meine Frage betrifft Konventionen zum Erstellen dieser, vorzugsweise automatisch.
Eran Galperin
Ich denke, ich werde dann meine eigenen rollen ...;)
Eran Galperin
Haben Sie DBDiff ausprobiert: github.com/DBDiff/DBDiff ? Es passt gut zu dem, was Sie für @EranGalperin suchen, da es automatisierte Migrationen für Schema und Daten in SQL durchführt. Offenlegung Ich bin der Entwickler dahinter!
Jasdeep Khalsa
4

Wenn Sie noch nach Optionen suchen: Schauen Sie sich neXtep Designer an. Es ist eine kostenlose GPL-Datenbankentwicklungsumgebung, die auf den Konzepten der Versionskontrolle basiert. In der Umgebung arbeiten Sie immer mit versionierten Entitäten und können sich auf die Entwicklung des Datenmodells konzentrieren. Sobald eine Veröffentlichung abgeschlossen ist, kann die am Versionskontrollsystem angeschlossene SQL-Generierungs-Engine jedes benötigte Delta zwischen zwei Versionen generieren und bietet Ihnen bei Bedarf einen Bereitstellungsmechanismus.

Unter anderem können Sie Ihre Datenbank während der Entwicklung synchronisieren und rückwärts synchronisieren, Datenmodelldiagramme erstellen, Ihre Datenbank mit integrierten SQL-Clients abfragen usw.

Weitere Informationen finden Sie im Wiki: http://www.nextep-softwares.com/wiki

Es unterstützt derzeit Oracle, MySql und PostgreSql und ist in Java, sodass das Produkt unter Windows, Linux und Mac ausgeführt werden kann.

Christophe Fondacci
quelle
3

Ich stelle sicher, dass Schemaänderungen immer additiv sind. Ich lasse also keine Spalten und Tabellen fallen, da dies die Daten zappen würde und später nicht zurückgesetzt werden kann. Auf diese Weise kann der Code, der die Datenbank verwendet, zurückgesetzt werden, ohne dass Daten oder Funktionen verloren gehen.

Ich habe ein Migrationsskript, das Anweisungen enthält, die Tabellen und Spalten erstellen, wenn sie noch nicht vorhanden sind, und sie mit Daten füllen.

Das Migrationsskript wird immer dann ausgeführt, wenn der Produktionscode aktualisiert wird und nach Neuinstallationen.

Wenn ich etwas löschen möchte, entferne ich es aus dem Datenbankinstallationsskript und dem Migrationsskript, damit diese veralteten Schemaelemente bei Neuinstallationen schrittweise auslaufen. Mit dem Nachteil, dass Neuinstallationen vor der Installation nicht auf eine ältere Version heruntergestuft werden können.

Und natürlich führe ich DDLs über diese Skripte aus und niemals direkt in der Datenbank, um die Dinge synchron zu halten.

Calmarius
quelle
2

Ich schaffe keine Deltas. Ich nehme Änderungen an einer Master-Datenbank vor und habe ein Tool, das ein XML-basiertes Build-Skript basierend auf der Master-Datenbank erstellt.

Wenn es darum geht, eine vorhandene Datenbank zu aktualisieren, habe ich ein Programm, das das XML-basierte Build-Skript verwendet, um eine neue Datenbank und die nackten Tabellen zu erstellen. Ich kopiere dann die Daten aus der alten Datenbank mit INSERT INTO x SELECT FROM y und wende dann alle Indizes, Einschränkungen und Trigger an.

Neue Tabellen, neue Spalten und gelöschte Spalten werden automatisch behandelt. Mit ein paar kleinen Tricks zum Anpassen der Kopierroutine kann ich Spaltenumbenennungen, Änderungen des Spaltentyps und andere grundlegende Umgestaltungen vornehmen.

Ich würde diese Lösung nicht für eine Datenbank mit einer großen Datenmenge empfehlen, aber ich aktualisiere regelmäßig eine Datenbank mit mehr als 1 GB und 400 Tabellen.

Darrel Miller
quelle
Dies klingt etwas umständlich, insbesondere wenn es sich um mehrere Entwickler handelt. Auch der Build-Prozess klingt anspruchsvoll und ich möchte so einfach wie möglich sein.
Eran Galperin
Ich gebe zu, es hat eine Weile gedauert, bis es richtig war, aber jetzt ist es fast kein Aufwand mehr, ein Upgrade vorzubereiten und noch weniger, um eines durchzuführen. Außerdem gefällt mir, dass ich vorläufige Hotfix-Änderungen vornehmen kann und dies keine Auswirkungen auf das Upgrade-Verfahren hat. Jedes Upgrade ist eine neue Datenbank.
Darrel Miller
2

Sie haben nicht erwähnt, welches RDBMS Sie verwenden, aber wenn es sich um MS SQL Server handelt, war der SQL-Vergleich von Red-Gate für uns bei der Erstellung von Deltas zwischen Skripten zur Objekterstellung unverzichtbar.

Jalbert
quelle
1
Es ist für MySQL, ich habe meine Frage aktualisiert
Eran Galperin
2

Ich bin nicht derjenige, der mein eigenes Horn betätigt, aber ich habe eine interne Web-App entwickelt, um Änderungen an Datenbankschemata zu verfolgen und versionierte Update-Skripte zu erstellen.

Dieses Tool heißt Brazil und ist jetzt Open Source unter einer MIT-Lizenz. Brasilien basiert auf Ruby / Ruby on Rails und unterstützt die Bereitstellung von Änderungen in jeder von Ruby DBI unterstützten Datenbank (MySQL, ODBC, Oracle, Postgres, SQLite).

Die Unterstützung für die Versionskontrolle der Update-Skripte ist geplant.

Joakim Bodin
quelle
Brasilien sieht ziemlich gut aus, schade, dass ich hauptsächlich PHP benutze. Haben Sie jemals darüber nachgedacht, das System zu portieren?
Eran Galperin
1

Wir exportieren die Daten in ein portables Format (mithilfe unserer Toolchain) und importieren sie dann in ein neues Schema. Delta SQL ist nicht erforderlich. Sehr empfehlenswert.

Shachar
quelle
3
Was ist dieses tragbare Format? und wie importiert man es in das neue Schema, wobei nur die Unterschiede zur vorherigen Version angewendet werden?
Eran Galperin
1

Ich verwende die Firebird- Datenbank für die meisten Entwicklungen und das FlameRobin- Verwaltungstool. Es hat eine schöne Option, um alle Änderungen zu protokollieren. Es kann alles in einer großen Datei oder einer Datei pro Datenbankänderung protokollieren. Ich verwende diese zweite Option und speichere dann jedes Skript in einer Versionskontrollsoftware. Früher habe ich Subversion verwendet, jetzt verwende ich Git.

Ich gehe davon aus, dass Sie ein MySQL-Tool finden können, das dieselbe Protokollierungsfunktion wie FlameRobin für Firebird hat.

In einer der Datenbanktabellen speichere ich die Versionsnummer der Datenbankstruktur, damit ich jede Datenbank problemlos aktualisieren kann. Ich habe auch ein einfaches PHP-Skript geschrieben, das diese SQL-Skripte einzeln in jeder Zieldatenbank ausführt (Datenbankpfad und Benutzername / Passwort werden in der Befehlszeile angegeben).

Es gibt auch eine Option zum Protokollieren aller DML-Anweisungen (Einfügen, Aktualisieren, Löschen), die ich aktiviere, während ich einige 'Standard'-Daten ändere, die jede Datenbank enthält.

Ich habe ein schönes Whitepaper darüber geschrieben, wie ich das alles im Detail mache. Sie können das Papier im PDF-Format zusammen mit Demo-PHP-Skripten von hier herunterladen .

Milan Babuškov
quelle
1

Ich habe auch eine Reihe von PHP-Skripten entwickelt, mit denen Entwickler ihre deltasql-Skripte an ein zentrales Repository senden können.

In einer der Datenbanktabellen (TBSYNCHRONIZE) speichere ich die Versionsnummer des zuletzt ausgeführten Skripts, sodass ich jede Datenbank einfach über die Webschnittstelle oder einen speziell für Eclipse entwickelten Client aktualisieren kann.

Über die Weboberfläche können mehrere Projekte verwaltet werden. Es unterstützt auch Datenbank "Zweige".

Sie können die Anwendung unter http://www.gpu-grid.net/deltasql testen (wenn Sie sich als Administrator mit dem Kennwort testdbsync anmelden). Die Anwendung ist Open Source und kann hier heruntergeladen werden: http://sourceforge.net/projects/deltasql

deltasql wird in der Schweiz und in Indien produktiv eingesetzt und ist in Japan beliebt.

Tiziano Mengotti
quelle
1

Vor einigen Monaten suchte ich nach einem Tool zur Versionierung des MySQL-Schemas. Ich fand viele nützliche Tools, wie Doctrine Migration, RoR Migration, einige Tools, die in Java und Python geschrieben wurden.

Aber keiner von ihnen hat meine Anforderungen erfüllt.

Meine Anforderungen:

  1. Keine Anforderungen, ausgenommen PHP und MySQL
  2. Keine Schemakonfigurationsdateien wie schema.yml in Doctrine
  3. Kann das aktuelle Schema aus der Verbindung lesen und ein neues Migrationsskript erstellen, als das identische Schema in anderen Anwendungsinstallationen darzustellen.

Ich habe angefangen, mein Migrationstool zu schreiben, und heute habe ich eine Beta-Version.

Bitte versuchen Sie es, wenn Sie Interesse an diesem Thema haben. Bitte senden Sie mir zukünftige Anfragen und Fehlerberichte.

Quellcode: bitbucket.org/idler/mmp/src Übersicht auf Englisch: bitbucket.org/idler/mmp/wiki/Home Übersicht auf Russisch: antonoff.info/development/mysql-migration-with-php-project

Maxim Antonov
quelle
Sie haben auch ein neues Tool: DBV: stackoverflow.com/a/13837473/6309
VonC
1

Ich interessiere mich auch für dieses Thema.

Es gibt einige Diskussionen zu diesem Thema im Django-Wiki .

Interessanterweise sieht es so aus, als ob in CakePHP die Schemaversionierung mit dem cake schema generateBefehl just integriert ist .

Swaroop CH
quelle
Nach dem, was ich über die Lösung von Cake gelesen habe, handelt es sich um eine Versionierung in einem sehr einfachen Sinne, sie weist jedoch keine unterschiedlichen Funktionen auf, sodass sie für mich keinen Nutzen hat.
Eran Galperin
1

Für MySQL

Wenn ich auf einer neuen DB lande:

Zuerst überprüfe ich die Struktur:

mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB1_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_1.sql
mysqldump --no-data --skip-comments --skip-extended-insert -h __DB_HOSTNAME__ -u __DB_USERNAME__ -p __DB2_NAME__ | sed 's/ AUTO_INCREMENT=[0-9]*//g' > FILENAME_2.sql
diff FILENAME_1.sql FILENAME_2.sql > DIFF_FILENAME.txt
cat DIFF_FILENAME.txt | less

Dank Stackoverflow-Benutzern konnte ich dieses schnelle Skript schreiben, um Strukturunterschiede zu finden.

src: https://stackoverflow.com/a/8718572/4457531 & https://stackoverflow.com/a/26328331/4457531

In einem zweiten Schritt überprüfe ich Daten Tabelle für Tabelle mit mysqldiff. Es ist ein bisschen archaisch, aber eine PHP-Schleife, die auf information_schemaDaten basiert, macht den Job sicher

Für die Versionierung verwende ich die gleiche Methode, formatiere jedoch ein SQL-Aktualisierungsskript (zum Aktualisieren oder Zurücksetzen) mit unterschiedlichen Ergebnissen und verwende die Versionsnummernkonvention (bei mehreren Änderungen sieht die Versionsnummer wie eine IP-Adresse aus) .

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------
Nolwennig
quelle
0

Ich verwende eine strikte Versionierung des Datenbankschemas (in einer separaten Tabelle nachverfolgt). Skripte werden in der Versionskontrolle gespeichert, aber alle überprüfen die aktuelle Schemaversion, bevor sie Änderungen vornehmen.

Hier ist die vollständige Implementierung für SQL Server (dieselbe Lösung kann bei Bedarf für MySQL entwickelt werden): So pflegen Sie die Version des SQL Server-Datenbankschemas

Zoran Horvat
quelle
Ich habe gerade Ihren Artikel gelesen. Verwenden Sie dies immer noch oder haben Sie seitdem eine Standardlösung wie DBUp oder ReadyRoll eingeführt?
David Atkinson
Derzeit basieren alle meine Projekte auf Entity Framework Code-First und ich verwende seine Migrationen, um die Datenbank zu versionieren. Ich habe die Lösung aus dem Artikel in einigen Legacy-Projekten und habe sie nie ersetzt. In anderen Projekten habe ich Redgate-Tools zum Verwalten von Schemas und Migrationen verwendet.
Zoran Horvat
Schön, dass Sie ein Redgate-Benutzer sind! Wenn Sie Redgate-Tools in Verbindung mit EF verwenden möchten, ist dies möglich: red-gate.com/blog/database-lifecycle-management/…
David Atkinson
Ich werde es bei der nächsten Gelegenheit versuchen. Es hat uns gute Dienste geleistet, aber ich habe das Team inzwischen geändert und experimentiere jetzt mit nativer EF-Unterstützung, bevor ich es vorantreibe.
Zoran Horvat
0

Nach langen Nachforschungen stellte ich fest, dass es einige Tools von Drittanbietern oder Visual Studio-Projekttypen gibt, die mich nicht zufrieden stellen, oder nur Blogs über die Theorie, aber keine Implementierung. Also habe ich ein funktionierendes System implementiert, das fast ein Jahr lang verwendet wird, und hier erklärt:

http://nalgorithm.com/2015/11/09/database-versioning-part-1/

Je nach Interesse wird weiter mehr geschrieben.

Yuksel Daskin
quelle
2
Hallo, willkommen bei SO. Diese Antwort ist nicht wirklich vollständig, sie enthält im Grunde nur einen Link. Nur-Link-Antworten sind nicht die besten: Sollte der Link jemals ungültig werden, wird Ihre Antwort unbrauchbar. Bearbeiten Sie es also und fügen Sie mindestens eine Zusammenfassung dessen hinzu, was dort zu finden ist, damit Ihre Antwort unabhängig vom Link einen Wert hat. Danke dir!
Fabio sagt Reinstate Monica