
A todos nos gusta cuando los mensajes de error son descriptivos y dan una idea clara de lo que está sucediendo; sin embargo, hay algunos casos en los que un mensaje de error se encuentra detrás de algunas posibles razones. «El servidor MySQL se ha ido» es uno de ellos. La mayoría de los casos en los que se encuentra el error son descrito en la documentación de MySQL, pero puede resultar difícil. Y aquí, me gustaría hablar de «engañoso».
Solo hay algunos casos importantes en los que esto sucede:
1. Un administrador o una utilidad como pt-kill ha eliminado el hilo de MySQL
La intervención manual es probablemente intermitente y, como ocurre una vez en determinadas situaciones (p. Ej., Una solicitud incorrecta durante mucho tiempo), probablemente un DBA la conocería. Pt-kill podría ser menos notorio, ya que a menudo se deja funcionando como una solución alternativa para evitar esas malas demandas a largo plazo del sistema tributario. recursos. Verificar la lista de procesos del sistema debería traer los comandos a la superficie:
$ ps xauf | grep pt-kill taras 6069 0,1 0,1 111416 29452 pts / 29 S + 10:57 0:00 | | _ perl / usr / bin / pt-kill –interval 1s –busy-time 5s –match-info (SELECT) h = 127.0.0.1 –print –kill taras 6913 0.0 0.0 21532 1112 pts / 30 S + 11:00 0:00 | _ grep –color = auto pt-kill
PS PD xauf | grep pt–matar taras 6069 0,1 0,1 111416 29452 ptos/29 S+ 10:57 0:00 | | _ perl /usr/compartimiento/pt–matar –intervalo 1 s –ocupado–hora 5 s –coincidir–info (SELECCIONE) h=127.0.0.1 –imprenta –matar taras 6913 0.0 0.0 21532 1112 ptos/30 S+ 11:00 0:00 | _ grep –color=automático pt–matar |
Una forma muy conveniente es utilizar el complemento de auditoría disponible para Percona Server para MySQL para determinar de dónde proviene el comando kill:
<AUDIT_RECORD> <PRIMER NOMBRE>Pregunta</PRIMER NOMBRE> <REGISTRO>624484743_2020–06–30T17:38:14</REGISTRO> <TIMESTAMP>2020–06–30T17:57:35 UTC</TIMESTAMP> <COMMAND_CLASS>matar</COMMAND_CLASS> <CONNECTION_ID>17</CONNECTION_ID> <ESTADO>0</ESTADO> <SQLTEXT>MUERTE CONSULTA dieciséis</SQLTEXT> <USUARIO>taras[taras] @ anfitrión local []</USUARIO> <ANFITRIÓN>anfitrión local</ANFITRIÓN> <OS_USER></OS_USER> <IP></IP> <DB></DB> </AUDIT_RECORD> |
Muestra el nombre de host, el nombre de usuario y la hora en que se interrumpió la conexión.
2. Fragmento de transferencia de Big Data
Por ejemplo, cuando se utilizan campos BLOB para almacenar datos binarios en una tabla o hay una instrucción INSERT que contiene muchas filas. Puede suceder cuando se usa el cliente CLI de MySQL (uno de los casos que carga un volcado SQL), o puede ocurrir en una aplicación cuando se intenta almacenar datos BLOB (por ejemplo, desde un archivo de carga).
Existe un límite que MySQL impone a la cantidad de datos que se pueden transmitir por solicitud, y max_allowed_packet una variable para definir.
Entonces, en ambos casos, necesitamos determinar en qué tabla se escriben los datos, por ejemplo, haciendo grepping en el archivo SQL para las instrucciones INSERT INTO e implementando el registro al final de la aplicación. De esta forma, la declaración se mantendrá con el error que impidió completarla. Se puede capturar una declaración parcial (ya que BLOB podría ser una carga de registro), pero siempre que haya un nombre de tabla, es posible verificar la estructura de la tabla y ver si contiene datos binarios.
Ejemplo de una instrucción INSERT con datos binarios truncados:
INSERTAR VALORES t1 (1, lo que 89504 …. 82 ‘)
INSERTAR EN t1 VALORES (1, X‘89504 …. 82‘) |
Para permitir una mayor ejecución de consultas, se debe agregar la variable:
CONJUNTO GLOBAL max_allowed_packet = 128M;
COLOCAR GLOBAL max_allowed_packet = 128 M ; |
La variable se puede configurar por sesión o en todo el mundo, según el caso de uso.
3. La conexión ha sido cerrada por Timeout.
Es trivial, pero las aplicaciones pueden reutilizar conexiones ya establecidas. Durante el tiempo de inactividad o bajo tráfico, es posible que algunas conexiones no se utilicen por un tiempo y se cierren al final de MySQL. Se rastrea mejor con el registro de aplicaciones; si hay un evento que sucedió en la noche seguido de un período de inactividad y luego el error en la mañana, es muy probable que MySQL haya cerrado la conexión.
mysql> SET SESSION wait_timeout = 5; Consulta OK, 0 fila cortada (0,00 seg)
mysql> COLOCAR SESIÓN wait_timeout = 5 ; Pregunta OK, 0 póngase en fila afectado (0,00 segundo) |
Espere 5 segundos:
mysql> seleccione 1; ERROR 2006 (HY000): El servidor MySQL desapareció. Sin conexión. Intente volver a conectarse … Id. De conexión: 16 Base de datos actual: *** NINGUNO *** + — + | 1 | + — + | 1 | + — + 1 fila en conjunto (0.01 seg)
mysql> Seleccione 1 ; ERROR 2006 (HY000): MySQL servidor posee elaborar lejos No conexión. Intentalo a reconectarse... Conexión identificación: dieciséis Actual base de datos: *** NADIE *** + — + | 1 | + — + | 1 | + — + 1 póngase en fila en colocar (0,01 segundo) |
Por lo general, la conexión se restablece y la aplicación continúa con su funcionamiento normal; pero aún es posible extender el tiempo de espera en la configuración de MySQL:
CONJUNTO GLOBAL wait_timeout = 57600;
COLOCAR GLOBAL wait_timeout = 57600 ; |
El valor predeterminado de la variable es 28800 segundos (8 horas), que es suficiente en la mayoría de los casos.
Además, el cierre ordenado de las conexiones desde un extremo de la aplicación, después de un período de inactividad, elimina este problema.
4. El servidor MySQL ya no existe.
Este es probablemente el peor de los casos cuando MySQL se bloquea en una consulta o por alguna otra razón, por ejemplo, el asesino de OOM eliminó el proceso. Sin embargo, también puede deberse a un reinicio limpio.
En este caso, se debe verificar el tiempo de actividad de MySQL y los registros, el registro de errores de MySQL y el syslog. Deben indicar si se ha reiniciado el servidor y si hubo un error que provocó el reinicio.
En caso de que el servidor falle, es hora de encontrar la causa real. Verifique el rastreador de errores, ya que es posible que el problema ya se haya informado y se haya solucionado; actualice MySQL si es necesario. En caso de que haya sido un reinicio limpio, verifique si las actualizaciones automáticas están habilitadas o si alguien más ha reiniciado el servicio de forma interactiva (sí, la falta de comunicación también es un problema).