it-swarm.com.de

Wie versionieren Sie Ihr Datenbankschema?

Wie bereiten Sie Ihre SQL-Deltas vor? Speichern Sie jedes Schema, das SQL ändert, manuell in einem Delta-Ordner, oder haben Sie eine Art automatisierten Diffing-Prozess?

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

Welche Optionen zum Unterscheiden von Deltas gibt es neben DbDeploy ?

BEARBEITEN: Anzeigen der Antworten Ich möchte klarstellen, dass ich mit dem Standardschema für die Ausführung einer Datenbankmigration mit Deltas vertraut bin. Meine Frage ist über das Erstellen der Deltas selbst, vorzugsweise automatisch.

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

123
Eran Galperin

Sehen

Gibt es ein Versionskontrollsystem für Datenbankstrukturänderungen?

Wie versioniere ich meine MS SQL-Datenbank in SVN?

und Jeffs Artikel

Bringen Sie 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 glaube ich, dass es keine adäquate, akzeptierte Lösung dafür gibt, und ich rolle meine eigene in diesem Bereich.

59
harpo

Wenn Sie noch nach Optionen suchen: Schauen Sie sich neXtep designer an. Es ist eine kostenlose Entwicklungsumgebung für GPL-Datenbanken, die auf den Konzepten der Versionskontrolle basiert. In der Umgebung arbeiten Sie immer mit versionierten Entitäten und können sich auf die Datenmodellentwicklung konzentrieren. Sobald eine Freigabe erfolgt ist, kann die an das Versionskontrollsystem angeschlossene SQL-Generierungsengine 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) verfügbar, sodass das Produkt unter Windows, Linux und Mac ausgeführt werden kann.

4

Sie könnten einen Blick auf einen anderen, ähnlichen Thread werfen: Wie versioniere ich meine MS SQL-Datenbank in SVN? .

4
Jason Jackson

Ich stelle sicher, dass Schemaänderungen immer additiv sind. Daher lösche ich keine Spalten und Tabellen, da dies die Daten zappen würde und später nicht rückgängig gemacht 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, mit denen Tabellen und Spalten erstellt werden, sofern sie noch nicht vorhanden sind, und die mit Daten gefüllt werden.

Das Migrationsskript wird bei jeder Aktualisierung des Produktionscodes und nach Neuinstallationen ausgeführt.

Wenn ich etwas löschen möchte, entferne ich es aus dem Datenbankinstallationsskript und dem Migrationsskript, sodass diese veralteten Schemaelemente bei neuen Installationen 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.

3
Calmarius

http://bitbucket.org/idler/mmp - Schemaversionierungstool für MySQL, geschrieben in PHP

2
user381751

Ich bin nicht derjenige, der mein eigenes Horn betört, aber ich habe eine interne Web-App entwickelt, um Änderungen an Datenbankschemata nachzuverfolgen und versionierte Aktualisierungsskripten zu erstellen.

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

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

2
Joakim Bodin

Deltas schaffe ich nicht. Ich ändere eine master-Datenbank 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 Erstellungsskript verwendet, um eine neue Datenbank und die leeren Tabellen zu erstellen. Anschließend kopiere ich die Daten mit INSERT INTO x SELECT FROM y aus der alten Datenbank und wende dann alle Indizes, Einschränkungen und Trigger an.

Neue Tabellen, neue Spalten, gelöschte Spalten werden automatisch behandelt und mit ein paar kleinen Tricks zum Anpassen der Kopierroutine kann ich Spaltenumbenennungen, Spaltentypänderungen und andere grundlegende Umgestaltungen behandeln.

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.

2
Darrel Miller

Sie haben nicht erwähnt, welches RDBMS Sie verwenden, aber wenn es sich um MS SQL Server handelt, war Red-Gates SQL Compare für uns unverzichtbar, um Deltas zwischen Objekterstellungsskripten zu erstellen.

2
jalbert

Ich benutze Firebird Datenbank für die meisten Entwicklungen und ich benutze FlameRobin Administrationstool dafür. Es gibt eine nette Option, um alle Änderungen zu protokollieren. Es kann alles in einer großen Datei oder in einer Datei pro Datenbankänderung protokollieren. Ich verwende diese zweite Option und speichere dann jedes Skript in der Versionskontrollsoftware - früher habe ich Subversion verwendet, jetzt benutze ich Git.

Ich gehe davon aus, dass Sie ein MySQL-Tool finden können, das die gleiche 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 nacheinander in jeder Zieldatenbank ausführt (Datenbankpfad und Benutzername/Passwort werden in der Befehlszeile angegeben).

Es gibt auch eine Option, um alle DML-Anweisungen (Einfügen, Aktualisieren, Löschen) zu protokollieren, und ich aktiviere diese Option, 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 dem Demo-Skript PHP von hier herunterladen.

1
Milan Babuškov

Vor einigen Monaten suchte ich nach einem Tool zur Versionierung des MySQL-Schemas. Ich habe viele nützliche Tools gefunden, 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, schließen Sie PHP und MySQL aus
  2. Keine Schemakonfigurationsdateien wie schema.yml in Doctrine
  3. Kann das aktuelle Schema aus der Verbindung lesen und ein neues Migrationsskript erstellen, als identisches Schema in anderen Anwendungsinstallationen darstellen.

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

Bitte probieren Sie es aus, 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

1
Maxim Antonov

Ich habe auch eine Reihe von PHP - Skripten entwickelt, mit denen Entwickler ihre Deltasql-Skripten 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 mithilfe der Webschnittstelle oder eines speziell für Eclipse entwickelten Clients problemlos aktualisieren kann.

Über das Webinterface 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 sehr beliebt.

1

Ich interessiere mich auch für dieses Thema.

Es gibt einige Diskussionen zu diesem Thema im Django Wiki .

Interessanterweise sieht es aus wie CakePHP hat eine eingebaute Schema-Versionierung mit nur cake schema generate Befehl.

1
Swaroop C H

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.

1
Shachar

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 festzustellen.

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

In einem zweiten Schritt überprüfe ich tabellarisch die Daten mit mysqldiff. Es ist ein bisschen archaisch, aber eine PHP-Schleife basierend auf information_schema Daten machen sicher Arbeit

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

initial version : 1.0.0
                  ^ ^ ^
                  | | |
structure change: - | |
datas added: -------- |
datas updated: --------
1
Nolwennig
1
popalka

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

Hier ist die vollständige Implementierung für SQL Server (die gleiche Lösung könnte bei Bedarf für MySQL entwickelt werden): So pflegen Sie die SQL Server-Datenbankschema-Version

0
Zoran Horvat

Nach langen Nachforschungen stellte ich fest, dass es 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 verwendet wird und hier erklärt:

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

je nach interesse wird weiter geschrieben.

0
Yuksel Daskin