MySQL: Erro ao ler pacotes de comunicação

14

Eu recebo este aviso no mysql,

[Warning] Aborted connection 21 to db: 'MyDB' user: 'MyUser' host: 'localhost' (Got an error reading communication packets)

Passei por alguns tópicos no google e, de acordo com algumas sugestões, aumentei o max_allowed_packetde 128 to 512 to 1024ainda o mesmo comportamento.

Eu estou usando Drupal 7, e sim, existem muitos tipos de dados blob, mas 1024 Mbde max_allowed_packetdeve ser suficiente na minha opinião.

Alguma outra solução alternativa para superar esse aviso?

EDITAR:

Adicionadas algumas configurações como as sugestões / respostas de @ Rolando, ainda recebo o mesmo aviso.

Minha configuração do mysql fica assim:

[client]
port        = 3306
socket      = /tmp/mysql.sock
default-character-set = utf8

[mysqld]
port        = 3306
socket      = /tmp/mysql.sock
skip-external-locking
key_buffer_size = 16K 
max_allowed_packet = 1024M 
table_open_cache = 128 
sort_buffer_size = 64K
read_buffer_size = 256K
read_rnd_buffer_size = 256K
net_buffer_length = 2K
thread_stack = 192K
# Query cache disabled
thread_cache_size = 8
myisam-recover = BACKUP
max_connections = 100
thread_concurrency = 10
tmp_table_size = 128M
max_heap_table_size = 128M
log_error                = /var/log/mysql/mysql-error.log
log_slow_queries        = /var/log/mysql/mysql-slow.log
long_query_time = 2

log_warnings = 2

server-id   = 1
binlog-format = row
replicate-same-server-id = 0
auto-increment-increment = 2
auto-increment-offset = 1
log_bin = mysql-bin
log-slave-updates
relay-log=mysqld-relay-bin
expire_logs_days        = 10
max_binlog_size         = 100M

innodb_data_home_dir = /var/db/mysql
innodb_data_file_path = ibdata1:10M:autoextend
innodb_log_group_home_dir = /var/db/mysql
innodb_buffer_pool_size = 8G
character-set-server = utf8
#innodb_additional_mem_pool_size = 2M
innodb_log_file_size = 2047M
innodb_log_buffer_size = 32M
innodb_flush_log_at_trx_commit = 2
innodb_thread_concurrency = 8
innodb_lock_wait_timeout = 50
innodb_flush_method = O_DIRECT

[mysqldump]
quick
quote-names
max_allowed_packet = 16M
default-character-set = utf8

[mysql]
default-character-set = utf8

[myisamchk]
key_buffer_size = 32M
sort_buffer_size = 32M

[mysqlhotcopy]
interactive-timeout

[mysqld_save]
syslog

Meu aplicativo usa apenas o InnoDB, mas existem poucos bancos de dados como o mysql, que vieram com as instalações padrão do mysql, são apenas os que usam o tipo de mecanismo MyISAM, acho que isso não deveria ser minha preocupação.

Como você pode ver, também tenho replicação, o aviso também é o mesmo no servidor replicado, cuja configuração é idêntica a esta.


fonte
Todas as suas tabelas são InnoDB?
RolandoMySQLDBA
@RolandoMySQLDBA, Olá, Sim, todas as tabelas são innodb, fiz de acordo com a sua resposta em outra pergunta como esta neste site, mas ainda recebo o aviso.
@RolandoMySQLDBA, editei minha pergunta e fiz o que você sugeriu, ainda estou recebendo esse aviso. Eu tenho mysql.cnf aqui, você pode agradar a ter um olhar para ele, eu poderia estar faltando alguma coisa
Comecei a receber esse erro no MySQL 5.5.35 com o Drupal 6. Nunca entendi o problema, mas o upgrade foi para o 5.7.7. Agora ele voltou com 5.7.9. Eu isolei uma consulta de inserção (menos de 6000 caracteres de texto) que obtém êxito em 5.7.7, mas causa um abortamento em 5.7.9. Só falha quando executado remotamente, não localmente. Portanto, mesmo cliente, ambas as versões do servidor rodando lado a lado na mesma máquina, mesmo modo sql_, mesmo conjunto de caracteres, enorme max_allowed_packet. Eu sou raposa. Você já resolveu isso?
user19292

