MySQL Datenbank revisonieren
Ich bin derzeit dabei eine einfache Entwicklungsumgebung aufzubauen. Dabei habe ich nach einer vernünftigen Möglichkeit gesucht um Datenbankänderungen zu revisionieren, sprich alle Änderungen in der Struktur festzuhalten.
Niemand möchte alle SQL-Befehle für Strukturänderungen manuell dokumentieren. Ein kleiner Lebensretter ist hier das Perl Script „mysqldiff“. Das Tool kann mehrere Datenbanken miteinander vergleichen und gibt die Änderungen als SQL-Befehle zurück. Das bedeutet natürlich nicht, das man dadurch eine saubere Softwaredokumentation ersetzen kann.
wget http://adamspiers.org/computing/mysqldiff/MySQL-Diff-0.30.tar.gz tar -xf MySQL-Diff-0.30.tar.gz cd MySQL-Diff-0.30 perl ./Makefile.PL make make install
Zudem wird noch das Paket Class::MakeMethods::Template::Hash aus dem CPAN benötigt.
cpan Class::MakeMethods::Template::Hash
Gehen wir von der folgenden Situation aus: eine Datenbank „live“ mit den Live-Daten sowie eine Datenbank „staging“ mit Test-Daten. In der Tabelle „test_1“ in der Staging-Datenbank wurde das zusätzliche Feld „id“ hinzugefügt.
CREATE DATABASE live; CREATE TABLE live.test_1 ( id int (11) ); CREATE DATABASE staging; CREATE TABLE staging.test_1 ( id int (11), id2 int(11) );
Nun können wir mittels mysqldiff die beiden Datenbanken miteinander vergleichen lassen. Zurück bekommen wir eine Liste mit SQL-Queries, um die Live-Datenbank auf den aktuellen Stand zu bringen.
root@dev01:~# mysqldiff -h localhost -u root -p gX8AmLuO8hWpqau3 live staging ## mysqldiff 0.30 ## ## run on Tue Feb 7 22:48:32 2012 ## ## --- db: live (host=localhost user=root) ## +++ db: staging (host=localhost user=root) ALTER TABLE `test_1` ADD COLUMN `id2` int(11) DEFAULT NULL;
Bestenfalls lässt man das ganze nun automatisiert in ein GIT/SVN Repository laufen. Zum überspielen der Änderungen bietet das Tool auch die Möglichkeit die Änderungen direkt (mittels –apply) auf die Live-Datenbank zu überspielen, jeweils mit einer Abfrage vor dem Absetzen jedes einzelnen SQL-Querys.