Automatizar la creación y la retención de particiones con pg_partman
PostgreSQLParticionamientoComando
CREATE SCHEMA partman;
CREATE EXTENSION pg_partman SCHEMA partman;
CREATE TABLE public.measurements (
id bigint GENERATED ALWAYS AS IDENTITY,
ts timestamptz NOT NULL,
value numeric,
PRIMARY KEY (id, ts)
) PARTITION BY RANGE (ts);
-- Daily partitions, pre-create 7 days ahead (pg_partman 5.x syntax)
SELECT partman.create_parent(
p_parent_table := 'public.measurements',
p_control := 'ts',
p_interval := '1 day',
p_premake := 7
);
-- Drop partitions older than 30 days
UPDATE partman.part_config
SET retention = '30 days',
retention_keep_table = false
WHERE parent_table = 'public.measurements';
-- Maintenance: run periodically (schedule with pg_cron or pg_partman_bgw)
CALL partman.run_maintenance_proc();
-- Any rows in the default partition?
SELECT * FROM partman.check_default(p_exact_count := true);Qué hace
Registra una tabla padre en pg_partman; crea de antemano las particiones futuras, elimina las que superan el periodo de retención e informa de las filas que han caído en la partición default.
Cuándo usarlo
Cuando necesita una automatización estándar y observable en lugar de gestionar a mano o con scripts propios las particiones diarias/mensuales (tablas de logs, métricas, eventos).
Precaución
La API cambió entre pg_partman 4.x y 5.x: en 5.x p_type solo acepta 'range'/'list' (por defecto 'range'), y el p_type := 'native' de 4.x no es válido; compruebe la versión instalada con SELECT extversion FROM pg_extension WHERE extname = 'pg_partman';. create_parent también crea por defecto una partición default. retention_keep_table = false hace DROP definitivo de las particiones; si necesita un archivo, déjelo en true y use retention_schema. Si run_maintenance_proc() no está programado, no se crean particiones nuevas y los datos caen en la default. pg_partman_bgw requiere shared_preload_libraries más un reinicio.
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)
- Desconectar una partición antigua sin bloquear el tráfico activo (DETACH CONCURRENTLY)
- 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)