¿Cuál es un valor razonable para max_allowed_packet para Drupal 7 con tráfico moderado?

12

Necesito saber un número de parque de pelota para esta variable para mi sitio drupal 7 Recientemente recibí una PDOException "drupal": SQLSTATE [08S01]: Error de enlace de comunicación: error 1153 ". Soy un novato en mysql y estoy usando un alojamiento compartido. Probablemente necesite pedirle al administrador que lo haga por mí.

Gracias por adelantado.

Patrick Cheung
fuente
1
Mi respuesta muestra mi experiencia con esto, pero puede obtener mejores respuestas en dba.stackexchange.com de quienes mantienen MySQL para ganarse la vida.
mpdonadio

Respuestas:

12

Vi una respuesta interesante a una pregunta sobre el BLOB más grande que puedas tener. Aquí está la declaración que vi en ServerFault: innodb_log_file_size e innodb_log_buffer_size combinados deben ser mayores que diez veces su objeto blob más grande si tiene muchos grandes .

Según esa publicación de ServerFault de Nils-Anders Nøttseter , debe consultar la tabla y averiguar qué BLOB es el más grande, multiplicar ese número por 11 o más, y usar esa respuesta como max_allowed_packet en adelante.

Es curioso que haya abordado otra pregunta en la que sugerí dimensionar el paquete max_allowed para, con suerte, resolver el problema .

CONSIDERACIÓN

De acuerdo con el libro

TheBookImage

Esto es lo que dice la página 99 párrafos 1-3 sobre los paquetes MySQL:

El código de comunicación de red MySQL se escribió bajo el supuesto de que las consultas siempre son razonablemente cortas y, por lo tanto, el servidor puede enviarlas y procesarlas en un fragmento, que se denomina paquete en la terminología de MySQL. El servidor asigna la memoria para un búfer temporal para almacenar el paquete, y solicita lo suficiente para ajustarlo por completo. Esta arquitectura requiere una precaución para evitar que el servidor se quede sin memoria, un límite en el tamaño del paquete, lo que esta opción logra.

El código de interés en relación con esta opción se encuentra en sql / net_serv.cc . Eche un vistazo a my_net_read () , luego siga la llamada a my_real_read () y preste especial atención a net_realloc () .

Esta variable también limita la longitud de un resultado de muchas funciones de cadena. Vea sql / field.cc y sql / intem_strfunc.cc para más detalles.

Saber esto acerca de los paquetes MySQL le permite a un DBA dimensionarlos para acomodar múltiples BLOBs dentro de un paquete MySQL, incluso si son odiosamente grandes.

Con respecto a su situación, debe averiguar cuál es el BLOB más grande en su base de datos, multiplique ese número por 11 y establezca su max_allowed_packet en ese número. Debería poder configurarlo para el servidor sin un reinicio de mysql (Personalmente, lo configuraría 256M porque resolvería otros problemas relacionados con la migración y la replicación, que está más allá del alcance de este foro). Para configurarlo en 256M para su base de datos para todas las conexiones entrantes, ejecute esto:

SET GLOBAL max_allowed_packet = 1024 * 1024 * 256;

Luego, agregue esta configuración a my.cnf en la [mysqld]sección:

[mysqld]
max_allowed_packet = 256M
RolandoMySQLDBA
fuente
¿El paquete máximo permitido no afectaría también el tamaño de las instrucciones de inserción?
Buttle Butkus
@ButtleButkus Por supuesto. Es por esto que los paquetes MySQL más grandes funcionan bien para INSERT. Tenga en cuenta que 1G es el tamaño máximo para max_allowed_packet. También tenga en cuenta que establecer max_allowed_packet en 256M no asigna 256M por adelantado. De acuerdo con dev.mysql.com/doc/refman/5.6/en/… , mysqld asigna lo que sea net_buffer_length como el tamaño inicial del paquete MySQL. El paquete crece gradualmente hasta el tamaño establecido por max_allowed_packet. Por lo tanto, está bien establecer un paquete max_allowed_packet grande. Los INSERTOS te amarán por ello.
RolandoMySQLDBA
Nunca lo configuré cerca de ese tamaño, a pesar de que tenemos un par de máquinas con 32G de RAM. Sin embargo, una aplicación se atragantó y la aumenté a 32M del valor predeterminado (1M?) Y funcionó. Quizás lo aumente aún más, si no duele. Pero, ¿deberían las aplicaciones verificar max_allowed_packet y dividir los insertos en trozos para evitar alcanzar ese límite? ¿Cuál es la desventaja de ese enfoque? Quizás debería publicar esa pregunta en el sitio dba stack.
Buttle Butkus
¿Podría explicar un poco más por qué deberíamos multiplicar por 11? La publicación vinculada trata sobre buffers innodb: ¿cómo se relaciona eso con el tamaño del paquete?
SystemParadox
4

Tomado de la página de Requisitos del servidor de la base de datos de Drupal :

Puede ser necesario establecer la variable del sistema max_allowed_packet en al menos 16M. Algunos planes de alojamiento de bajo costo establecen este valor demasiado bajo (el valor predeterminado de MySQL es solo 1M). En ese caso, es posible que deba elegir un mejor plan de alojamiento. Un valor de 1M puede ser suficiente para Drupal 5.

Debería estar bien para un sitio de alojamiento compartido.

Phizes
fuente
1
¡¡Guau!! ¡Los requisitos del servidor Drupal dicen oficialmente que son 16 millones! Nunca fui consciente de eso. Lo tendré en cuenta la próxima vez. Muchas gracias por compartir esta información. ¡Ojalá pudiera marcarlo como la mejor respuesta!
Shivams
2

Puede ser un poco complicado de configurar max_allowed_packet. Todavía tengo que encontrar un método para calcular ese valor. Normalmente, me encuentro con él cuando intento restaurar una instantánea de la base de datos que incluye filas de las {cache}tablas.

Cuando tenga este problema, elegiré un valor entre 4M y 8M. Sigo aumentando el valor hasta que se detiene. Sin embargo, no sé si un host compartido cambiará este valor por usted.

mpdonadio
fuente