# Shopware-Datenbank aufräumen: Anleitung und Handbuch

> Handbuch zum Datenbank Cleanup & Optimizer für Shopware: Installation, Cleanup-Bereiche, Dry-Run, Aufbewahrung, CLI-Befehle und FAQ.

Quelle / Source: https://stoneandwater.online/de/handbuch-datenbank-cleanup.html

# Datenbank Cleanup & Optimizer Handbuch.

So räumst du deine Shopware-Datenbank planbar und sicher auf - mit Dry-Run, Audit-Log und geplanten Tasks.
[Zum Plugin: Datenbank Cleanup & Optimizer](https://stoneandwater.online/de/db-cleaner.html)

#### Inhalt

/

## 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:

- Datenbank-Backup anlegen.

- 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.

## 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 aktivieren** Standard: aus
Wenn aktiv, läuft das Cleanup im konfigurierten Intervall via Scheduled Task.

**Intervall** Standard: 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-Modus** Standard: 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 anzeigen** Standard: 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

Monatlich 4,99 €
Bester Preis Jährlich 50,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.
[Plugin Suite herunterladen](https://stoneandwater.online/de/plugin-suite.html)[+49 2555 9997342](tel:+4925559997342)

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.
[Zur Produktseite](https://stoneandwater.online/de/db-cleaner.html)[Beratung anfragen](https://stoneandwater.online/de/kontakt.html)
