DBAtlas · Atlas für Datenbankbetrieb

Alte Partition aushängen, ohne den Live-Betrieb zu blockieren (DETACH CONCURRENTLY)

PostgreSQLPartitionierung

Befehl

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

In DBAtlas öffnen →

Verwandte Einträge