Automatizar a criação e a retenção de partições com pg_partman
PostgreSQLParticionamentoComando
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);O que faz
Registra uma tabela pai no pg_partman; cria antecipadamente as partições futuras, remove as que passaram do período de retenção e informa as linhas que caíram na partição default.
Quando usar
Quando você precisa de uma automação padronizada e observável em vez de gerenciar partições diárias/mensais à mão ou com scripts próprios (tabelas de log, métricas, eventos).
Atenção
A API mudou entre o pg_partman 4.x e o 5.x: no 5.x p_type aceita apenas 'range'/'list' (padrão 'range'), e o p_type := 'native' do 4.x é inválido; verifique a versão instalada com SELECT extversion FROM pg_extension WHERE extname = 'pg_partman';. create_parent também cria uma partição default por padrão. retention_keep_table = false faz DROP definitivo das partições; se você precisa de um arquivo, mantenha-o true e use retention_schema. Se run_maintenance_proc() não estiver agendado, nenhuma partição nova é criada e os dados caem na default. pg_partman_bgw exige shared_preload_libraries mais um restart.
Relacionados
- Criar uma tabela particionada por range mensal (gerar as partições em um loop)
- Anexar uma tabela preparada como partição com um lock curto (ATTACH PARTITION)
- Desanexar uma partição antiga sem bloquear o tráfego em produção (DETACH CONCURRENTLY)
- Armadilha da partição default: nova partição falha com 'would be violated by some row'
- Verificar se o partition pruning funciona (em tempo de planejamento e de execução)