Frage

Was ist der beste Weg, um mein MySQL-Datenmodell zu speichern und automatisch anwenden Änderungen an meinen Entwicklung Datenbankserver als sie (oder zumindest jede Nacht) gemacht werden?

Zum Beispiel, heute ist ich an meinem Projekt arbeiten und diese Tabelle in meiner Datenbank erstellen, und speichern Sie die Anweisung SQL-Datei zur Produktion bereitstellen später:

create table dog (
  uid int,
  name varchar(50)
);

Und morgen, ich entscheide, will ich auch die Rasse jeden Hund erfassen. Also habe ich die SQL-Datei ändern zu lesen:

create table dog (
  uid int,
  name varchar(50),
  breed varchar(30)
);

Das Skript wird in der Produktion für das erste Release arbeiten, aber es wird mir nicht helfen, meine Entwicklungsdatenbank, weil ERROR 1050 (42S01): Table 'dog' already exists zu aktualisieren. Darüber hinaus wird es nicht in der Produktion arbeiten, wenn diese Änderung nach der ersten Veröffentlichung gemacht wurde. Also habe ich wirklich brauchen jetzt die Tabelle ALTER.

So, jetzt habe ich zwei Anliegen:

  1. Ist dies, wie ich meine werden soll Speicher Datenmodell (ein Bündel erstellen Anweisungen in einer SQL-Datei), und
  2. Wie sollte ich wie anwenden Änderungen diese auf meine Datenbank?

Mein Ziel ist es, Veränderungen genau zu lösen und die kontinuierliche Integration ermöglichen. Ich benutze ein Tool namens DDLSYNC finde und Unterschied in einer Oracle-Datenbank gelten, aber ich bin nicht sicher, was ähnliche Werkzeuge gibt es für MySQL.

War es hilfreich?

Lösung

Bei der Arbeit haben wir ein kleines Skript unsere Datenbank Versionierung zu verwalten. Jede Änderung an einer Tabelle oder Gruppe von Daten bekommt seine eigene SQL-Datei.

Die Dateien werden fortlaufend nummeriert. Wir zu verfolgen, welche Update-Dateien sind durch die Speicherung dieser Informationen in der Datenbank ausgeführt worden. Das Skript fügt eine Zeile mit dem Dateinamen, wenn die Datei über ausgeführt werden soll, und aktualisiert die Zeile mit einem Abschluss Zeitstempel, wenn die Ausführung beendet. Dies wird innerhalb einer Transaktion gewickelt. (Es ist zu bedenken, dass DDL-Befehle in MySQL nicht innerhalb einer Transaktion auftreten können. Jeder Versuch, DDL in einer Transaktion ausführen führt eine implizite begehen.)

Da die SQL-Dateien Teil unseres Quellcode-Repository sind, können wir die Update-Skript Teil des normalen Rollout-Prozess machen laufen. Dies macht die Datenbank und den Code synchron als Torte einfach zu halten. Ehrlich gesagt, macht der schwierigste Teil sicher ein anderer Entwickler hat nicht die nächste Nummer in einem ausstehenden begehen packte.

Wir kombinieren dieses Update-System mit einem (optional) jede Nacht wischen unsere Entwickler-Datenbank, um den Inhalt mit dem letzten Nacht Live-System-Backup zu ersetzen. Nachdem die Sicherung gestellt wird, wird das Update ausführen, mit allen ausstehenden Update-Dateien in dem Prozess ausgeführt zu werden.

Die Wiederherstellung erfolgt in der Weise, dass nur Tabellen, die in der Live-Datenbank erhalten überschrieben wurden. Jedes Update, das eine Tabelle hat daher fügt auch für nur verantwortlich sein Zugabe es, wenn es nicht existiert. DROP TABLE IF EXISTS ist praktisch. Leider sind nicht alle Datenbanken unterstützen, dass, so auch das Update-System für die Ausführung von Scripts geschrieben in unserer Sprache der Wahl erlaubt, nicht nur SQL.

All dies in etwa 150 Zeilen Code. Es ist so einfach wie ein Verzeichnis zu lesen, um den Inhalt einer Tabelle zu vergleichen, und die Ausführung alles, was in einer bestimmten Reihenfolge nicht bereits ausgeführt worden ist.

Andere Tipps

Es gibt Standard-Tools für diese in vielen Frameworks: Rails hat etwas namens Migrations , etwas, das in PHP oder einer ähnlichen Sprache leicht repliziert wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top