Li recentemente sobre uma configuração chamada Percona Server max_binlog_files
que restringe o número total de arquivos binlog. Isso é exatamente o que eu preciso. Atualmente, o meu binlog_expire_logs_seconds
está definido para 3 dias, o que funciona muito bem 99% do tempo. No entanto, atualmente estou envolvido em um projeto que executa uma grande quantidade de consultas e os binlogs consumiram mais de 70 GB em apenas algumas horas. Nesse caso, eu realmente preciso limitar o número de arquivos.
Existe alguma configuração nativa do MySQL para conseguir isso? Qual é a melhor maneira de restringir o espaço total em disco consumido pelos binlogs?
Não, a implementação upstream do MySQL não possui um recurso equivalente ao
max_binlog_files
. Portanto, você não pode realmente evitar um aumento de curto prazo no crescimento do log binário.Bem, a opção
log_bin=OFF
definitivamente impediria o crescimento ilimitado do log binário, mas essa é a única solução fornecida pelo MySQL Server padrão.Você pode implementar um trabalho agendado fora do MySQL (por exemplo, um cron job) para verificar periodicamente
SHOW BINARY LOGS
se eles estão usando mais espaço do que você deseja e, em seguida,PURGE BINARY LOGS
reduzir o espaço.O risco é que sua limpeza agressiva exclua alguns logs que ainda são necessários para replicação, recuperação pontual ou ferramentas de CDC, se você usar esses recursos.
No meu último trabalho, ocasionalmente tivemos logs binários em um determinado MySQL crescendo para 500 GB. Os desenvolvedores não estavam cientes do impacto de fazer grandes cargas de dados em massa e fariam isso sempre que quisessem, sem notificar a equipe de DBA. Estávamos usando o Percona Server, então definimos um limite
max_binlog_files=500
para que eles não usassem mais do que 500 GB, mas não tínhamos liberdade para ser mais restritivos.Em última análise, só precisávamos ter certeza de que havia espaço de armazenamento livre suficiente em cada servidor de banco de dados para esses tipos de picos.
À luz da resposta útil de @BillKarwin, optei por fazer com que o cron executasse um script bash simples em intervalos de 15 minutos. Eu não sou muito bom com o bash, então pode haver uma maneira mais sucinta, mas por enquanto isso parece estar funcionando: