Eu tenho um problema em que parece que algumas tabelas grandes no meu banco de dados não estão sendo aspiradas pelo autovacuum deamon. Aqui está o que estou vendo:
SELECT schemaname, relname, n_live_tup, n_dead_tup, last_autovacuum
FROM pg_stat_all_tables
ORDER BY n_dead_tup DESC LIMIT 5;
+------------+-----------------------------+------------+------------+-------------------------------+
| schemaname | relname | n_live_tup | n_dead_tup | last_autovacuum |
+------------+-----------------------------+------------+------------+-------------------------------+
| md | calculation_log_item | 35989527 | 3559253 | 2020-07-13 03:41:37.49764-04 |
| audit | transaction_statement | 700356 | 557278 | NULL |
| audit | record_history | 701635 | 438849 | NULL |
| md | program_requirement_state | 193500 | 29204 | 2020-07-14 03:06:02.339032-04 |
| md | calculation_log | 157942 | 11792 | NULL |
+------------+-----------------------------+------------+------------+-------------------------------+
(5 rows)
Portanto, está claro que o daemon está em execução porque há valores na noite passada (nota: estou postando isso em 14/07/2020). Mas não consigo descobrir por que transaction_statement e record_history não são. Eles têm muitas tuplas mortas em comparação com as vivas.
Estou usando o PostgreSQL v11. Aqui estão as informações da versão completa:
select version();
+---------------------------------------------------------------------------------------------------------------------------------+
| version |
+---------------------------------------------------------------------------------------------------------------------------------+
| PostgreSQL 11.8 (Ubuntu 11.8-1.pgdg18.04+1) on x86_64-pc-linux-gnu, compiled by gcc (Ubuntu 7.5.0-3ubuntu1~18.04) 7.5.0, 64-bit |
+---------------------------------------------------------------------------------------------------------------------------------+
(1 row)
O que poderia estar causando isso? Por favor, adicione um comentário se você acha que minha pergunta é vaga ou precisa de informações adicionais para responder (como configurações do postgresql.conf, etc).
Pode haver várias razões para o autovacuum não aspirar a mesa:
um parâmetro de armazenamento de tabela está configurado diferente do padrão:
enable_autovacuum = off
,autovacuum_vacuum_scale_factor
é absurdamente alto ou similar.Descubra observando a
\d+
saída da tabela empsql
.a taxa de mudança na mesa é tão alta que o autovacuum simplesmente não consegue acompanhar.
Este é o caso se você encontrar trabalhadores de autovacuum em execução para a mesa que nunca terminam. O remédio é baixar
autovacuum_vacuum_cost_delay
.corrupção de dados na tabela ou seus índices fazem com que o autovacuum falhe com um erro, para que ele nunca termine de processar a tabela. Olhe para o arquivo de log para diagnosticar isso.