Joomla aufräumen: Datenbank, alte Erweiterungen, Discover und tmp-Verzeichnis

Eine Joomla-Installation, die über viele Jahre betrieben und immer wieder erweitert wurde, sammelt mit der Zeit einiges an Ballast an. Erweiterungen werden installiert, ausprobiert und irgendwann wieder deinstalliert. Manche hinterlassen Datenbanktabellen, andere Dateien im Dateisystem. Gleichzeitig können Tabellen wie die Session-Tabelle über Jahre massiv anwachsen, wenn die automatische Bereinigung nicht zuverlässig funktioniert.

Dieser Artikel beschreibt einen praktischen Weg, um eine gewachsene Joomla-Installation schrittweise zu untersuchen und aufzuräumen.

Wichtig: Vor Änderungen an der Datenbank sollte immer ein aktuelles Backup vorhanden sein.

Das Problem

Bei einer älteren Joomla-Installation fiel auf, dass die Datenbank ungewöhnlich groß geworden war. Gleichzeitig zeigte der Joomla-Bereich System → Discover mehr als hundert Erweiterungen an, obwohl viele davon längst nicht mehr bewusst genutzt wurden.

Die Fragen waren deshalb:

Statt sofort Tabellen zu löschen, lohnt sich zunächst eine Bestandsaufnahme.


1. Datenbanktabellen nach Größe untersuchen

Für eine erste Analyse braucht man nicht zwingend einen kompletten SQL-Dump mit allen Inhalten. Oft genügt eine Übersicht der Tabellen einschließlich Größe und ungefährer Zeilenzahl.

In phpMyAdmin kann innerhalb der betreffenden Datenbank folgende Abfrage ausgeführt werden:

SELECT
  table_name AS Tabelle,
  engine AS Engine,
  table_rows AS Zeilen,
  ROUND((data_length + index_length) / 1024 / 1024, 2) AS Groesse_MB,
  create_time AS Erstellt,
  update_time AS Letzte_Aenderung
FROM information_schema.tables
WHERE table_schema = DATABASE()
ORDER BY (data_length + index_length) DESC;

Das Ergebnis lässt sich beispielsweise als CSV exportieren.

Die Abfrage liefert unter anderem:

Bei InnoDB ist die angegebene Zeilenzahl nicht zwingend exakt. Für eine erste Größenanalyse reicht sie aber aus.


2. Eine extrem große Joomla-Session-Tabelle

Besonders auffällig kann die Joomla-Tabelle

#__session

werden.

In dem untersuchten Fall enthielt sie mehr als vier Millionen Datensätze und belegte mehrere Gigabyte.

Dabei handelt es sich nicht um einen Datei- oder Bildcache.

Die Session-Tabelle speichert Sitzungsinformationen. Dazu gehören beispielsweise anonyme Besucher-Sessions und Sitzungen eingeloggter Benutzer beziehungsweise Administratoren.

Bilder, CSS-Dateien oder andere Mediendateien liegen dort nicht.

Alte Sessions zählen

Zunächst kann geprüft werden, wie viele Einträge älter als sieben Tage sind:

SELECT COUNT(*) AS aelter_7_tage
FROM #__session
WHERE `time` < UNIX_TIMESTAMP(NOW() - INTERVAL 7 DAY);

Der Präfix #__ muss dabei durch den tatsächlichen Tabellenpräfix der Joomla-Installation ersetzt werden.

Zusätzlich kann die Gesamtzahl ermittelt werden:

SELECT COUNT(*) AS gesamt
FROM #__session;

Im Praxisfall waren nahezu sämtliche Einträge älter als sieben Tage. Die Tabelle bestand damit fast vollständig aus alten Sessions.


3. Alte Session-Daten löschen

Eine vorsichtige Möglichkeit besteht darin, alte Einträge portionsweise zu löschen:

DELETE FROM #__session
WHERE `time` < UNIX_TIMESTAMP(NOW() - INTERVAL 7 DAY)
ORDER BY `time`
LIMIT 100000;

Bei mehreren Millionen Datensätzen kann das allerdings sehr lange dauern.

Im konkreten Fall benötigte bereits das Löschen von 100.000 Datensätzen deutlich mehr als zwei Minuten. Auch größere Blöcke machten die Bereinigung entsprechend langwierig.

Alternative: Session-Tabelle vollständig leeren

