MySQL: error al leer los paquetes de comunicación

14

Recibo esta advertencia en mysql,

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

He pasado por algunos de los temas en google y de acuerdo con alguna sugerencia he aumentado la max_allowed_packetdel 128 to 512 to 1024sigue siendo el mismo comportamiento.

Estoy utilizando Drupal 7, y sí hay un montón de tipos de datos BLOB, pero 1024 Mbde max_allowed_packetdebería ser suficiente en mi opinión.

¿Alguna otra solución para superar esta advertencia?

EDITAR:

Se agregaron algunas configuraciones como las sugerencias / respuestas de @ Rolando, todavía recibo la misma advertencia.

Mi configuración mysql se ve así:

[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

Mi aplicación usa solo InnoDB, pero hay pocas bases de datos como mysql, que viene con las instalaciones estándar de mysql que son solo las que usan el tipo de motor MyISAM, supongo que eso no debería ser mi preocupación.

Como puede ver, también tengo replicación, la advertencia es la misma en el servidor replicado, cuya configuración es idéntica a esta.


fuente
¿Todas sus mesas son InnoDB?
RolandoMySQLDBA
@RolandoMySQLDBA, Hola, sí, todas las tablas son innodb, lo hice de acuerdo con su respuesta en alguna otra pregunta como esta en este sitio web, pero aún recibo la advertencia.
@RolandoMySQLDBA, he editado mi pregunta e hice lo que sugirió, todavía recibo esa advertencia. Tengo mysql.cnf aquí, se puede complacer a tener una mirada en ella, podría estar perdiendo algo
Comencé a recibir este error en MySQL 5.5.35 con Drupal 6. Nunca entendí el problema pero desapareció al actualizar a 5.7.7. Ahora ha regresado con 5.7.9. He aislado una consulta de inserción (menos de 6000 caracteres de texto) que tiene éxito en 5.7.7 pero causa un aborto en 5.7.9. Solo falla cuando se ejecuta de forma remota, no localmente. Entonces, el mismo cliente, ambas versiones del servidor se ejecutan lado a lado en la misma máquina, el mismo sql_mode, el mismo conjunto de caracteres, enorme max_allowed_packet. Estoy zorro Alguna vez resolviste esto?
user19292

Respuestas:

10

Me alegra que haya dicho que todos sus datos son InnoDB, por lo que puedo responder de la siguiente manera: si max_allowed_packet está maximizado en 1G y todavía tiene problemas, en realidad solo hay dos lugares para buscar:

  1. innodb_log_buffer_size : el tamaño en bytes del búfer que InnoDB usa para escribir en los archivos de registro en el disco. El valor predeterminado es 8 MB. Un búfer de registro grande permite que se ejecuten transacciones grandes sin necesidad de escribir el registro en el disco antes de que se confirmen las transacciones. Por lo tanto, si tiene grandes transacciones, agrandar el búfer de registro ahorra E / S de disco.
  2. innodb_log_file_size : el tamaño en bytes de cada archivo de registro en un grupo de registro. El tamaño combinado de los archivos de registro debe ser inferior a 4 GB. El valor predeterminado es 5 MB. Los valores sensibles varían de 1 MB a 1 / N-ésima del tamaño de la agrupación de almacenamientos intermedios, donde N es el número de archivos de registro en el grupo. Cuanto mayor sea el valor, menos actividad de vaciado del punto de control se necesita en el grupo de búferes, lo que ahorra E / S de disco. Pero los archivos de registro más grandes también significan que la recuperación es más lenta en caso de un bloqueo.

Me dirigí a algo así como hace 2 años.

SUGERENCIAS

Necesita aumentar los registros de transacciones de InnoDB . Estos son los pasos para aumentar de forma segura innodb_log_buffer_size e innodb_log_file_size :

Paso 01: agréguelos a /etc/my.cnf

[mysqld]
innodb_log_buffer_size = 32M
innodb_log_file_size = 2047M

Paso 02: ejecuta esto en mysql

mysql> SET GLOBAL innodb_fast_shutdown = 0;

Paso 03: cierre mysql

service mysql stop

Paso 04: Mueva los registros antiguos a un lado

mv ib_logfile0 ib_logfile0.bak
mv ib_logfile1 ib_logfile1.bak

Paso 05: Inicie mysql

service mysql start

Eso es.

La infraestructura de InnoDB ahora debería tener suficiente espacio de registro para BLOB de diferentes tamaños.

Darle una oportunidad !!!

RolandoMySQLDBA
fuente
Muchas gracias por la respuesta, he editado mi pregunta para agregar un mysql.cnfarchivo. Hice lo que sugeriste, pero aún recibí las advertencias. Puedo ver max_allowed_packeten mysqldumpque es simplemente 16Mbpero supongo que no es la causa. key_buffer_sizees una 16Kby otra vez, debería ser algo MyISAMy no estoy usando MyISAMel motor de almacenamiento en la aplicación.
Además, para cualquiera que encuentre esto mientras trabaja con un servidor apache, también tuve que reiniciar ese servicio. Muchas gracias por esto, no tenía ni idea.
dgo
1

Después de leer el comentario de @ user19292 en Jan '16 sobre esta vieja pregunta, actualicé de 5.7.9 a 5.7.12 y el problema desapareció.

IsraelWebDev
fuente
2
Estoy usando 5.7.23 y tengo el mismo problema
Jesus Uzcanga
1
Igual aquí, el error existe con 5.7.26. En su caso, la actualización probablemente también restablezca las configuraciones, por lo que esto podría haber resuelto su problema.
Sliq
0

Acabo de pasar alrededor de 5-6 horas cambiando las opciones y probando diferentes versiones de MySQL, siempre recibí el error.

Creo que es eider porque:

  • mi código PHP no cierra correctamente la conexión db (es una advertencia, no un error) mysql_close()o equivalente.
  • o porque el servidor proxy / caché nginx está configurado para cerrar la conexión si el cliente la cerró, el servidor proxy / caché no espera al servidor de origen (donde también está mysql).
adrianTNT
fuente