Expiração automática (exclusão) de registros antigos no Postgres

15

O Postgres possui algum recurso para oferecer suporte a registros antigos antigos?

Desejo usar o Postgres para registrar, como uma espécie de fila, em que os registros (eventos de log) com mais de duas semanas são excluídos automaticamente.

Basil Bourque
fonte
Use o particionamento. A exclusão de registros não reduzirá o tamanho da tabela no disco.
Sivann
@sivann Sua recomendação não pressupõe que o problema seja o tamanho do disco? Se o problema dele é o tempo de execução da consulta, parece que a exclusão pode ser uma resposta possivelmente mais simples do que o particionamento, não? (ainda tentando entender isso mesmo)
stephenmm
1
O problema é simplesmente que os registros de log não são mais interessantes após um certo período de tempo. A exclusão de linhas antigas deve abrir espaço para novas linhas novas.
Basil Bourque

Respostas:

15

Não há nenhum recurso incorporado para excluir linhas automaticamente em um regime baseado em tempo (que eu saberia).

Você pode executar um cron-job diário (você decide) para agendar DELETEcomandos simples ou usar o pgAgent para essa finalidade.

Ou você pode usar o particionamento com partições semanais que herdam de uma tabela mestre , vamos chamá-lo log. Isso tornaria a exclusão muito barata : mantenha as últimas duas semanas e descarte as partições mais antigas.

Crie um RULEou um TRIGGERna tabela mestre que redireciona INSERTs para a partição da semana atual com base na hora do sistema. Sempre faça logon na tabela mestre log. Crie tabelas filho antecipadamente. Faça isso várias semanas antes para ter certeza e execute um trabalho semanal do cron que inclua futuras tabelas filho ...

Existem exemplos de código no manual .
Resposta relacionada com uma função plpgsql criando tabelas automaticamente:

A solução relacionada recria a RULEpara redirecionar INSERTs. Uma função de disparo pode gravar dinamicamente na partição atual ...

Erwin Brandstetter
fonte