Leistung und Monitoring

SQL-Abfragen zum Bereinigen verwaister Daten in der WordPress-Datenbank

Geprüft am 8 Min. Lesezeit WordPress Datenbank Performance

Eine alte WordPress-Datenbank kann Metadaten ohne zugehöriges Objekt, Revisionen und temporäre Daten ansammeln. Alt oder groß heißt nicht entbehrlich. Diese Anleitung hilft, Kandidaten zu finden und eine begrenzte Bereinigung vorzubereiten; sie ist keine Sammlung von Befehlen zum Einfügen in die Produktivumgebung.

Ein Backup vorbereiten und die Website abgrenzen

Prüfen Sie in wp-config.php die tatsächliche Datenbank und das Präfix. Die Beispiele verwenden wp_. In einer Multisite können die Benutzertabellen gemeinsam genutzt werden und jede Website hat ihren eigenen Satz Tabellen: Wenden Sie diese Beispiele nicht an, ohne diese Struktur zu prüfen.

Proben Sie auf einem Klon. Bevor Sie die Produktivumgebung bereinigen, erstellen Sie ein aktuelles Backup und kontrollieren Schreibvorgänge durch Besuche, Cron, Warteschlangen und Integrationen. Eine Wartungsseite stoppt nicht unbedingt alle diese Schreibvorgänge.

Exportieren Sie aus der WordPress-Installation in einen privaten Pfad außerhalb der Web-Stammverzeichnisse. Legen Sie in diesem Beispiel vorher ~/copias-docs mit den Rechten 700 an und prüfen Sie, dass es nicht öffentlich erreichbar ist:

umask 077
wp db export "$HOME/copias-docs/antes-limpieza.sql" &&
sha256sum "$HOME/copias-docs/antes-limpieza.sql" > "$HOME/copias-docs/antes-limpieza.sql.sha256"

Wenn der Export fehlschlägt, kann die Datei unvollständig sein: Fahren Sie nicht fort. Verwenden Sie neue Dateinamen, um kein früheres Backup zu überschreiben, laden Sie das Backup herunter und prüfen Sie eine Wiederherstellung in einer temporären Datenbank. Die Prüfsumme bestätigt die Integrität, beweist aber nicht, dass die Wiederherstellung funktioniert.

Verwaiste Beitrags-Metadaten untersuchen

Führen Sie zuerst die Zählung und eine Stichprobe in phpMyAdmin aus:

SELECT COUNT(*) AS filas_afectadas
FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;

SELECT pm.meta_id, pm.post_id, pm.meta_key
FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL
LIMIT 50;

Prüfen Sie, warum sie existieren und ob es unvollständige Importe oder Prozesse gibt. Wenn Sie bestätigt haben, dass sie entbehrlich sind, ist dies die entsprechende Löschung:

DELETE pm FROM wp_postmeta pm
LEFT JOIN wp_posts p ON pm.post_id = p.ID
WHERE p.ID IS NULL;

Bei großen Tabellen muss der Entwickler begrenzte Stapel vorbereiten und Sperren kontrollieren; führen Sie keine Massenlöschung aus, nur weil die Stichprobe klein ist.

Verwaiste Benutzer-Metadaten untersuchen

SELECT COUNT(*) AS filas_afectadas
FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL;

SELECT um.umeta_id, um.user_id, um.meta_key
FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL
LIMIT 50;

Erst nachdem Sie die Treffer, den Multisite-Kontext und das Backup geprüft haben, lautet die entsprechende Löschung:

DELETE um FROM wp_usermeta um
LEFT JOIN wp_users u ON um.user_id = u.ID
WHERE u.ID IS NULL;

Transaktionen und Caches

Wenn alle geänderten Tabellen InnoDB sind, können Sie eine einzelne geprüfte Löschung innerhalb einer Transaktion in derselben Datenbanksitzung proben:

START TRANSACTION;
-- Führen Sie ein einziges geprüftes DELETE aus und kontrollieren Sie die Anzahl.
ROLLBACK;