Wenn die Website keine angemeldeten Frontend-Benutzer hat und es akzeptabel ist, dass momentan angemeldete Administratoren ihre Sitzung verlieren, kann die Session-Tabelle auch vollständig geleert werden:

TRUNCATE TABLE #__session;

Das ist erheblich schneller als Millionen einzelne Datensätze mit DELETE zu entfernen.

Die Folge ist:

Für eine reine Session-Tabelle kann das bei einer Wartung eine sinnvolle Lösung sein.


4. Warum bleiben nach einer Joomla-Deinstallation Tabellen übrig?

Bei älteren Joomla-Installationen finden sich häufig Tabellen von Erweiterungen, die längst nicht mehr verwendet werden.

Eine Deinstallation entfernt nicht zwangsläufig alle Daten.

Ob Datenbanktabellen beim Entfernen einer Erweiterung ebenfalls gelöscht werden, hängt davon ab, wie die jeweilige Erweiterung ihre Deinstallation implementiert.

Deshalb können über Jahre komplette Tabellenfamilien zurückbleiben.

Typisch sind Namen wie:

#__extensionname
#__extensionname_files
#__extensionname_statistics
#__extensionname_categories
#__extensionname_config

Solche Tabellen sollte man allerdings nicht allein aufgrund ihres Namens löschen.

Zunächst muss geklärt werden, ob die zugehörige Erweiterung noch installiert ist.


5. Prüfen, ob eine Erweiterung noch installiert ist

Joomla führt installierte Erweiterungen in der Tabelle

#__extensions

Eine einfache Abfrage kann beispielsweise so aussehen:

SELECT
  extension_id,
  name,
  type,
  element,
  folder,
  enabled
FROM #__extensions
ORDER BY name, type;

Bei einer bestimmten Erweiterung kann gezielter gesucht werden:

SELECT
  extension_id,
  name,
  type,
  element,
  folder,
  enabled
FROM #__extensions
WHERE LOWER(CONCAT_WS(' ', name, type, element, folder))
      REGEXP 'name-der-erweiterung';

Das ermöglicht eine wichtige Unterscheidung:

Erweiterung noch installiert

Dann sollten die zugehörigen Tabellen nicht einfach gelöscht werden.

Auch eine deaktivierte Erweiterung kann weiterhin vollständig installiert sein.

Erweiterung nicht mehr installiert

Existieren trotzdem noch passende Datenbanktabellen, handelt es sich sehr wahrscheinlich um Altlasten.

Vor dem Löschen sollte trotzdem geprüft werden, ob die Daten noch benötigt werden.

Manche Tabellen enthalten nicht nur Konfiguration, sondern tatsächliche Inhalte, Formulareingaben, Statistiken oder Dokumentinformationen.


6. Tabellen einer alten Erweiterung löschen

Ist eindeutig geklärt, dass eine Erweiterung nicht mehr verwendet wird und ihre Daten ebenfalls nicht mehr benötigt werden, können die verbliebenen Tabellen entfernt werden.

Die vorhandenen Tabellen lassen sich zunächst anzeigen:

SHOW TABLES LIKE '%extensionname%';

Eine nützliche Variante erzeugt zunächst nur die passenden DROP TABLE-Befehle:

SELECT CONCAT(
  'DROP TABLE `',
  table_name,
  '`;'
) AS drop_sql
FROM information_schema.tables
WHERE table_schema = DATABASE()
  AND table_name LIKE '%extensionname%';

Die erzeugten Befehle können anschließend überprüft werden.

Erst danach sollte tatsächlich gelöscht werden.

Beispiel:

DROP TABLE IF EXISTS
  `prefix_extensionname`,
  `prefix_extensionname_files`,
  `prefix_extensionname_statistics`;

Das ist sicherer, als Tabellen anhand eines vermuteten Namensschemas automatisch zu entfernen.


7. Nicht jede große Tabelle ist eine Altlast

Eine wichtige Erkenntnis bei solchen Aufräumarbeiten:

Große Tabellen sind nicht automatisch überflüssig.

Zu Joomla selbst gehören beispielsweise Tabellenfamilien für Funktionen wie:

#__finder_*
#__redirect_links
#__action_logs*
#__workflow_*
#__scheduler_*
#__guidedtours*
#__history

Auch installierte Drittanbieter-Erweiterungen können große Tabellen besitzen, etwa für:

Solche Tabellen sollten nicht entfernt werden, solange die zugehörige Funktion oder Erweiterung noch verwendet wird.

