Eu tenho uma tabela de relatórios que tem literalmente milhões, senão centenas de milhões de registros de relatórios, que datam de 2011. Acho que está diminuindo exponencialmente minhas consultas. Eu só quero manter os relatórios dos últimos 6 meses. Eu tenho uma coluna de tempo na tabela de relatórios que fornece a hora atual para que eu possa usá-la para medir relatórios com mais de 6 meses. Então, estou pensando em executar algum tipo de trabalho cron no meu servidor ubuntu no qual o servidor postgresql está instalado. Mas estou procurando alguma orientação sobre como fazer isso.
relate perguntas
-
Posso ativar o PITR depois que o banco de dados foi usado
-
Práticas recomendadas para executar a replicação atrasada do deslocamento de tempo
-
Os procedimentos armazenados impedem a injeção de SQL?
-
Sequências Biológicas do UniProt no PostgreSQL
-
Qual é a diferença entre a replicação do PostgreSQL 9.0 e o Slony-I?
Recentemente, configurei uma solução de arquivamento semelhante. Os números e o destino são um pouco diferentes (este último movendo dados antigos para uma partição de arquivo), mas a ideia é a mesma.
Primeiro, você precisará de um índice no carimbo de data/hora, para localizar rapidamente as linhas a serem excluídas. Para evitar travamentos excessivos e consequente bloqueio de outros processos, isso é feito preferencialmente com a
CONCURRENTLY
opção.Em segundo lugar, você deve manter sua tabela organizada limpando-a regularmente - se você tiver uma versão relativamente recente do PostgreSQL, há chances de que o banco de dados cuide disso com
autovacuum
.A
DELETE
declaração real será bastante simples. No meu caso, utilizo uma função para isso, para que possamos manter a lógica do banco de dados sob controle de versão. Isso pode parecerVocê precisará de um script (digamos, um script bash), que simplesmente chama a instrução, como
A única coisa que resta é configurar uma tarefa cron que chama esse script nos intervalos desejados.
Ainda há uma coisa a considerar, ou seja, que a primeira exclusão seria enorme. Eu evitaria isso excluindo a grande quantidade de dados antigos em blocos de tamanho adequado, novamente para evitar o bloqueio de outros processos que desejam acessar a tabela. O tamanho desses pedaços pode ser muito diferente com base em suas circunstâncias. Observe que este é mais ou menos um processo manual, a menos que você já tenha um 'chunker' em uso (como nós).