Wir verwenden etwas Ähnliches wie bcwoord, um unsere Datenbankschemata über 5 verschiedene Installationen (Produktion, Staging und einige Entwicklungsinstallationen) hinweg zu synchronisieren und in der Versionskontrolle zu sichern. Dies 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 den Nummern 1.sql, 2.sql, 3.sql usw. Das Skript verwendet eine zusätzliche Tabelle, um die aktuelle Versionsnummer von zu speichern Datenbank. Die N.sql-Dateien werden von Hand erstellt, um von Version (N-1) zu Version N der Datenbank zu gelangen.
Sie können verwendet werden, um Tabellen hinzuzufügen, Spalten hinzuzufügen, Daten von einem alten in ein neues Spaltenformat zu migrieren, dann die Spalte zu löschen, "Stamm" -Datenzeilen wie Benutzertypen usw. einzufügen. Grundsätzlich kann alles und mit geeigneten Daten ausgeführt werden Migrationsskripte verlieren nie Daten.
Das Update-Skript funktioniert folgendermaßen:
- Stellen Sie eine Verbindung zur Datenbank her.
- Erstellen Sie eine Sicherung der aktuellen Datenbank (weil Sachen wird schief gehen) [mysqldump].
- Erstellen Sie eine Buchhaltungstabelle (_meta genannt), falls diese nicht vorhanden ist.
- Lesen Sie die aktuelle VERSION aus der _meta-Tabelle. Nehmen Sie 0 an, wenn nicht gefunden.
- Führen Sie alle SQL-Dateien, die höher als VERSION nummeriert sind, der Reihe nach aus
- Wenn eine der Dateien einen Fehler verursacht hat: Führen Sie einen Rollback zur Sicherung durch
- Andernfalls aktualisieren Sie die Version in der Buchhaltungstabelle auf die höchste ausgeführte SQL-Datei.
Alles geht in die Quellcodeverwaltung, und jede Installation verfügt über 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 die Staging- und Produktionsumgebungen von SVN über ein Skript, das das Datenbankaktualisierungsskript automatisch aufruft, sodass eine Codeaktualisierung mit den erforderlichen Datenbankaktualisierungen geliefert wird.
Wir können auch dasselbe Skript verwenden, um die gesamte Datenbank von Grund auf neu zu erstellen. Wir löschen und erstellen die Datenbank einfach neu und führen dann das Skript aus, mit dem die Datenbank vollständig neu gefüllt wird. Wir können das Skript auch verwenden, um eine leere Datenbank für automatisierte Tests zu füllen.
Die Einrichtung dieses Systems dauerte nur wenige Stunden. Es ist konzeptionell einfach und jeder erhält das Versionsnummerierungsschema. Es war von unschätzbarem Wert, das Datenbankdesign voranzutreiben und weiterzuentwickeln, ohne die Änderungen kommunizieren oder manuell ausführen zu müssen auf allen Datenbanken.
Vorsicht beim Einfügen von Abfragen von phpMyAdmin! Diese generierten Abfragen enthalten normalerweise den Datenbanknamen, den Sie definitiv nicht möchten, da dadurch Ihre Skripte beschädigt werden! So etwas wie TABELLE ERSTELLEN mydb
. newtable
(...) schlägt fehl, wenn die Datenbank auf dem System nicht mydb heißt. Wir haben einen SVN-Hook vor dem Kommentar erstellt, der SQL-Dateien mit der mydb
Zeichenfolge nicht zulässt. Dies ist ein sicheres Zeichen dafür, dass jemand ohne ordnungsgemäße Überprüfung von phpMyAdmin kopiert / eingefügt hat.