Verwenden Sie COMMIT erst, wenn die vorgesehenen Prüfungen abgeschlossen sind. MyISAM und Strukturänderungen bieten diese Rückkehrmöglichkeit nicht; konvertieren Sie keine Tabellen als improvisierten Schritt einer Bereinigung. Eine offene Transaktion kann Sperren halten.

Direktes SQL führt die WordPress-APIs nicht aus und aktualisiert nicht alle Caches. Invalidieren Sie nach einer geprüften Bereinigung die betroffenen Caches mit bekanntem Umfang, ohne den Redis anderer Websites wahllos zu leeren.

Leere Schlagwörter

Listen Sie die Schlagwörter einschließlich der leeren auf und prüfen Sie die Spalte count:

wp term list post_tag --hide_empty=0 --fields=term_id,name,count

Ein Wert von null ist ein Kandidat zur Prüfung, kein Löschauftrag: Es kann unveröffentlichte Inhalte oder einen redaktionellen Grund geben, das Schlagwort zu behalten. Um ein bestätigtes Schlagwort zu löschen, verwenden Sie die API über WP-CLI und ersetzen den Platzhalter durch die tatsächliche ID:

wp term delete post_tag ID_REVISADO

Löschen Sie Taxonomie-Beziehungen nicht direkt per SQL. Prüfen Sie anschließend Links, Navigation und verwandte Inhalte.

Beiträge, deren Autor nicht mehr existiert

Löschen Sie sie nicht und weisen Sie nicht alle Inhaltstypen ungeprüft neu zu. Mit dieser Abfrage finden Sie Kandidaten:

SELECT p.ID, p.post_type, p.post_status, p.post_title, p.post_author
FROM wp_posts p
LEFT JOIN wp_users u ON p.post_author = u.ID
WHERE u.ID IS NULL
LIMIT 50;

Manche Einträge können legitim den Autor 0 verwenden. Für einen Beitrag, dessen Autorschaft korrigiert werden muss, wählen Sie einen gültigen Benutzer und verwenden die Bearbeitung in WordPress oder wp post update mit den geprüften IDs. So laufen die Vorgänge der Anwendung, die ein direktes UPDATE auslassen würde.

Revisionen und Transients

Um alte Revisionen zu prüfen, verwenden Sie ein UTC-Datum, das zur Spalte passt:

SELECT ID, post_parent, post_modified_gmt
FROM wp_posts
WHERE post_type = 'revision'
  AND post_modified_gmt < DATE_SUB(UTC_TIMESTAMP(), INTERVAL 10 DAY)
ORDER BY ID
LIMIT 50;

Zehn Tage sind nur ein Beispiel. Legen Sie die Aufbewahrung nach Ihrem Bedarf fest und löschen Sie ausgewählte Revisionen mit einem Werkzeug, das die WordPress-APIs verwendet, statt Zeilen aus wp_posts en bloc zu löschen und ihre Metadaten zurückzulassen.

So prüfen Sie Transients, ohne ihre Werte anzuzeigen, und entfernen anschließend nur die abgelaufenen:

wp transient list --fields=name,expiration
wp transient delete --expired

Die Liste enthält auch nicht abgelaufene Transients; prüfen Sie deren Ablaufzeit. Bei persistentem Cache oder Multisite prüfen Sie den Wirkungsbereich des Werkzeugs, bevor Sie interpretieren, was in den Tabellen erscheint.

Prüfen Sie zum Abschluss Frontend, Backend, Benutzer, Bestellungen und Aufgaben. Bewahren Sie das Backup während der Beobachtungszeit auf. Wenn Sie wiederherstellen müssen, koordinieren Sie neue Schreibvorgänge, damit keine Bestellungen oder Änderungen nach dem Backup verloren gehen.

Das könnte Ihnen auch helfen

Stimmt etwas nicht oder hat sich etwas geändert? Erzählen Sie es uns, und wir prüfen es.