WordPress Datenbank reinigen

Die WordPress Datenbank ist das Herz jeder WordPress-Webseite und dient als Speicher für den reinen Textinhalt aller Beiträge, Seiten und Kommentare sowie als Konfigurationsspeicher für Optionen und Einstellungen, Benutzerinformationen aber auch für Produkte eines WooCommerce Online Shops.

Kurz gesagt: Ohne die WordPress Datenbank geht absolut garnichts, aber eine ungepflegte und vernachlässigte Datenbank voller Datenmüll und ungenutzter Tupel kann die WordPress-Performance auch ausbremsen. Deshalb ist es allerhöchste Zeit, dass wir uns den grundlegenden Aufbau der Datenbank anschauen, damit wir anschließend eine WordPress Datenbank auch gezielt reinigen und aufräumen können.

Der Aufbau der WordPress Datenbank

Unter der Haube jeder WordPress Installation arbeitet im Idealfall eine klassische MySQL-Datenbank. Auch wenn der Otto-Normal-WordPressler zu glauben vermag, dass er nicht unbedingt viel mit der Datenbank zu tun hat, täuscht der Eindruck. Denn so ziemlich jeder Arbeitsvorgang im Front- oder Backend der WordPress-Webseite beruht auf Datenbanktransaktionen. Und der smarte Entrepreneur in uns will ja zumindest wissen, womit er hier tagtäglich rumhantiert und seine EZB-Scheinchen verdient.

MySQL ist eines der am weitesten verbreiteten relationalen Datenbankverwaltungssysteme weltweit und existiert sowohl als Open-Source Variante sowie als Enterprise-Version, die für den kommerziellen Betrieb vorgesehen ist. Beide Varianten werden von Oracle verwaltet, gegründet von dem Ausnahme-Entrepreneur Larry Ellison.

Das Datenbankverwaltungssystem MySQL ist als Teil des gesamten Datenbanksystems primär für die Speicherung von Daten für Webservices im Einsatz, die häufig in Verbindung mit dem Webserver Apache und der Skriptsprache PHP eingesetzt werden. Aus diesem Umstand ergibt sich auch die Struktur der WordPress-Datenbanken, deren Attribute auf Basis der in PHP und Apache zulässigen Parameter und Objekttypen definiert werden.

Sogar Facebook, YouTube oder ein wesentlicher Teil der Google Services bauen auf MySQL auf. Wie auch immer – schauen wir uns einmal die einzelnen Tabellen und Funktionen der WordPress Datenbank an. Diese besteht aktuell aus 12 Relationen, wenn WordPress nicht durch zusätzliche Plugins oder eine WordPress Multisite erweitert wird. Denn jedes WordPress Plugin nimmt erweiternde Einträge in den Datenbanktabellen vor oder legt zusätzliche Tabellen an, die wir hier aber einmal konsequent ausblenden, um keine unnötige Verwirrung zu stiften.

[table id=2 /]

Um den Zusammenhang zwischen den Relationen besser verstehen zu können, bedienen wir uns an dieser Stelle dem offiziellen Datenbankdiagramm (WP 4.4.2 Database diagram) von WordPress, das ebenfalls hier in der Database Description zu finden ist.

WordPress Datenbank Diagramm WP4.4.2 ERD

Genug der Datenbanktheorie. Die essentielle Erkenntnis sollte aber angekommen sein. Werden die bestehenden Relationen unnötig erweitert und mit Datenmüll vollgepumpt oder werden unnötige Verknüpfungen zu weiteren Relationen geschaffen, bläht sich die ganze Datenbank auf, wird langsamer und reißt die gesamte WordPress Performance tief in den virtuellen Abgrund.

WordPress Datenbank mit phpMyAdmin verwalten

Das Tool phpMyAdmin kommt zur Datenbankadministration auf nahezu jedem Webserver konventioneller Hoster zum Einsatz und dient der Verwaltung der MySQL Datenbank auf Basis der Skriptsprache PHP. Ein wesentlicher Teil der Arbeit (die ein Standardnutzer ausführen muss) kann hier sogar über das grafische Interface (GUI) gelöst werden und muss nicht via SQL-Anweisung ausgeführt werden. Wie gesagt, ein wesentlicher Teil.

