O Postgres tem algum recurso para suportar registros antigos?
Eu quero usar o Postgres para log, como uma espécie de fila, onde os registros (eventos de log) com mais de duas semanas são excluídos automaticamente.
O Postgres tem algum recurso para suportar registros antigos?
Eu quero usar o Postgres para log, como uma espécie de fila, onde os registros (eventos de log) com mais de duas semanas são excluídos automaticamente.
Não há recurso embutido para excluir linhas automaticamente em um regime baseado em tempo (que eu saiba).
Você pode executar um cron-job diário (você decide) para agendar
DELETE
comandos simples ou usar o pgAgent para esse propósito.Ou você pode usar o particionamento com partições semanais. Isso torna a exclusão muito barata : apenas mantenha as últimas duas semanas e descarte as partições mais antigas.
Antes do Postgres 10, o particionamento era sempre baseado em herança . O novo particionamento declarativo tem muitas vantagens e é aprimorado ainda mais a cada lançamento. A herança ainda oferece uma vantagem importante, no entanto. O manual:
Ou seja, adicionar ou remover uma partição não interfere nos leitores e gravadores de outras partições com herança, enquanto tudo é bloqueado com particionamento declarativo (ao passar pela tabela pai). É uma operação muito rápida , no entanto.
Com herança , crie partições que herdam de uma tabela "mestre" , vamos chamá-la de
log
. Crie umRULE
ou umTRIGGER
na tabela mestra que redirecione os INSERTs para a partição da semana atual com base na hora do sistema.De qualquer forma, você sempre pode fazer login na tabela mestre
log
. Crie partições com antecedência. Faça isso com várias semanas de antecedência para ter certeza e execute um trabalho cron semanal que adiciona futuras tabelas filhas ...Existem exemplos de código no manual para herança e particionamento declarativo. .
Resposta relacionada com uma função plpgsql criando tabelas para herança automaticamente:
A solução relacionada recria um
RULE
para redirecionar INSERTs. Uma função de gatilho pode gravar na partição atual dinamicamente ...Parece que você usa o Postgres como banco de dados de séries temporais. Nesse caso, você pode querer considerar o TimescaleDB , que é um banco de dados de série temporal baseado no Postgres e, portanto, totalmente compatível com o Postgres.
Na escala de tempo, primeiro você precisa definir uma hipertabela (a estrutura de dados primária da escala de tempo) e, em seguida, pode configurar uma política de retenção usando o
add_retention_policy
.