Autovacuum no PostgreSQL

Fala, galera!

Hoje vamos falar de PostgreSQL. Se você já utilizou este S.G.B.D, é muito provável que já tenha ouvido falar sobre o Autovacuum.

Mas, você sabe o que ele faz e porque ele é tão importante para a manutenção de espaço em disco, performance e até integridade do seu banco de dados?

Ao final deste post você terá uma melhor compreesão de:

  • O que é o Autovacuum;
  • Por que ele é essencial;
  • O que ele tem a ver com comandos como VACUUM FULL, ANALYZE e REINDEX;

E ainda vamos falar de uma ferramenta muito útil chamada pg_repack.

M.V.C.C.

Para entender o que é o Autovacuum, é importante entendermos como o PostgreSQL funciona quanto às atualizações de uma tabela em um banco de dados.

O PostgreSQL utiliza o sistema M.V.C.C. — Multi-Version Concurrency Control.
Isso, basicamente, significa que quando um registro é atualizado, este sistema, em vez de realmente atualizar o registro, gera uma nova versão da linha, e mantém a versão antiga.

Chamamos estas versões antigas de registros de tuplas mortas.

Com o passar do tempo, e o aumento do número de tuplas mortas, as tabelas ficam maiores, os índices ficam menos eficientes, e o desempenho do banco de dados piora.

E é aqui que o Autovacuum torna-se essencial.

Agora, sim – o que é o Autovacuum?

O Autovacuum é uma propriedade do banco de dados PostgreSQL que, para funcionar corretamente, precisa estar habilitada para realizar seu trabalho.

Basicamente, o Autovacuum executa automaticamente duas ações em segundo plano.

  1. VACUUM – Marca as tuplas mortas como reutilizáveis, liberando espaço interno para novas atualizações.
  2. ANALYZE – Atualiza estatísticas para ajudar o otimizador a planejar melhor as queries.

Essas ações são leves, não causam bloqueios e não precisam ser agendadas. Mas, precisam ser configuradas.

Como configurar o Autovacuum?

Você pode fazer as principais configurações por meio dos seguintes parâmetros, que permitem ajustar o comportamento do sistema conforme sua necessidade:

  • autovacuum_vacuum_threshold: número mínimo de tuplas mortas para acionar o vacuum.
  • autovacuum_vacuum_scale_factor: percentual da tabela que, se tiver tuplas modificadas, dispara o vacuum.
  • autovacuum_analyze_threshold e autovacuum_analyze_scale_factor: funcionam da mesma forma, mas para o ANALYZE.

Exemplo: Quando uma tabela tem 1 milhão de linhas e o scale_factor é 0,2 (20%), o Autovacuum aciona após a modificação de 200.000 linhas.

Existem diversas outras configurações que você precisa estudar para configurar de forma adequada em cada ambiente.

E se eu não quiser habilitar o Autovacuum?

Não habilitar o Autovacuum é possível, mas só recomendamos se você tiver muito conhecimento e controle do seu ambiente, porque, se o Autovacuum estiver desabilitado:

  • Seu banco de dados crescerá sem controle;
  • A performance das consultas naturalmente cairá;
  • E o pior: você pode sofrer com wraparound.

Pera aí! O que é esse wraparound?

Para que o MVCC consiga controlar quais são as versões antigas e qual é a versão atualizada de um registro, os registros recebem números chamados Transaction ID’s, ou simplesmente XID’s. Esses XID’s têm um limite: pouco mais de 4 bilhões. Quando esse limite é atingido, ele zera e inicia uma nova contagem. Aí o PostgreSQL perderá controle dos que são XID’s passados, XID’s futuros, dados antigos e dados atuais. Uma parada do banco e até corrupção de dados torna-se iminente.

Para evitar que isso aconteça, o PostgreSQL dispara um Autovacuum, o qual será executado até que ele entenda que o número de XID’s está novamente sob controle. Aliás, quem sabe não exploramos melhor esse conceito em outro post?!

Comparando VACUUM, VACUUM FULL, ANALYZE e REINDEX

*E o pg_repack?

Se você precisa reduzir o tamanho das tabelas sem bloquear o banco, uma alternativa interessante é usar o pg_repack, uma extensão do PostgreSQL.

Basicamente, o pg_repack funciona recriando tabelas e índices como objetos temporários, sem a necessidade de parar o banco. Então, quando concluir a criação, substituíra os objetos envolvidos. Nesse momento, ocorre um rápido bloqueio durante a substituição dos objetos.

Então, da próxima vez que ouvir falar em Autovacuum, lembre-se:
  • Ele mantém seu banco limpo e eficiente;
  • Ele protege contra o temido wraparound;
  • Ele atua em segundo plano;
  • Você deve personalizar conforme o seu ambiente.

Se precisar reorganizar tabelas e/ou índices sem parar o banco, então considere usar o pg_repack como complemento às estratégias de manutenção.

Espero ter esclarecido um pouco desse parâmetro, que é fundamental para a manutenção do seu banco de dados.

Até a próxima!

Por Jonas Natario

Generic selectors
Exact matches only
Search in title
Search in content
Post Type Selectors

Artigos Recentes

Orquestração de Pipelines de Dados com Kestra

Fale Conosco

Converse com nossos especialistas e descubra como transformar seus dados em informações seguras, disponíveis e acessíveis.

Endereço

Rua Angelo Antonello, 93 – Sala 62, Centro – Farroupilha/RS – CEP: 95170-492

Contato Comercial

Email: [email protected]
Telefone: (54) 3401-1471

Abrir bate-papo
Olá
Podemos ajudar?