Benutzeroberfläche von phpMyAdmin in der WordPress MySQL Datenbank

Mit dem phpMyAdmin können nicht nur Datenbanktabellen angelegt, bearbeitet und gelöscht werden, sondern hier werden auch die wichtigen Datenbankbackups über die Exportfunktion ausgeführt. Übrigens: Das hier standardmäßige Datenbankpräfix wp_tablename kann je nach Installation auch anders aussehen.

Das Tabellenpräfix wird vor der WordPress Installation in der wp-config.php festgelegt. Wie du das Präfix für bessere WordPress Sicherheit veränderst, erfährst du in unserem WordPress Security Guide.

Datenbank optimieren über phpMyAdmin

Hinweis: Bevor Änderungen und Optimierungen an der Datenbank vorgenommen werden, sollte dringend ein vollständiges Datenbank-Backup über die „Exportieren“ Funktion in phpMyAdmin vorgenommen werden. So lässt sich eventuell entstehender Schaden zumindest nachträglich wieder gerade biegen.

Das Datenbankverwaltungssystem bietet eine werkseitige Funktion, mit der die Tabellen der Datenbank automatisch optimiert werden können. Dazu nutzen wir zunächst die die Funktion „Tabellen mit Überhang auswählen“ oder als PHP-Methode mysqlOptimizeTables(), die man direkt im GUI anwählen kann:

Tabellen mit Überhang auswählen

Nach der Auswahl der Funktion ermittelt phpMyAdmin alle Tabellen (Relationen) der Datenbank, die einen Überhang haben. Das hat aber weniger was mit Bundestagsmandaten als mit blockiertem Speicherplatz zu tun.

Ein Überhang kann entstehen, wenn viele Daten geändert oder auch gelöscht werden, was allgemein ja jede Datenbanktransaktion tut. Dieser Überhang ist nicht genutzter Speicher und wird sich bei zusätzlichen Transaktion vergrößern. Deshalb kann regelmäßige Datenbankoptimierung den Überhang auflösen und wertvollen Speicherplatz freigeben. Der Prozess ist in etwa vergleichbar mit der Defragmentierung von Festplatten, nur halt auf Datenbankebene.

Automatisch selektierte Tabellen mit Überhang

Nachdem die Tabellen mit Überhang markiert wurden, kann über das Drop-Down-Menü die Optimierungsfunktion gestartet werden. Aber Achtung!

*** WARNUNG! Die Actions im Drop-Down-Menü führen unmittelbar nach dem Klick die besagte Aktion aus. Hier darf man keinen Unfug bauen, ansonsten kann Unachtsamkeit zum ungewollten Löschen ganzer Relationen führen! ***

Markierte Datenbank Relationen optimieren

Nach dem Ausführen der Funktion „Optimiere Tabelle“ dauert es je nach Operationsumfang und Tabellengröße nur einige Sekunden bis wenige Minuten, bis die Operation abgeschlossen ist und die optimierten Tabellen zur Kontrolle in der Übersicht dargestellt werden:

Die von WordPress optimieren Datenbanktabellen in der Übersicht

Wie oft die Optimierung durchgeführt werden sollte, hängt dabei von der Größe der Datenbank und der Anzahl der auf ihr ablaufenden Transaktionen ab. Eine MySQL-Datenbank, in der nur nur einige Male pro Monat Transaktionen ausgeführt werden (z.B. einfügen, löschen oder bearbeiten von Datensätzen) wird kaum Optimierungspotential aufweisen, während eine hoch beanspruchte Datenbank mit vielen zehntausend Transaktionen pro Tag nahezu täglich gewartet werden könnte (man bedenke: könnte ≠ müsste).

Alte Revisionen aus der MySQL Datenbank löschen

Bei jedem Speichervorgang und dem Aktualisieren von Beiträgen, Seiten oder auch Produkten legt WordPress in der Datenbank eine Revision des Inhalts ab, damit bei Systemabstürzen, versehentlichen Veränderungen oder sonstigen Worst-Case-Sznearien eine der vorherigen Versionen wiederhergestellt werden kann. Klingt super. Ist es auch. Aber wo ist der Haken?

