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:
- Welche Tabellen belegen besonders viel Speicher?
- Welche Tabellen gehören zum Joomla-Core?
- Welche stammen von noch installierten Erweiterungen?
- Welche sind wahrscheinlich Reste längst deinstallierter Erweiterungen?
- Was bedeutet die lange Liste unter „Discover“?
- Können temporäre Dateien im Joomla-Verzeichnis gelöscht werden?
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:
- Tabellenname
- verwendete Storage Engine
- ungefähre Anzahl der Datensätze
- Größe von Daten und Indizes
- Erstellungs- und Änderungszeitpunkte, soweit verfügbar
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:
- bestehende Sessions gehen verloren,
- Administratoren müssen sich gegebenenfalls neu anmelden,
- Dateien, Bilder und Inhalte werden nicht gelöscht.
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:
- Statistiken
- Revisionen
- Suchindizes
- Formulardaten
- Dateiverwaltung
- Protokolle
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:
- Wird die Erweiterung noch verwendet?
- Ist sie regulär installiert?
- 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:
- alte Tabellen → Datenbank
- Discover-Einträge → meist übrig gebliebene Dateien beziehungsweise ein inkonsistenter Installationszustand
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:
- heruntergeladene Installationsarchive,
- entpackte Erweiterungen,
- Reste abgebrochener Installationen,
- andere temporäre Dateien.
Alte Inhalte dieses Verzeichnisses können in der Regel entfernt werden, wenn gerade
- kein Joomla-Update,
- keine Erweiterungsinstallation,
- kein Restore
- und kein anderer Wartungsvorgang
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:
- alte Session-Daten,
- Tabellen deinstallierter Erweiterungen,
- Tabellen weiterhin installierter Erweiterungen,
- Dateireste im Joomla-Dateisystem,
- Discover-Einträge,
- temporäre Dateien.
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.