Gerencio um grande banco de dados (algumas centenas de shows) contendo tabelas com várias funções, algumas delas com milhões de registros. Algumas tabelas recebem apenas um grande número de inserções e exclusões, outras poucas inserções e grande número de atualizações.
O banco de dados é executado no PostgreSQL 8.4 em um sistema Debian 6.0 amd64 com 16 gigabytes de RAM.
A questão é, às vezes, o processo de autovacuum em uma tabela, que leva muito tempo (dias) para ser concluído. Quero poder dizer quanto tempo um determinado comando a vácuo levará para poder decidir se o cancelo ou não. Além disso, se houvesse um indicador de progresso para as operações de vácuo do postgres, seria realmente útil.
Editar:
Não estou procurando uma solução à prova de balas. Apenas uma dica aproximada sobre o número de tuplas mortas ou bytes de E / S necessários é suficiente para decidir. É realmente irritante não ter idéia de quando VACUUM
vai terminar, qualquer que seja.
Eu vi que pg_catalog.pg_stat_all_tables
tem uma coluna para o número de tuplas mortas. Portanto, é possível ter uma estimativa, mesmo que isso signifique que a pessoa tenha que estar ANALYZE
na tabela antes. Por outro lado, autovacuum_vacuum_threshold
e autovacuum_vacuum_scale_factor
as configurações sozinho provar que postgres si sabe algo sobre a quantidade de mudança nas mesas e provavelmente coloca nas mãos do DBA também.
Não tenho certeza de qual consulta executar, porque quando executo VACUUM VERBOSE
, vejo que não apenas as tabelas, mas os índices nelas também estão sendo processados.
fonte
VACUUM FULL
9.0+, pois reescreve completamente a tabela. Também deve funcionar regularmenteVACUUM
, mas ainda não o testei. Poisautovacuum
funcionaria se você fosse capaz de capturar o processo de trabalho de autovacuum em uma determinada tabela, mas não sei como conseguir isso.Isso é muito difícil de determinar. Você pode ajustar o vácuo automático para ser mais agressivo ou mais suave. Mas quando definido como moderado e está atrasado e a carga básica de E / S é muito alta, pode acontecer que ele nunca atinja um estado de vácuo adequado - então você vê o processo em execução e executando e executando. Além disso, edições posteriores do PostreSQL têm recursos aprimorados de autovacuum, isso por si só pode ser suficiente para mudar para um deles (de preferência 9.2 como o mais recente).
A barra de progresso parece uma boa ideia, mas imagino que não seja tão fácil de implementar de maneira significativa. Como você tem carga constante em suas tabelas, é bem possível que o progresso esteja aparentemente voltando para trás (quero dizer que a contagem de linhas mortas / porcentagem aumenta em vez de diminuir) - então que conclusão você tira?
fonte
VACUUM ANALYZE VERBOSE
pelo menos imprime alguma atividade no console, como faz. É melhor do que apenas olhar para um prompt estático, perguntando se algo está parado por horas.VACUUM
, não para o vácuo automático, mas ainda é algo.Em nossa produção, uma das maiores tabelas tinha esse log:
Esse é de longe o pior consumo de recursos, todas as outras tabelas levaram menos de 2 s.
Para ver esses tipos de logs, você deve executar isto:
(por 5 ms), recarregue o arquivo de configuração.
fonte
Achei este post e este post úteis, mas, como outros mencionaram, pode ser difícil calcular o progresso geral do vácuo, uma vez que o processo envolve algumas operações separadas.
Eu uso essa consulta para monitorar o progresso da verificação da tabela do vácuo, que parece ser a maior parte do trabalho:
No entanto, isso não inclui a verificação de índice, que acontece depois e pode levar tanto tempo, se não mais, se você tiver uma tonelada de índices. Infelizmente, não consigo encontrar uma maneira de monitorar a varredura / aspiração de índice.
fonte