Alte Partition aushängen, ohne den Live-Betrieb zu blockieren (DETACH CONCURRENTLY)
PostgreSQLPartitionierungBefehl
-- Must run outside a transaction block
ALTER TABLE sales DETACH PARTITION sales_2026_01 CONCURRENTLY;
-- If interrupted (cancel, lost connection) the partition stays 'detach pending'; complete it:
ALTER TABLE sales DETACH PARTITION sales_2026_01 FINALIZE;
-- Any pending detach?
SELECT inhrelid::regclass AS partition_name, inhparent::regclass AS parent
FROM pg_inherits
WHERE inhdetachpending;
-- The detached table is now standalone: archive or drop it
DROP TABLE sales_2026_01;Was es tut
Hängt die Partition in zwei Transaktionen aus; nimmt auf der Parent-Tabelle nur SHARE UPDATE EXCLUSIVE, sodass laufende Abfragen nicht blockiert werden, und fügt der ausgehängten Tabelle einen der Partitionsgrenze entsprechenden CHECK-Constraint hinzu.
Wann einsetzen
Beim Aushängen alter Zeiträume auf einem Live-System für Aufbewahrung/Archivierung (gefolgt von DROP, Verschieben in einen anderen Tablespace oder einem pg_dump-Archiv).
Vorsicht
Kann nicht innerhalb eines BEGIN ... COMMIT-Blocks laufen und nicht verwendet werden, wenn die Parent-Tabelle eine Default-Partition hat. Es wartet auf alle Transaktionen, die die Parent-Tabelle nutzen und vorher begonnen haben; lange Transaktionen verlängern es. Wird es unterbrochen, bleibt die Partition für Abfragen unsichtbar, aber nicht ausgehängt ('detach pending'), und muss mit FINALIZE abgeschlossen werden. Ein einfaches DETACH ohne CONCURRENTLY ist schneller, braucht aber ACCESS EXCLUSIVE auf der Parent-Tabelle; versuche es mit lock_timeout.
Verwandte Einträge
- Monatlich Range-partitionierte Tabelle anlegen (Partitionen in einer Schleife erzeugen)
- Vorbereitete Tabelle mit kurzer Sperre als Partition einhängen (ATTACH PARTITION)
- Falle Default-Partition: neue Partition scheitert mit 'would be violated by some row'
- Prüfen, ob Partition Pruning funktioniert (Planungs- und Laufzeit)
- Anlegen und Aufbewahrung von Partitionen mit pg_partman automatisieren