Saltar al contenido

max_allowed_packet. Como aumentar el tamaño máximo permitido para consultas mysql

aumentar max_allowed_packet en MySQL

Todo tu código funciona correctamente y de repente una consulta que parece inofensiva recibe un temido error de mysql «General error: 2006 MySQL server has gone away«. No actives de momento el panic mode. Este error suele venir provocado principalmente por dos supuestos:

  • Se ha alcanzado el timeout del proceso de mysql
  • Se ha provocado un error en mysql del que no se ha podido recuperar

Hoy nos ocuparemos del segundo supuesto. Hemos tumbado el proceso mysql con una consulta previa a la que nos devuelve el error por lo que ya sabemos donde buscar.

El error en MySQL

En mi experiencia, uno de los errores más comunes que devuelven este error es alcanzar el tamaño máximo de petición que permite MySQL. Cuando enviamos una petición a la base de datos estamos enviando un paquete de información y si fuese demasiado grande provocaría la caída de la conexión. Esto se produce típicamente cuando realizamos un INSERT de muchas filas o con un texto muy grande.

En primer lugar recomiendo verificar si es necesario dicha sentencia. Puede que estemos guardando información en la base de datos que no necesitemos. Un ejemplo típico es guardar las imágenes de un texto html directamente en la base de datos o guardar archivos de registro muy grandes. En esos casos puede convenir refactorizar nuestro código para evitar estos problemas.

¿Y si todo es correcto? Solo nos queda aumentar el tamaño máximo de paquete que permite recibir MySQL.

Aumentar max_allowed_packet en MySQL

La variable que nos afecta en este caso es max_allowed_packet que se encuentra en el fichero my.cnf. Este fichero podemos encontrarlo en diferentes localizaciones:

  • /etc/my.cnf
  • /etc/mysql/my.cnf
  • lampp/etc/my.cnf

Una vez en el fichero seguramente encontremos la variable ya definida bajo el epígrafe [mysqld]. Solo tenemos que modificarla con el valor deseado.

[mysqld]
max_allowed_packet=16M

En el ejemplo hemos usado 16 megas que es tamaño más que suficiente.

Solo nos queda reiniciar el proceso de mysql y ya deberíamos de poder realizar las consultas problemáticas.

Otras consideraciones

El tamaño máximo permitido por MySQL 5 es de 1GB. Si bien no debería ser necesario un tamaño tan enorme. Según la propia página de MySQL al respecto es perfectamente seguro aumentar dicho tamaño ya que solo será usado si hace falta. Sin embargo, mi recomendación es que uséis solo lo que vayáis a necesitar y no sobredimensionéis la memoria disponible por MySQL sin necesidad.

Etiquetas:

5 comentarios en «max_allowed_packet. Como aumentar el tamaño máximo permitido para consultas mysql»

  1. Hola gracias por este post me ha aclarado mucho, porque me ha surgido el mismo error “2006 MySQL server has gone away“ en una pasarela de pago. Supongo como explicas al hacer el INSERT y ha fallado el max_allowed_packet. Lo que no entiendo que por enviar 4 inputs ( nombre, numero tarjeta, email, fecha) necesita tanta memoria?

    Tengo un sitio en hosting compartido y no puedo acceder al archivo my.cnf que comentas. ¿No hay forma de arreglarlo en PHP ?
    Me temo que tendré que pasar a un VPS, del que no tengo ni idea como configurar . Te agradeceria si hicieras una pequeña guia para solventar este error en un VPS. Gracias de antemano.

    1. Buenas dani,
      Gracias a ti por contestar y disculpa la tardanza.

      El error “2006 MySQL server has gone away“ indica que se ha excedido el tiempo de espera para la conexión con el servidor y generalmente pasa por el tamaño de la consulta. Por lo que comentas no es el caso pues el insert del que hablas parece ser pequeño. De todas formas te recomiendo que verifiques que consultas se están haciendo en esa pasarela de pago para que falle. Si no puedes imprimirla por pantalla puedes mandarte un email con el texto de las consultas. También deberías revisar los logs de errores por si te dan algo más de información.

      Respecto a cambiar la variable sin acceder al fichero my.cnf, hasta donde tengo entendido desde PHP no vas a poder cambiarla. Es posible que funcione realizando una consulta del estilo:

      Esto probablemente necesites hacerlo antes de cada consulta «grande».

      Saludos

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este sitio usa Akismet para reducir el spam. Aprende cómo se procesan los datos de tus comentarios.