Executar periodicamente os comandos vacuum analyze e vacuum full no PostgreSQL são essenciais para manter o desempenho e a integridade do banco de dados. A importância de cada um desses comandos é explicada a seguir.
1. vacuum analyze
- Atualização de estatísticas: O comando vacuum analyze vai além do vacuum básico, pois também atualiza as estatísticas do banco de dados. Essas estatísticas são vitais para o otimizador de consultas do PostgreSQL tomar decisões inteligentes sobre como executar consultas de maneira eficiente. Sem estatísticas atualizadas, o otimizador pode fazer escolhas sub-ótimas de plano de consulta.
- Melhoria do desempenho das consultas: Ao atualizar as estatísticas, o vacuum analyze ajuda o banco de dados a tomar decisões mais informadas sobre como acessar os dados, o que, por sua vez, melhora o desempenho das consultas.
2. vacuum full
- Remoção de registros obsoletos: o PostgreSQL utiliza um mecanismo de armazenamento chamado Multiversion Concurrency Control (MVCC) para controlar transações concorrentes. Isso significa que os registros não são removidos imediatamente quando são excluídos ou atualizados, mas marcados como obsoletos. O vacuum é responsável por remover esses registros obsoletos, recuperando espaço em disco e melhorando o desempenho.
- Prevenção de bloat: o bloat ocorre quando as tabelas do banco de dados acumulam registros obsoletos que não foram limpos. O vacuum ajuda a prevenir o bloat, garantindo que o banco de dados não cresça desnecessariamente e que as consultas sejam executadas de maneira mais eficiente.
- Reorganização do espaço em disco: o vacuum também pode reorganizar os dados no disco, melhorando a eficiência do acesso aos registros e reduzindo a fragmentação do disco.
Em relação ao Bacula, lentidões de consultas (por exemplo) de seleção de log do job pelo Bweb já foram solucionadas em cenários específicos de produção pela execução de um vacuum. Como o Bacula está constantemente reciclando backups e “prunando” informações do catálogo, é recomendado executar o vacuum analyze semanalmente, e um vacuum full a cada três meses.
Seguem exemplos de Job Admin do Bacula para execução automatizada.
3. Exemplo de Jobs Admin de vacuum e vacuum analyze no Bacula
O vacuum analyze deve ser executado em uma agenda semanal como no exemplo a seguir.
Job { Name = "admin-vacuum-weekly" Type = Admin JobDefs = BackupsToDisk RunBeforeJob = "vacuumdb -z -q -j 2 -d bacula" Schedule = admin-weekly ... } Schedule { Name = "admin-weekly" Run = Mon at 14:00 }
O vacuum full deve ser executado a cada três meses como no exemplo a seguir.
Job { Name = "admin-vacuum-analyze-trimestral" Type = Admin JobDefs = BackupsToDisk RunBeforeJob = "vacuumdb -f -q -d bacula" Schedule = admin-trimestral ... } Schedule { Name = "admin-trimestral" Run = Jan, Apr, Jul, Oct at 14:00 }
Conforme as Figuras 1 e 2, as configurações retromencionadas podem ser feitas graficamente pelo Bweb.
Figuras 1 e 2. Configuração dos Jobs Admin de vacuum analyze e full (Bweb).
Mesmo selecionando apenas a base “bacula” para a execução do vacuum, é possível que o comando vacuumdb imprima alertas como os que seguem.
2023-09-07 08:37:55 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_shdepend" --- only superuser can vacuum it 2023-09-07 08:37:55 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_authid" --- only superuser can vacuum it 2023-09-07 08:37:55 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_database" --- only superuser can vacuum it 2023-09-07 08:37:55 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_db_role_setting" --- only superuser can vacuum it 2023-09-07 08:37:55 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_tablespace" --- only superuser can vacuum it 2023-09-07 08:37:55 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_auth_members" --- only superuser can vacuum it 2023-09-07 08:37:55 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_shdescription" --- only superuser can vacuum it 2023-09-07 08:37:56 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_subscription" --- only superuser can vacuum it 2023-09-07 08:37:56 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_shseclabel" --- only superuser can vacuum it 2023-09-07 08:37:56 ebacula-dir JobId 40551: BeforeJob: WARNING: skipping "pg_replication_origin" --- only superuser can vacuum it
Estes alertas podem ser ignorados.
A partir da versão PostgreSQL 16, no entanto, existe um novo tipo de permissão que pode ser concedida ao usuário do bacula para mitigar esses alertas como no comando exemplificativo do psql a seguir.
grant pg_vacuum_all_tables to bacula;
Ref.: https://www.cybertec-postgresql.com/en/grant-vacuum-analyze-postgresql-16
Disponível em: PortuguêsEnglish (Inglês)Español (Espanhol)