Respostas:

10

Fico feliz que você tenha dito que todos os seus dados são do InnoDB para que eu possa responder da seguinte forma: Se max_allowed_packet estiver no limite de 1G e você ainda estiver com problemas, existem apenas dois lugares para procurar:

  1. innodb_log_buffer_size : o tamanho em bytes do buffer que o InnoDB usa para gravar nos arquivos de log no disco. O valor padrão é 8 MB. Um grande buffer de log permite que grandes transações sejam executadas sem a necessidade de gravar o log no disco antes que as transações sejam confirmadas. Portanto, se você tiver grandes transações, aumentar o buffer de log economizará a E / S do disco.
  2. innodb_log_file_size : o tamanho em bytes de cada arquivo de log em um grupo de logs. O tamanho combinado dos arquivos de log deve ser menor que 4 GB. O valor padrão é 5 MB. Os valores sensíveis variam de 1 MB a 1 / N-ésimo do tamanho do buffer pool, em que N é o número de arquivos de log no grupo. Quanto maior o valor, menos atividade de liberação do ponto de verificação é necessária no buffer pool, economizando E / S do disco. Mas arquivos de log maiores também significam que a recuperação é mais lenta em caso de falha.

Abordei algo como cerca de 2 anos atrás

SUGESTÕES

Você precisa aumentar os logs de transações do InnoDB . Aqui estão as etapas para aumentar com segurança innodb_log_buffer_size e innodb_log_file_size :

Etapa 01: adicione-os ao /etc/my.cnf

[mysqld]
innodb_log_buffer_size = 32M
innodb_log_file_size = 2047M

Etapa 02: Execute isso no mysql

mysql> SET GLOBAL innodb_fast_shutdown = 0;

Etapa 03: Desligar o mysql

service mysql stop

Etapa 04: Afaste os logs antigos

mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak

Etapa 05: Inicie o mysql

service mysql start

É isso aí.

A infraestrutura do InnoDB agora deve ter espaço de log suficiente para BLOBs de tamanhos diferentes.

De uma chance !!!

RolandoMySQLDBA
fonte
Muito obrigado pela resposta, editei minha pergunta para adicionar mysql.cnfarquivo. Fiz o que você sugeriu, mas ainda recebo os avisos. Eu posso ver max_allowed_packetnos mysqldumpé apenas 16Mbmas eu acho que não é a causa. key_buffer_sizeé apenas uma 16Kbvez mais deve ser algo com MyISAMe não estou usando MyISAMo mecanismo de armazenamento no aplicativo.
Além disso - para quem encontra isso enquanto trabalhava com um servidor apache, também tive que reiniciar esse serviço. Muito obrigado por isso - eu estava sem noção.
dgo 12/03
1

Depois de ler o comentário de @ user19292 em Jan '16 sobre essa pergunta antiga, atualizei de 5.7.9 para 5.7.12 e o problema desapareceu.

IsraelWebDev
fonte
2
Estou usando 5.7.23 e tendo o mesmo problema
Jesus Uzcanga
1
Mesmo aqui, existe erro com 5.7.26. No seu caso, a atualização provavelmente também redefinirá as configurações, portanto, isso pode ter resolvido o seu problema.
SliQ
0

Passei cerca de 5 a 6 horas alterando as opções e tentando diferentes versões do MySQL, sempre obtive o erro.

Eu acho que é estranho porque:

  • meu código PHP não está fechando corretamente a conexão db (é um aviso, não um erro) mysql_close()ou equivalente.
  • ou porque o servidor de cache / proxy nginx está configurado para fechar a conexão se o cliente a fechou, o servidor de cache / proxy não espera pelo servidor de origem (onde também está o mysql).
adrianTNT
fonte