Jeder Revisionsvorgang legt ein eigenes Tupel in der Tabelle wp_posts an. Und zwar für jede einzelne Revision ein eigener Eintrag, also eine komplette Zeile sämtlicher Informationen wie post_date, post_content (enthält den vollständigen Text-Content der betreffenden Revision) oder anderen Attributen.

Anders gesagt: Ein simpler Klick auf den blauen Button erzeugt einen Haufen an Daten, die unsere Datenbank mit zunehmender Aktivität massiv belasten. In der täglichen Content-Arbeit mit nur 2-3 Redakteuren und einem aktiven Shop entstehen täglich bis zu mehrere hundert Revisionen.

Das können im Jahr dann rund eine halbe Million zusätzlicher Datensätze sein, die eine WordPress Datenbank unweigerlich aufblasen. Insbesondere die notorischen Sicherheits-Speicherer unter uns Content-Kuratoren nutzen die Speicherungsfunktion im unkontrollierbaren Automatismus.

Der Screenshot zeigt einen Datenbankausschnitt der Tabelle wp_posts einer kleinen Testinstallation. Die vorletzten 4 Einträge mit dem Titel „Revisionstest“ weisen den post_type „revision“ auf. Diese Tupel dienen also lediglich zur Wiederherstellung vergangener Revisionen und werden grundsätzlich nicht mehr benötigt.

Die gute Nachricht: Wir können überflüssige Revisionen einfach löschen. Zunächst sollte man allerdings sicherstellen, dass die Revisionen wirklich nicht mehr benötigt werden und alle Beiträge, Seiten oder Produkte in der jeweils aktuellsten Version gespeichert bzw. veröffentlicht sind.

Erst dann können wir in einer ruhigen (traffic-schwachen) Minute mitten in der Nacht unsere Datenbank anfassen, ein Backup erstellen und mit dem Löschen von Revisionen beginnen. Dazu begeben wir uns in die Datenbankverwaltung mit phpMyAdmin und wählen die entsprechende Tabelle wp_posts aus und aktivieren den SQL-Reiter im Menü:

Revisionen_SQL-wp_posts

Achtung: Wer bei der Installation von WordPress ein anderes Tabellenpräfix angelegt hat (also nicht wp_), muss auch bei der Eingabe des SQL-Befehls den Tabellennamen anpassen.

Der folgende SQL-Befehl wird dann in die Konsole eingefügt:

DELETE FROM wp_posts 
WHERE post_type="revision";

Ein Klick auf „ok“ öffnet noch einmal einen Bestätigungsdialog (SQL-Commands könne ja auch katastrophalen Schaden anrichten):SQL Abfrage delete FROM wp_posts

Nach erfolgreichem Ausführen der Abfrage sehen wir in der Tabellenübersicht, wie viele Datensätze bearbeitet bzw. gelöscht wurden. Im Falle unserer Testumgebung sind das immerhin schon 27 Datensätze, obwohl nur 2 Seiten und ein Beitrag betroffen waren. In einer „erwachsenen“ WordPress-Installation können hier auch durchaus 5.000, 10.000 oder 50.000 Datensätze zusammenkommen.

Anzahl der gelöschten Revisionen

Fürs nächste Mal: Anzahl der Revisionen beschränken

Der smarte WordPress-Entrepreneur schaut natürlich direkt in die Zukunft und fragt sich, wie er die Ansammlung derartiger Datenmüllhalden schon im Vorwege verhindern kann. Das geht ganz einfach. Entweder, man veröffentlicht einfach keine Beiträge, Seiten oder Artikel mehr und stattdessen lieber einen Surfshop auf den kanarischen Inseln, oder man fügt einfach den folgenden Code in die wp-config.php ein, und zwar überhalb der Zeile

/* Das war’s, Schluss mit dem Bearbeiten! Viel Spaß beim Bloggen. */
/* That’s all, stop editing! Happy blogging. */

define( 'WP_POST_REVISIONS', 5 );

Das snippet setzt den Maximalwert für die Anzahl der möglichen Revisionen auf 5 (Parameter kann frei verändert werden) und überschreibt ab dann immer die älteste Revision in absteigender Weise.

