DBAtlas · Atlas de operações de banco de dados

Automatizar a criação e a retenção de partições com pg_partman

PostgreSQLParticionamento

Comando

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.

Abrir no DBAtlas →

Relacionados