Nos logs 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 em si, então estou me perguntando o que esse aviso significa ou o que o causa e se como alguém pode resolver o problema que os causa. Isso está no RHEL 6.1 e MySQL Enterprise 5.5.
Um dos assassinos silenciosos do MySQL Connections é o MySQL Packet.
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:
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 muito grandes. Definitivamente, um pacote muito pequeno causará problemas para conexões abertas a esse respeito.
De acordo com a documentação do MySQL
Você também pode obter esses erros se enviar uma consulta ao servidor incorreta ou muito grande. Se o mysqld recebe um pacote muito grande ou fora de ordem, ele assume que algo deu errado com o cliente e fecha a conexão. Se você precisar de grandes consultas (por exemplo, se estiver trabalhando com grandes colunas BLOB), poderá 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 tamanho máximo do pacote na extremidade do cliente. Mais informações sobre a configuração do 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, muitas vezes 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. Eu sugeriria cerca de 10 vezes o maior campo TEXT ou BLOB que você tem em seu conjunto de dados atual.
Para definir o max_allowed_packet para 256M, você pode adicioná-lo a /etc/my.cnf ou my.ini
para cobrir futuras reinicializações do mysqld. Para instalar o valor agora no servidor, execute isto:
De uma chance !!!
Principalmente por padrão
max_connections
será 100. Tente aumentar o parâmetro de configuração paramax_connections=400
.Depois de configurar na
my.cnf
reinicialização do servidor, ou você pode configurá-lo dinamicamente:Basta tentar a recomendação acima para evitar essas mensagens de aviso e também garantir que sua rede não tenha quedas de pacotes.
Eu encontrei este problema recentemente depois de mudar do 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 para a ' nota ' aparecer foi o programa sair com as conexões ainda abertas. A circunstância de as conexões não serem fechadas foram um pouco mais envolvidas e não relacionadas ao MySQL, mas ACE, threads e TSS.
Não mencionado aqui, então estou incluindo outra causa desse 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.
Me deparei com o mesmo problema com o MariaDB 10.3.24.
Parece que o aviso pode ocorrer por todos os outros motivos mencionados aqui e depois 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.
Como teste, alterei o
{}
para()
e isso interrompeu a mensagem. Apenas no caso de ajudar alguém.Recebi esse mesmo erro fazendo uma consulta que retornou várias linhas, processando essas linhas usando rows.Next() (em Golang) e saindo mais cedo devido a um erro não relacionado sem chamar rows.Close(). A parte confusa foi que funcionou nas primeiras vezes, mas acabou falhando, indicando que algum recurso (conexões?) estava sendo usado.
Eu pude tirar vantagem da declaração de adiamento de Golang, e apenas
adiar linhas.Close()
antes de chamar rows.Next(), mas chamar rows.Close() antes de cada saída antecipada do loop rows.Next() também funciona.
Esta linha my.ini temporária resolveu meu problema:
Referencie este link