Alternativ können die Revisionen auch gänzlich deaktiviert werden (nicht empfohlen):

define( 'WP_POST_REVISIONS', false );

Mit WP_ALLOW_REPAIR WordPress Datenbank automatisch reparieren

WordPress bringt eine werkseitige Funktion mit, mit der sich die verwendete MySQL-Datenbank direkt über den WordPress-Core optimieren lässt. Dabei sucht das verwendete Skript nach Problemen in der Datenbank und repariert diese selbständig. Der Prozess ist jedoch je nach Größe der Datenbank und Anzahl der Problemfälle sehr zeitintensiv.

Daher sollte das Skript nur in wartungsfreundlichen Zeiten ausgeführt werden, zumal sich die gesamte Datenbank während der Wartungszeit im Lock-Mode befindet und für weitere schreibende Transaktionen vollständig gesperrt ist. Dieser Lock-Mode wird automatisch durch das DMBS gesetzt, um eine Isolation der betreffenden Tupel bzw. Relationen zu ermöglichen und die Integrität der Daten nicht zu gefährden.

Um das Skript zu aktivieren, fügen wir die folgende Zeile Code in die wp-config.php ein:

define('WP_ALLOW_REPAIR', true);

Nach dem Re-Upload via FTP lässt sich das Skript über die folgende URL-Struktur aktivieren:

yourdomain.com/wp-admin/maint/repair.php

Der Aufruf der URL öffnet den folgenden Dialog:

WP allow Repair Datenbankreparatur aktivieren

Nach dem Reparieren bzw. Optimieren der Datenbank (kann etwas dauern) zeigt dir WordPress noch eine Übersicht über den Status der einzelnen Tabellen:

Übersicht der optimierten WordPress Datenbank Tabellen

Auf den wichtigsten Punkt der Optimierung weist WordPress schon hin, wir machen es ebenfalls:

Die Zeile define(‚WP_ALLOW_REPAIR‘, true); muss nach erfolgter Optimierung zwingend aus der wp-config.php gelöscht, deaktiviert oder zumindest auskommentiert werden. Das Skript ist öffentlich zugänglich und kann ein erhebliches Sicherheitsrisiko darstellen!

WordPress Datenbank mit Plugin säubern

Für viele WordPress-Endanwender ist die regelmäßige Fummelei in der SQL-Datenbank nicht nur mühsam, sondern löst auch schnell die ein oder andere Panikattacke aus, wenn man hin und wieder mit kryptischen Fehlermeldungen bombardiert wird.

Aus diesem Grund neigen die meisten WP-Nutzer dazu, für jegliche Aufgaben umfangreiche Plugins zu installieren, mit der die Arbeit weitestgehend unkompliziert ausgeführt werden kann. Der Ansatz mag zwar nachvollziehbar sein, ist aus technischer Sicht aber nicht immer der richtige Weg.

Denn je mehr Plugins installiert werden, desto träger wird die WordPress-Installation.Kommen zu den Plugins noch sensible Funktionen wie Datenbankoptimierungen hinzu, steigt zudem das Sicherheitsrisiko um ein nicht zu unterschätzendes Maß an.

Veraltete und nicht mehr gepflegte Plugins sind im WordPress Universum leider Alltag. Daher verzichten wir hier auf die ausführliche Vorstellung geeigneter Plugins für die Datenbankreinigung und Optimierung. Denn hier reicht schon ein großes Core-Update von WordPress aus, um die Aktualität und Funktionalität der Datenbank-Plugins zu eliminieren. Wird das Ding vom Entwickler vernachlässigt, ist es raus aus dem Spiel.

Allerdings kann man im Plugin-Verzeichnis von WordPress natürlich einige hilfreiche Plugins finden, wenn man die entsprechenden Suchworte verwendet. Wie immer gilt: Anzahl der Installationen, Bewertungen und letzte Aktualisierung sind ein gutes Indiz dafür, ob das Plugin was taugt. WordPress-Plugins, die mehr als 6 Monate nicht aktualisiert wurden, sollten zumindest stutzig machen.