Datenbank Cleanup & Optimizer Handbuch.

So räumst du deine Shopware-Datenbank planbar und sicher auf - mit Dry-Run, Audit-Log und geplanten Tasks.

Systemvoraussetzungen

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.

CLI-Befehle

bin/console staw:order-versions:analyze bin/console staw:order-versions:clean --age-days=7 --batch-size=50000

Der erste Befehl zeigt nur an, was gelöscht würde. Der zweite räumt tatsächlich auf, mit Fortschrittsanzeige im Terminal.

Alle Optionen

--age-days, -a Standard: 7
Mindestalter in Tagen.
--batch-size, -b Standard: 50000
Zeilen pro DELETE-Batch.
--dry-run, -d
Nur anzeigen, nichts löschen.
--force, -f
Überspringt die interaktive Rückfrage.

Empfohlener erster Lauf

Wenn die Tabellen bereits Probleme machen, hat sich dieser Ablauf bewährt:

  1. Datenbank-Backup anlegen.
  2. Die Konsole nutzen statt der Oberfläche - kein HTTP-Timeout, robuster und mit Fortschrittsanzeige.
bin/console staw:order-versions:clean --age-days=7 --batch-size=250000 --force

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.

Ü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 €
Halbjährlich24,99 €17 % günstiger
Bester PreisJährlich44,99 €25 % günstiger

Alle Preise netto zzgl. USt.

Du kaufst die Lizenz direkt bei uns und bekommst eine Rechnung von uns. Installation per Upload im Admin ohne SSH, Updates über unsere Lizenzplattform, Support direkt vom Entwickler.

Direkt anfragen +49 2555 9997342

Shopware Store

In Vorbereitung

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.