Wie vergleicht man zwei gleiche Datenbanken?
3. September 2019Mir kam ein Projekt unter die Hände, bei dem sich sowohl der Quellcode als auch die Datenbank darin unterschieden, was auf der Produktion, auf dem Testing und im Repository war. Ich musste das vereinheitlichen. Wie vergleicht man effektiv zwei gleiche Datenbanken und findet die Unterschiede? Ich habe mehrere Werkzeuge zum Vergleich von Datenbanken gefunden und ausprobiert.
Die Welt der Webanwendungen ist eine Welt der Masse und damit ist die durchschnittliche Qualität niedriger. Man begegnet also allerlei. Zum Beispiel auch einer Entwicklung, bei der weder die Änderungen der Anwendung noch die der Datenbank versioniert sind.
Versionierung der Datenbank
Schon seit Jahren gibt es Werkzeuge für PHP, wie zum Beispiel phpmig, nextras/migrations oder Phinx , die dazu dienen, Änderungen an der Datenbankstruktur zu beschreiben und einen reibungslosen Übergang zwischen den Versionen zu ermöglichen. Der Übergang zwischen den Versionen der Datenbankstruktur kann sowohl vorwärts auf eine neue Version als auch rückwärts erfolgen. Rückwärtsänderungen werden zum Beispiel dann genutzt, wenn ein Upgrade der Anwendung neue Probleme mit sich gebracht hat, die ihre Nutzung verhindern. Dann wird die vorbereitete Rückwärtsmigration verwendet und die Anwendung ist so schnell wieder in einem benutzbaren Zustand.
Zur Dokumentation der Änderungen würde jedoch zumindest eine einfache Aufzeichnung der ALTER SQL-Befehle genügen, die ausgeführt werden müssen, damit die Struktur und gegebenenfalls auch die Daten der Datenbank für die neue Version der Anwendung aktualisiert werden können.
Wie löst man aber das Problem, wenn wir zwei Versionen der Anwendung haben, zum Beispiel eine Produktions- und eine Testversion, bei denen sich die Datenbanken nicht nur in den Daten, sondern auch in der Struktur unterscheiden? Und dabei hat der ursprüngliche Programmierer keinerlei Informationen über die Änderungen hinterlassen? Dann bleibt nichts anderes übrig als der Vergleich der Datenbanken. Von Hand will das wohl nicht einmal bei kleinen Projekten jemand machen, also wie vergleicht man Datenbanken automatisch?
Werkzeuge zum Vergleich von Datenbanken
Das grafische Werkzeug MySQL Workbench sollte Datenbanken vergleichen können,
ich benutze es jedoch nicht, weil diese SW bei mir abstürzt und ich mich nicht weiter damit beschäftigt habe.
Ich bin noch auf einige weitere, häufig
Konsolenwerkzeuge gestoßen, die für die
professionelle Arbeit eines Entwicklers üblicherweise effizienter sind.
Am Ende habe ich die Software DBDiff ausgewählt, ausprobiert und erfolgreich eingesetzt
Wenn Sie mit Datenbanken erst anfangen, schauen Sie sich den Artikel Programmierung in SQL: PostgreSQL, MySQL/MariaDB an.
DBDiff
Das Programm erfordert die Version PHP7, aber die ist heute auf den Maschinen (in den Umgebungen) von PHP-Entwicklern schon üblich verfügbar.
Das Programm DBDiff steht auf GitHub zum Download bereit, es genügt also, mit dem Befehl git einen Klon des Repositories zu erstellen:
git clone https://github.com/DBDiff/DBDiff.git
Verwendung
Zuerst muss das Programm eingerichtet werden. Eine Konfigurationsdatei anlegen, zum Beispiel config.cgf, und die Zugangsdaten hineinschreiben.
Also in die Konfigurationsdatei die Zugangsdaten zu den Datenbanken schreiben, die wir vergleichen wollen.
Das Programm starten wir dann folgendermaßen:
./dbdiff --config=config.cgf server1.example.com:server2.example.comDas Programm erstellt eine Datei mit Informationen über den Vergleich im Format von SQL-Befehlen ./migration.sql.
Der Schalter --type=all vergleicht in der Datenbank alles, aber bei nicht kleinen Datenbanken belegt er den gesamten verfügbaren Arbeitsspeicher.
PHP hat eine definierte Speicherbegrenzung, damit nicht der gesamte im Computer verbaute Arbeitsspeicher verbraucht werden kann.
Deshalb muss in der Datei ./src/DBDiff.php der Wert memory_limit angepasst werden, zum Beispiel so:
ini_set('memory_limit', '1512M');
Eine andere und wohl bessere Möglichkeit, wenn Sie den gesamten Inhalt vergleichen und sich nicht mit der Begrenzung des Arbeitsspeichers befassen wollen, ist, mit dem Programm die Datenbank schrittweise nach einzelnen Tabellen zu vergleichen. Anwendungsbeispiel:
./dbdiff --config=config.cgf server1.example.com.category:server2.example.com.category --type=all --output=migration_category.sql
Bewertung des Programms
Was hat das Programm DBDiff erkannt?
Nach einem Blick in das generierte Migrationsskript ist zu sehen, dass das Programm erkannt hat:
- neue Tabellen
- hinzugefügte Zeilen,
- hinzugefügte Spalten in der Tabelle
Was löst das Programm DBDiff nicht?
Bei der Tabelle mit hinzugefügten Spalten hat es kein Update zum Setzen der Werte in die neuen Spalten generiert. Ich habe es so gelöst, dass ich einen Export der gesamten Tabelle mit den Daten gemacht habe und für den anschließenden Import mittels update. Das Löschen der Tabelle und der Import funktionierten nicht, weil die Tabelle Schlüssel zu fremden Tabellen enthält.
Was erkennt das Programm DBDiff, löst es aber nicht?
Das Programm DBDiff hat einen geänderten Kommentar bei einer Tabelle erkannt, aber kein ausreichendes SQL-Skript generiert. Konkret hat es ein Skript generiert, das ein alter table gemacht hat, aber ohne das Einfügen dieses neuen Kommentars.
Artikel zu einem ähnlichen Thema
Vibecoding: Wie man mit KI eine gute Anwendung programmiert
Wie man das Internet beschleunigt
Rektor: Upgrade der PHP-Anwendung
Programmiersprache Go
Analyse des Auftrags und der Preisgestaltung bei der Entwicklung von Softwareprojekten
Python-Programm zur Steuerung von Docker über die API
Wie man MailCatcher zum Testen von E-Mails verwendet
Python OpenAI API
Erstellen einer WebSocket-Webanwendung und Einrichten eines Proxys
Projektmanagement: agile Softwareentwicklung
Wie man alte PHP-Anwendungen ausführt
Was ein guter Programmierer wissen sollte
Programmiersprache Rust
NodeJS: Entwicklung, Serverkonfiguration
Nette Sicherheitslücke CVE-2020-15227
REST API: Plattform-API
Kundenspezifisches Web- und E-Mail-Hosting mit ISP Config-Software
Programmierung in SQL: PostgreSQL, MySQL/MariaDB
HTTPS: sicheres Web
NoSQL-Datenbank Mongo DB
Herstellen einer Verbindung zu Microsoft SQL Server unter Linux
Was ist die Stellenbeschreibung eines Programmierers?
Lokalisierung von Python-Anwendungen
Welches Mail- und Webhosting Sie wählen sollten
Digispark - Atmel ATtiny Mikrocontroller mit Arduino IDE programmieren
Entwicklung für ARM-Prozessoren mit Arduino IDE
Wie programmiere ich den ESP8266 WiFi-Prozessor?
Vergleich IQRF vs. drahtloser Arduino
Welche Plattform sollte ich für meinen E-Shop wählen? Zum Beispiel, Prestashop
Entwicklungskits und Gateways für die Funkplattform IQRF
OpenStreetMap und GPS-Routen auf der Karte im Internet
Quickplay
Chipkarten mit und ohne Kontakt – Java Card OpenPlatform
Offenes Smartphone mit Linux - Openmoko Neo FreeRunner
Entwicklung für drahtlose Module mit PIC-Prozessor unter GNU/Linux - IQRF
Newsletter
Wenn Sie daran interessiert sind, gelegentlich Neuigkeiten per E-Mail zu erhalten.
Sie können sich registrieren, indem Sie Ihre E-Mail-Adresse eingeben
News-Abonnement.
+