Wartung von RANGE-Partitionen: künftige Partitionen hinzufügen, alte archivieren / löschen
MySQLPartitionierungBefehl
-- Current partitions
SELECT PARTITION_NAME, PARTITION_DESCRIPTION, TABLE_ROWS
FROM information_schema.PARTITIONS
WHERE TABLE_SCHEMA = 'shop' AND TABLE_NAME = 'events_log' ORDER BY PARTITION_ORDINAL_POSITION;
-- Add a new month by splitting the empty pmax
ALTER TABLE shop.events_log REORGANIZE PARTITION pmax INTO (
PARTITION p2026_11 VALUES LESS THAN ('2026-12-01'),
PARTITION pmax VALUES LESS THAN (MAXVALUE));
-- Move the old month into an archive table (instant), then drop the empty partition
CREATE TABLE shop.events_log_2026_08 LIKE shop.events_log;
ALTER TABLE shop.events_log_2026_08 REMOVE PARTITIONING;
ALTER TABLE shop.events_log EXCHANGE PARTITION p2026_08 WITH TABLE shop.events_log_2026_08;
ALTER TABLE shop.events_log DROP PARTITION p2026_08;
-- Pruning check: the partitions column should list a single partition
EXPLAIN SELECT * FROM shop.events_log WHERE created >= '2026-10-01' AND created < '2026-11-01';Was es tut
Fügt bei einer nach Datum RANGE-partitionierten Tabelle die Partition der nächsten Periode hinzu, verschiebt eine alte Periode per EXCHANGE in Millisekunden in eine separate Tabelle und löscht die Partition weit günstiger als mit DELETE.
Wann einsetzen
Für monatliche Aufbewahrung und Archivierung bei wachsenden Tabellen wie Logs, Events und Audit-Trails.
Vorsicht
Die Partitionierungsspalte muss Teil jedes Unique Key sein (PK eingeschlossen). REORGANIZE PARTITION pmax schreibt die Daten in pmax neu; halte pmax leer und lege Partitionen im Voraus an (z. B. 3 Monate). DROP PARTITION ist nicht rückgängig zu machen und wird nicht zeilenweise protokolliert; auf Replicas läuft es als DDL. Das EXCHANGE-Ziel muss dieselbe Struktur haben und darf nicht partitioniert sein; Zeilen außerhalb des Bereichs führen zu einem Fehler (WITHOUT VALIDATION ist schneller, kann aber falsche Daten einlassen). Partitions-DDL nimmt einen Metadata Lock auf Tabellenebene. Für Pruning die Partitionierungsspalte in WHERE verwenden, ohne sie in eine Funktion zu packen.