DBAtlas · Atlas de operaciones de bases de datos

Desconectar una partición antigua sin bloquear el tráfico activo (DETACH CONCURRENTLY)

PostgreSQLParticionamiento

Comando

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

Qué hace

Desconecta la partición en dos transacciones; toma solo SHARE UPDATE EXCLUSIVE sobre el padre, por lo que no bloquea las consultas en curso, y añade a la tabla desconectada una restricción CHECK equivalente al límite de la partición.

Cuándo usarlo

Al desconectar periodos antiguos en un sistema en producción por retención/archivado (seguido de DROP, un traslado a otro tablespace o un archivo con pg_dump).

Precaución

No se puede ejecutar dentro de un bloque BEGIN ... COMMIT ni usar cuando el padre tiene una partición default. Espera a todas las transacciones que usan el padre y empezaron antes que él; las transacciones largas lo prolongan. Si se interrumpe, la partición queda oculta a las consultas pero no desconectada ('detach pending') y debe completarse con FINALIZE. Un DETACH normal sin CONCURRENTLY es más rápido pero necesita ACCESS EXCLUSIVE sobre el padre; pruébelo con lock_timeout.

Abrir en DBAtlas →

Relacionado