- Castro/
- blog/
- Redo log writer is waiting no MySQL: quando o log mostra que o checkpointer não está acompanhando/
Redo log writer is waiting no MySQL: quando o log mostra que o checkpointer não está acompanhando
Como interpretar warnings do InnoDB sobre redo log cheio e log_checkpointer atrasado sem transformar a recomendação de aumentar capacidade em causa raiz automática.
Em uma coleta de MySQL, o error.log repetia duas mensagens muito específicas:
| |
E:
| |
A própria mensagem ainda registrava que a capacidade configurada e a capacidade utilizada estavam no mesmo limite.
Na janela coletada, o valor era equivalente a aproximadamente 100 MiB.
Isso é uma evidência forte de pressão no subsistema de redo.
Mas ainda não autoriza uma conclusão simplista como:
“Aumenta
innodb_redo_log_capacitye acabou.”
O que o redo log está fazendo #
De forma simplificada, alterações do InnoDB geram registros de redo antes de os dados modificados serem totalmente persistidos nas páginas do tablespace.
Esse mecanismo permite recuperação e evita depender de cada página de dados ser gravada imediatamente.
O fluxo conceitual é:
| |
Se a produção de redo avança mais rápido do que a capacidade de reciclagem, o espaço disponível começa a desaparecer.
A mensagem mais importante não era só “log cheio” #
O warning mencionava explicitamente:
| |
Isso muda a qualidade da investigação.
Não é apenas uma variável pequena encontrada no my.cnf.
O próprio InnoDB está dizendo que threads não conseguem reservar novo espaço de redo porque a posição necessária para reaproveitamento ainda não foi liberada pelo progresso do checkpoint.
Em outras palavras:
| |
O padrão era recorrente, não uma linha isolada #
Na evidência recuperada havia warnings repetidos ao longo de minutos durante uma janela de carga, incluindo várias ocorrências consecutivas de:
| |
E ocorrências intercaladas de:
| |
Outra coleta histórica do mesmo tipo de ambiente também mostrava o warning em datas diferentes.
Isso é mais relevante que encontrar uma linha solta em um log de meses.
A pergunta passa a ser:
isso acontece apenas em picos específicos ou é uma limitação recorrente da configuração/workload?
O primeiro passo é medir a configuração real #
Eu começaria com:
| |
Dependendo da versão do MySQL, também vale entender as variáveis legadas relacionadas ao tamanho dos redo logs.
Depois, registrar versão:
| |
Isso importa porque a implementação e as variáveis de redo mudaram entre gerações do MySQL.
Não investigar o redo isolado do storage #
Se o checkpoint está atrasando, eu também quero saber se o sistema consegue escrever no ritmo necessário.
No host:
| |
Procuro sinais como:
| |
Porque aumentar espaço de redo pode ampliar a margem para absorver burst, mas não corrige magicamente um storage incapaz de sustentar o workload.
Dirty pages e checkpoint fazem parte da mesma história #
Uma investigação mais completa observa o estado do InnoDB.
Por exemplo:
| |
E métricas relacionadas a buffer pool, dirty pages e flush.
A pergunta não é encontrar uma única variável culpada.
É reconstruir:
| |
Aumentar a capacidade pode ser correto #
O próprio warning recomenda considerar o aumento de innodb_redo_log_capacity.
Isso não deve ser ignorado.
Se o valor configurado é pequeno para o volume real de escrita, aumentar a capacidade pode reduzir a frequência em que o workload encontra o limite e dar mais espaço para o checkpoint acompanhar picos.
O ponto é tratar a alteração como hipótese de melhoria sustentada por evidência, e não como RCA universal.
Antes da mudança eu registraria:
| |
Depois da mudança, compararia o mesmo conjunto.
O warning não prova sozinho a causa de toda lentidão #
Na mesma janela podem existir:
- queries ruins;
- scans excessivos;
- contenção;
- storage lento;
- checkpoint agressivo;
- buffer pool inadequado;
- picos legítimos de escrita;
- operações de manutenção.
O warning prova uma coisa específica:
houve momentos em que o InnoDB não conseguia reservar novo espaço de redo no ritmo necessário porque a reciclagem/checkpoint estava atrasada.
Isso já é muito útil.
Não precisa transformar essa evidência em uma história maior do que ela é.
Uma coleta reproduzível #
Versão e configuração #
| |
Estado InnoDB #
| |
Error log #
| |
Storage #
| |
Workload #
Quando performance_schema/sys estiverem disponíveis, coletar as queries e esperas relevantes sem alterar o ambiente.
Como validar uma mudança #
Se for decidido aumentar a capacidade de redo, eu definiria antes o critério de sucesso.
Exemplo:
| |
Sem medição posterior, a alteração vira apenas configuração nova.
O que a fonte deste artigo comprova #
A coleta técnica recuperada comprova:
- warnings
MY-014089repetidos; - warnings
MY-014084repetidos; - mensagens dizendo que o redo writer aguardava novo arquivo;
- threads sem conseguir reservar espaço de redo;
log_checkpointerdescrito pelo próprio MySQL como atrasado;- capacidade de redo totalmente utilizada na janela registrada;
- recomendação do próprio InnoDB para considerar aumento da capacidade.
Ela não comprova, por si só:
- que aumentar a capacidade foi a correção final;
- que o storage era a causa raiz;
- que toda lentidão da aplicação vinha do redo;
- um percentual de melhoria depois da alteração.
Checklist #
| |
O principal aprendizado #
Quando o InnoDB escreve:
| |
isso não é ruído cosmético.
É uma evidência concreta de que o pipeline de redo/checkpoint encontrou seu limite naquele momento.
A melhor resposta não é ignorar o warning — nem obedecer cegamente à sugestão de configuração.
É usar a mensagem como ponto de partida para medir redo, checkpoint, dirty pages, storage e workload como uma cadeia.
Me chama.
Manda o contexto, os sintomas e o que já foi testado. Bora organizar as evidências antes de sair mexendo.