Hier ist gegebenenfalls eine Bereinigung der Inhalte sinnvoller als das Löschen der gesamten Tabelle.


8. Was bedeutet „Discover“ in Joomla?

Unter

System → Discover

kann Joomla Erweiterungen anzeigen, die im Dateisystem gefunden werden, aber nicht regulär als installierte Erweiterungen registriert sind.

Das ist etwas anderes als eine übrig gebliebene Datenbanktabelle.

Ein Discover-Eintrag bedeutet im Kern:

Joomla findet Dateien einer Erweiterung, aber der entsprechende Installationszustand passt nicht dazu.

Solche Reste können beispielsweise in Verzeichnissen liegen wie:

administrator/components/
components/
plugins/
modules/
administrator/modules/

Das erklärt auch, warum eine längst deinstallierte Erweiterung weiterhin unter „Discover“ auftauchen kann.

Ihre Datenbanktabellen können bereits verschwunden sein, während Teile der Erweiterung noch auf dem Webserver liegen.


9. Discover-Einträge bereinigen

Ein Discover-Eintrag sollte nicht einfach blind entfernt werden.

Zunächst muss geklärt werden:

  1. Wird die Erweiterung noch verwendet?
  2. Ist sie regulär installiert?
  3. Handelt es sich tatsächlich nur um übrig gebliebene Dateien?

Wenn eindeutig feststeht, dass die Erweiterung nicht mehr gebraucht wird, können die zugehörigen Dateireste entfernt werden.

Dabei reicht es nicht immer, nur

administrator/components/com_beispiel

zu löschen.

Eine Erweiterung kann zusätzlich Dateien in weiteren Bereichen besitzen, beispielsweise:

components/com_beispiel
plugins/...
modules/...
administrator/modules/...

Nach dem Entfernen der verbliebenen Erweiterungsdateien sollte Joomla sie bei einer erneuten Discover-Suche nicht mehr erkennen.

Datenbankreste und Discover-Einträge sind damit zwei getrennte Baustellen:


10. Was kann aus dem Joomla-tmp-Verzeichnis gelöscht werden?

Auch im Joomla-Verzeichnis

tmp/

können sich über Jahre Dateien ansammeln.

Joomla verwendet dieses Verzeichnis als temporären Arbeitsbereich, unter anderem bei Installationen und Updates von Erweiterungen.

Dort können beispielsweise liegen:

Alte Inhalte dieses Verzeichnisses können in der Regel entfernt werden, wenn gerade

läuft.

Der Ordner tmp selbst sollte dagegen bestehen bleiben.

Auch sollte der konfigurierte tmp-Pfad nicht verändert werden, wenn die Installation korrekt funktioniert.


11. Sinnvolle Reihenfolge beim Aufräumen

Für eine ältere Joomla-Installation hat sich folgende Reihenfolge als übersichtlich erwiesen:

1. Backup erstellen

Vor Änderungen an Datenbank oder Dateisystem.

2. Tabellen nach Größe analysieren

Mit information_schema.tables.

3. Extrem große technische Tabellen untersuchen

Zum Beispiel #__session.

4. Installationsstatus von Erweiterungen prüfen

Über #__extensions.

5. Verwaiste Datenbanktabellen identifizieren

Nur löschen, wenn die Erweiterung sicher nicht mehr benötigt wird.

6. Joomla „Discover“ kontrollieren

Übrig gebliebene Erweiterungsdateien identifizieren.

7. Dateireste entfernen

Dabei alle zugehörigen Erweiterungspfade berücksichtigen.

8. tmp bereinigen

Nur alte temporäre Inhalte entfernen, nicht den Ordner selbst.


Ergebnis

Bei einer über Jahre gewachsenen Joomla-Installation lohnt sich ein systematisches Aufräumen.

Der größte Speicherverbrauch muss dabei nicht einmal von alten Erweiterungen kommen. Im beschriebenen Praxisfall war zunächst die Session-Tabelle das deutlichste Problem: Millionen alter Sessions hatten sich angesammelt.

Gleichzeitig zeigte die Analyse, dass zwischen verschiedenen Arten von Altlasten unterschieden werden muss:

Wer diese Bereiche getrennt betrachtet und Änderungen jeweils vorher überprüft, kann eine alte Joomla-Installation erheblich aufräumen, ohne dabei versehentlich noch verwendete Komponenten oder Daten zu entfernen.