Kommandozeilen-Magie

Angenommen, wir haben einen Linux-basierten Webserver mit MySQL, aber phpMyAdmin ist zur Pflege der Datenbanken nicht verfügbar. In diesem Fall können wir uns per SSH mit dem Server verbinden und die Kommandzeile verwenden. Eine Übersicht von grundlegenden MySQL-Befehlen finden Sie z.B. hier.

Einzelne Tabellen oder ganze Datenbanken lassen sich leicht mit dem drop Befehl entfernen, aber es gibt keine einfache Methode, eine große Anzahl von Tabellen aus einer Datenbank zu löschen. Ich stand vor diesem Problem als ich eine Joomla-Installation von Version 1.5 auf 2.5 aktualisieren wollte. Immer wenn ich mit dem Ergebnis eines Upgrade-Vorgangs nicht zufrieden war, habe ich zuerst tabula rasa gemacht und die neu erstellten MySQL-Tabellen gelöscht, bevor ich einen weiteren Versuch unternommen habe. Nehmen wir an, die entsprechende Datenbank sieht wie folgt aus:

 

$ mysql -u myusername -p mydatabase
mysql> show tables;
+-----------------------------+
| Tables_in_mydatabase        |
+-----------------------------+
| bak_banner                  |
| bak_categories              |
| bak_menu                    |
| bak_users                   |
| j25_banner                  |
| j25_categories              |
| j25_menu                    |
| j25_users                   |
| jos_banner                  |
| jos_categories              |
| jos_menu                    |
| jos_users                   |
| jupgrade_categories         |
| jupgrade_menus              |
| jupgrade_modules            |
| jupgrade_steps              |
+-----------------------------+

In Wirklichkeit war meine Datenbank viel größer, aber aus Gründen der Übersichtlichkeit habe ich die Liste für diesen Artikel stark verkürzt. Die zum Joomla-Upgrade gehörigen Tabellen, die wir löschen möchten, beginnen mit j25_. Mit Hilfe des Platzhalters % können wir diese separat auflisten:

 

mysql> show tables like 'j25_%';
+-----------------------------+
| Tables_in_mydatabase (j25_%)|
+-----------------------------+
| j25_banner                  |
| j25_categories              |
| j25_menu                    |
| j25_users                   |
+-----------------------------+

Leider können wir den Platzhalter % nicht mit dem drop Befehl kombinieren, um diese Tabellen in einem Schritt zu entfernen. Wir erstellen daher ein einfaches Skript. Per Kommandozeile erzeugen wir eine Textdatei mit den relevanten Tabellen:

$ mysql -u myusername -p mydatabase -e "show tables like 'j25_%'" > j25list.txt

Nun enthält j25list.txt die Liste der Tabellen, die wir löschen wollen. Bevor wir diese Liste an mysql weiterleiten, müssen wir einige kosmetische Änderungen vornehmen: Die erste Zeile in j25list.txt muss durch die Zeichenfolge DROP TABLE ersetzt werden, und alle anderen Zeilen müssen auf ein Komma enden, mit Ausnahme der letzten Zeile, welche auf ein Semikolon enden muss. Dies wird erreicht durch den nachfolgenden unhandlichen sed Befehl:

sed 's/$/,/;$s/.$/;/;1d;2i\DROP TABLE' j25list.txt > j25list.sql

Jetzt enthält j25list.sql ein Skript, das von mysql verstanden wird. Wir leiten dieses weiter an mysql mittels

$ mysql -u myusername -p mydatabase < j25list.sql

Und wir sind fertig!