Shopware 6.7, PHP 8.1 oder neuer, MySQL ab 5.7.4 beziehungsweise MariaDB ab 10.3 - letzteres wegen der Session-Timeouts über MAX_EXECUTION_TIME. Für die automatische Bereinigung muss ein Worker laufen.
Installation
Plugin im Shopware-Admin hochladen, installieren und aktivieren. Danach erscheint das Modul unter Erweiterungen, Datenbank Cleanup & Optimizer.
Modul öffnen
Das Modul zeigt die aktuelle Lage, die manuelle Bereinigung, die Einstellungen für den automatischen Lauf und das Protokoll.
Das Problem: verwaiste Bestell-Versionen
Jedes Mal, wenn im Admin eine Bestellung bearbeitet wird, legt Shopware eine Arbeitskopie an - einen Draft. Wird die Bearbeitung abgebrochen statt gespeichert, bleibt dieser Draft in den Tabellen order und order_line_item liegen.
Über Monate summiert sich das. Irgendwann laufen Admin-Formulare wie die Vorgangspositionen in Timeouts, weil sie sich durch zehntausende verwaister Zeilen arbeiten müssen. Genau diese Zeilen entfernt das Plugin.
Löschkriterium im Detail
Gelöscht wird ausschließlich, was beide Bedingungen erfüllt:
WHERE version_id != UNHEX('0fa91ce3e96a4bc2be4bd9ce752c3425')
AND COALESCE(updated_at, created_at) < NOW() - INTERVAL X DAY
Live-Version geschützt
Die aktuelle, sichtbare Bestellung mit der Version 0fa91ce3... wird nie angefasst.
Altersfilter
Standard sind sieben Tage. Das schützt Bearbeitungen, die gerade laufen.
Was unberührt bleibt
Bestellstatus bleiben erhalten: Bestell-, Zahlungs- und Lieferstatus stehen in state_machine_history und sind nicht versionsgebunden. Sie werden nicht angefasst.
Abhängige Tabellen wie order_address, order_delivery und order_transaction räumen sich über die Fremdschlüssel automatisch mit auf. Es bleiben also keine Reste zurück.
Aktuelle Lage
Der obere Bereich zeigt live, wie viele verwaiste Bestell- und Positionsversionen existieren und wie viele davon älter als sieben Tage sind. Das ist der ehrliche Blick darauf, ob sich ein Lauf überhaupt lohnt.
Manuelle Bereinigung
Mindestalter
In Tagen, wie beim Altersfilter beschrieben.
Batch-Größe
Zeilen pro DELETE, zwischen 100 und 1.000.000.
Vorschau
Zeigt, was gelöscht würde, ohne etwas zu löschen.
Die Vorschau vor dem ersten scharfen Lauf zu nutzen, ist sinnvoll - sie kostet nichts und zeigt die Größenordnung.
Automatische Bereinigung
Optional läuft die Bereinigung selbstständig. Einstellbar sind das Intervall - stündlich, alle 2, 6 oder 12 Stunden, täglich oder wöchentlich - sowie das Mindestalter und die Aufbewahrungsdauer der Protokolleinträge.
Voraussetzung: Der Scheduled Task läuft nur, wenn ein Worker aktiv ist, also der Admin-Worker oder messenger:consume. Ohne Worker passiert nichts.
Protokoll
Jeder echte Lauf wird protokolliert, egal ob er aus dem Admin, per Konsole oder automatisch angestoßen wurde. Festgehalten werden Zeitpunkt, Auslöser, Benutzer, Anzahl gelöschter Zeilen und Dauer.
Laufenden Vorgang abbrechen
Während eines Laufs zeigt der Fußbereich einen Sekundenzähler. Der Vorgang lässt sich jederzeit abbrechen; bereits laufende DELETE-Batches werden noch sauber zu Ende geführt, damit die Datenbank konsistent bleibt.
Idealerweise in einer tmux- oder screen-Sitzung, damit der Lauf einen Verbindungsabbruch übersteht. Danach die automatische Bereinigung aktivieren, täglich mit sieben Tagen Mindestalter - dann bleibt es dauerhaft sauber.
Speicherplatz freigeben
InnoDB markiert gelöschte Seiten nur als frei und gibt den Platz nicht ans Dateisystem zurück. Erst dieser Befehl holt ihn wirklich:
OPTIMIZE TABLE `order`, `order_line_item`;
Nicht im Tagesgeschäft: Der Befehl blockiert die Tabellen kurzzeitig. Führe ihn außerhalb der Geschäftszeiten aus.
Diagnose-Endpoint
Wenn ein Lauf unerwartet null Zeilen löscht, hilft dieser Endpoint bei der Ursachensuche:
GET /api/_action/staw-order-version-cleaner/diagnose
Er liefert exakte Zählungen, Beispiel-Versions-IDs und einen Test-DELETE in einer Transaktion, die sofort zurückgerollt wird. Er verändert also nichts.
Sicherheitshinweise
Vor jedem scharfen Lauf ein Datenbank-Backup anlegen. Gelöschte Zeilen sind weg.
--age-days=0 mit Vorsicht: Ohne Altersfilter können aktive Bearbeitungen zerstört werden - jemand bearbeitet gerade eine Bestellung, und der Draft wird unter ihm weggelöscht. Der Standard von sieben Tagen ist der sichere Wert.
Problemlösung
Es werden null Zeilen gelöscht
Entweder gibt es nichts zu löschen, oder alle Kandidaten sind jünger als das Mindestalter. Der Diagnose-Endpoint zeigt, was Sache ist.
Der Speicherplatz wird nicht kleiner
Das ist normal. Erst OPTIMIZE TABLE gibt den Platz frei.
Die automatische Bereinigung läuft nicht
Es fehlt ein aktiver Worker. Ohne Admin-Worker oder messenger:consume wird kein Scheduled Task ausgeführt.
Der Lauf bricht im Browser ab
Bei sehr großen Tabellen die Konsole nutzen. Die Oberfläche unterliegt dem HTTP-Timeout, das Terminal nicht.
Support
Bei Fragen zum ersten Lauf auf einer großen Datenbank helfen wir gern - schreib uns über die Kontaktseite oder an info@stoneandwater.online.
Alle Einstellungen
Jede Einstellung des Plugins mit Standardwert und Erklärung, in derselben Reihenfolge wie im Administrationsbereich. Die Texte stammen direkt aus dem Plugin (Version 1.0.24).
Manuelle Bereinigung
Mindestalter (Tage)Standard: 7
Nur Versionen älter als X Tage löschen. Standardwert 7 schützt aktive Edit-Sessions. 0 = ohne Altersfilter (Vorsicht!).
Batch-Größe (Zeilen pro DELETE)Standard: 50000
Wie viele Zeilen pro DELETE-Statement entfernt werden. Höher = schneller, aber längere Tabellen-Locks. Erlaubt: 100 bis 1.000.000. Empfehlung: 50.000 (Default), bei sehr großen Tabellen auch 100.000-250.000. Möglich sind 100 bis 1000000.
Automatische Bereinigung
Automatische Bereinigung aktivierenStandard: aus
Wenn aktiv, läuft das Cleanup im konfigurierten Intervall via Scheduled Task.
IntervallStandard: Täglich
Wie häufig das automatische Cleanup laufen soll: stündlich, alle 2, 6 oder 12 Stunden, täglich oder wöchentlich.
Mindestalter (Tage)Standard: 7
Nur Versionen löschen, die mindestens X Tage alt sind.
Protokoll-Aufbewahrung (Tage)Standard: 365
Protokoll-Einträge älter als X Tage werden automatisch entfernt. 0 = unbegrenzt aufbewahren.
Version-Commits bereinigen
Mindestalter (Tage)Standard: 7
Schutzfilter für Phase 4 (aggressive). Niedriger = mehr wird bereinigt.
Aggressiv-ModusStandard: aus
Zusätzlich ALLE non-live Commits älter als X Tage entfernen, auch wenn die zugehörige Version noch existiert. Empfohlen nach großen Bereinigungen.
log_entry
Mindestalter (Tage)Standard: 30
Löscht alle log_entry-Einträge älter als X Tage. 0 = komplette Tabelle leeren (alle Einträge).
Tabellen-Übersicht & OPTIMIZE
Minimale Größe anzeigen (MB)Standard: 10
Tabellen kleiner als X MB ausblenden.
Stark verwaiste Bestellungen
Mehr als X Versionen anzeigenStandard: 5
Listet Bestellungen auf, die mehr als X Einträge in der order-Tabelle haben (Live-Version mitgezählt).
Über den Store oder direkt bei uns.
Zwei Wege, derselbe Funktionsumfang - such dir aus, was besser zu deinem Setup passt.
Direkt über Stone & Water
Ab sofort möglich
Monatlich4,99 €
Bester PreisJährlich50,90 €15 % günstiger
Alle Preise netto zzgl. USt.
Lade die kostenlose Plugin Suite herunter und spiele sie im Admin ein, ganz ohne SSH. Darüber installierst und aktualisierst du das Plugin mit einem Klick. Die Lizenz kaufst du direkt bei uns, mit Rechnung von uns und Support direkt vom Entwickler.
Das Plugin wird im offiziellen Shopware Community Store gelistet. Installation und automatische Updates laufen dann über den Plugin Manager im Backend, die Abrechnung über deinen Shopware-Account. Sobald verfügbar, verlinken wir es hier.
Schlanke Datenbank?
Zurück zum Cleanup & Optimizer.
Alle Funktionen auf der Produktseite. Bei Einrichtung und Cleanup-Strategie helfen wir gern.