Nos registros de erros do MySQL, vejo alguns avisos como estes:

120611 16:12:30 [Warning] Aborted connection 2619503 to db: "db_name" user: "user_name" host: "webapp_hostname" (Got an error reading communication packets) 

Não notei nenhuma perda de dados per se, então estou me perguntando o que este aviso significa, ou o que o causa, e se como alguém pode resolver o problema que está causando isso. Isso está no RHEL 6.1 e no MySQL Enterprise 5.5.

Resposta

Um dos assassinos silenciosos do MySQL Connections é o pacote MySQL.

Primeiro, vamos descobrir o que é um pacote MySQL.

De acordo com a página 99 de “Understanding MySQL Internals” (ISBN 0-596-00957 -7) , aqui estão os parágrafos 1-3 explicando os Pacotes MySQL:

O código de comunicação da rede MySQL foi escrito sob a suposição de que as consultas são sempre razoavelmente curto e, portanto, pode ser enviado e processado pelo servidor em um bloco, que é chamado de pacote na terminologia do MySQL. O servidor aloca a memória para um buffer temporário para armazenar o pacote e solicita o suficiente para ajustá-lo inteiramente. Esta arquitetura requer um cuidado para evitar que o servidor fique sem memória — um limite no tamanho do pacote, que esta opção realiza.

O código de interesse em relação a esta opção é encontrado em sql / net_serv.cc . Dê uma olhada em my_net_read () e siga a chamada para my_real_read () e preste atenção especial a net_realloc () .

Esta variável também limita o comprimento de um resultado de muitas funções de string. Veja sql / field.cc e sql / intem_strfunc.cc para obter detalhes.

Saber isso sobre os pacotes MySQL permite que um desenvolvedor / DBA os dimensione para acomodar vários BLOBs dentro de um pacote, mesmo que sejam excessivamente grandes. Definitivamente, um pacote muito pequeno causará problemas para conexões abertas a esse respeito.

De acordo com Documentação do MySQL

  • Você também pode obter esses erros se enviar uma consulta incorreta ou demais ao servidor ampla. Se o mysqld receber um pacote muito grande ou fora de serviço, ele assume que algo deu errado com o cliente e fecha a conexão. Se precisar de grandes consultas (por exemplo, se estiver trabalhando com grandes colunas BLOB), você pode aumentar o limite de consultas definindo a variável max_allowed_packet do servidor, que tem um valor padrão de 1 MB. Você também pode precisar aumentar o máximo tamanho do pacote no cliente final. Mais informações sobre como definir o tamanho do pacote são fornecidas na Seção C.5.2.10, “Pacote muito grande”.

  • Uma instrução INSERT ou REPLACE que insere muitas linhas também pode causar esses tipos de erros. Qualquer uma dessas instruções envia uma única solicitação ao servidor, independentemente do número de linhas a serem inseridas ; assim, você pode evitar o erro reduzindo o número de linhas enviadas por INSERT ou REPLACE.

RECOMENDAÇÃO

Tente aumentar o max_allowed_packet para um número muito maior, já que o padrão é 1M. O ld sugere cerca de 10 vezes o maior campo TEXT ou BLOB que você tem em seu conjunto de dados atual.

Para definir max_allowed_packet para 256M, você pode adicioná-lo a /etc/my.cnf ou my.ini

[mysqld] max_allowed_packet=256M 

para cobrir reinicializações futuras do mysqld. Para instalar o valor agora no servidor, execute:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256; 

Experimente !!!

Comentários

  • Explicação muito boa.
  • @RolandoMySQLDBA Ainda estou recebendo o erro em 5.7.28 depois de tentar todas as soluções mencionadas. Quaisquer dicas para solucionar problemas adicionais

Resposta

Principalmente por padrão max_connections será 100. Tente aumentar o parâmetro de configuração

max_connections = 400, depois de definir em my.cnf, reinicie o servidor ou defina-o dinamicamente:

 set @@global.max_connections = 400; 

Apenas tente a recomendação acima para evite essas mensagens de aviso e também certifique-se de que sua rede não tenha pacotes descartados.

Resposta

Encontrei esse problema recentemente depois de mudar de MySQL Enterprise 5.1.x para 5.7.x , sem nenhuma alteração significativa no código do aplicativo, a “ nota ” começou a aparecer.

No meu caso, a causa raiz da “ nota ” que apareceu foi o programa saindo com as conexões ainda abertas.A circunstância de as conexões não serem fechadas estava um pouco mais envolvida e não relacionada ao MySQL, mas ACE, threads e TSS.

Resposta

Não mencionado aqui, então estou incluindo outra causa para esse problema. No meu caso, ao usar o cliente de linha de comando mysql, o erro foi causado por um valor baixo de 30 segundos de interactive_timeout:
https://dev.mysql.com/doc/refman/8.0/en/server-system-variables.html#sysvar_interactive_timeout
Isso persistirá nas sessões, mas não na reinicialização do servidor.

SET GLOBAL interactive_timeout=6000; 

Resposta

Encontrei o mesmo problema com o MariaDB 10.3.24. Parece que o Aviso pode ocorrer por todos os motivos acima e alguns. No meu caso, foi devido a um registro em uma das tabelas do banco de dados que tinha um valor de dicionário vazio para um dos campos.

+ —- + ——– + | id | config | + —- + ——– + | 3 | {} | + —- + ——– +

Como teste, alterei o “{}” para “()” e isso interrompeu a mensagem. Para o caso de ajudar alguém.

Resposta

Esta linha my.ini resolveu meu problema:

log_error_verbosity=1 

Referência este link

Comentários

  • Não ' acho que você não resolveu o problema subjacente, mas simplesmente interrompeu o registro.
  • Estava recebendo a mesma mensagem relatada como um " Observação ". O uso de log_error_verbosity = 2 resolve o " problema " (mas um " Aviso " deve ser abordado, não ignorado)

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios marcados com *