Desconectar una partición antigua sin bloquear el tráfico activo (DETACH CONCURRENTLY)
PostgreSQLParticionamientoComando
-- 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.
Relacionado
- Crear una tabla particionada por range mensual (generar las particiones en un bucle)
- Conectar una tabla preparada como partición con un bloqueo breve (ATTACH PARTITION)
- Trampa de la partición default: la nueva partición falla con 'would be violated by some row'
- Verificar que el partition pruning funciona (en tiempo de planificación y de ejecución)
- Automatizar la creación y la retención de particiones con pg_partman