Freitag, 12. Februar 2016

SQL-Dumps mit Köpfchen

Wartungsarbeiten an laufender Software erfordern nicht selten Datenbank-Backups, die mit unterschiedlichen Versionsständen vergleichbar sind.
Egal ob man ein DB-Backup nun per Hand, oder via Phing oder anderen CI-Tools bzw. CD-Tools erstellt - bei allen Varianten ist eine gut durchdachte Sicherung schon der halbe Weg zu Erfolg.

Fiktiver Anwendungsfall

Mehrere Onlineshop mit gleicher Shopversion sollen aktualisiert werden. Der Prozess des Upgrades stellt sich nun aber als ein "durchklicken durch die Upgrade-GUI " dar und ist somit recht zeitaufwendig. 

Was also tun?


Wir finden heraus, was sich nach dem Update an der DB geändert hat, und packen dies in ein SQL-Dump um es dann einfach bei allen Shops einzuspielen.

SQL-Dump mit Trick

Wir erstellen also einen SQL-Dump vom aktuellen Shop. Doch hier beginnt bereits der Trick!
Wir deaktivieren extendet-inserts beim Dump:
mysqldump --extended-insert=FALSE ...
Warum machen wir dies?
Wenn wir einen "normalen" SQL-Dump erstellen, werden erweiterte Insert-Befehle erstellt. Es wird also ein INSERT-Statement erstellt, welches alle in der Tabelle enthaltenen Datensätze aneinanderreiht.

INSERT INTO `banktransfer_blz` VALUES (10000000,'Bundesbank','MARKDEF1100','09'),(10010010,'Postbank','PBNKDEFFXXX','24'),(10010111,'SEB','ESSEDE5F100','13');

Das Problem mit diesem Dump ist, das jeder INSERT somit eine endlos lange Zeile ist. Möchte man nun z.B. mit einem DIFF zwei solcher Dumpdateien ändern, wird das gesamte INSERT-Statement als verändert dargestellt, da es sich für DIFF ja lediglich um eine Zeile handelt.

Erstellen wir jedoch den Dump mit der Option --extended-insert=false , wird der Dump so aufgebaut sein:

INSERT INTO `banktransfer_blz` VALUES (10000000,'Bundesbank','MARKDEF1100','09');
INSERT INTO `banktransfer_blz` VALUES (10010010,'Postbank','PBNKDEFFXXX','24');
INSERT INTO `banktransfer_blz` VALUES (10010111,'SEB','ESSEDE5F100','13');

Die deaktivierung des extended-insert geht übrigens auch im phpmyadmin. Dort beim Dump einfach "Angepasst – zeige alle möglichen Optionen an" wählen und ganz unten im Bereich "Datenexport-Optionen" den letzten Eintrag wählen.

PhpMyAdmin

Ein kleiner Tipp am Rande. Beim Export eines SQL-Dumps wird der Dateiname immer mit der Bezeichnung der Datenbank erstellt. Wer es detaillierter mag, und den Dump direkt mit einem Datum als Präfix ablegen möchte, kann dies relativ einfach tun:


  1. Zuerst wählt man Angepasst – zeige alle möglichen Optionen an auf der SQL-Export Seite von phpmyadmin aus.
  2. Dann unter Speichere Ausgabe in Datei den enthaltenen Text einfach gegen folgenden ersetzen: %F_%T_@DATABASE@
  3. Dies erzeugt eine Datei im Format: 2016-02-19_10:15_myDatabase.sql

Keine Kommentare:

Kommentar veröffentlichen