¿Se agota el tiempo de espera del cliente, mientras la consulta MySQL sigue ejecutándose?

9

Experimentamos un problema en el que una consulta de solo lectura, ejecutada a través de MySQL workbench, agotó el tiempo de espera desde la perspectiva de la IU de un usuario y permaneció ejecutándose en el servidor (y aparentemente consumiendo más y más recursos) hasta que tuvimos una interrupción.

Preguntas

  • ¿Existe una forma estándar de tratar este tipo de problema en MySQL?
  • ¿Hay una causa fundamental que debemos evitar?
asthasr
fuente

Respuestas:

11

Debe observar qué valores predeterminados existen para los tiempos de espera:

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

Por lo general, miro varias variables de tiempo de espera. Esto es muy imprescindible si utiliza MySQL de forma remota desde MySQL Workbench, cliente mysql o aplicación PHP en un servidor de aplicaciones que se pone en contacto con MySQL en un servidor DB.

Esto es lo que dice la documentación de MySQL una de estas configuraciones:

  • wait_timeout (Predeterminado 28800 [8 horas]): el número de segundos que el servidor espera actividad en una conexión no interactiva antes de cerrarla. Este tiempo de espera se aplica solo a las conexiones de archivos de socket TCP / IP y Unix, no a las conexiones realizadas mediante canalizaciones con nombre o memoria compartida. En el inicio del subproceso, el valor de la sesión wait_timeout se inicializa a partir del valor global wait_timeout o del valor global interactive_timeout, según el tipo de cliente (según lo definido por la opción de conexión CLIENT_INTERACTIVE a mysql_real_connect ()). Ver también interactive_timeout.
  • interactive_timeout (Predeterminado 28800 [8 horas]): la cantidad de segundos que el servidor espera actividad en una conexión interactiva antes de cerrarla. Un cliente interactivo se define como un cliente que usa la opción CLIENT_INTERACTIVE para mysql_real_connect (). Ver también wait_timeout.
  • net_read_timeout (Predeterminado 30): el número de segundos para esperar más datos de una conexión antes de cancelar la lectura. Cuando el servidor está leyendo desde el cliente, net_read_timeout es el valor de tiempo de espera que controla cuándo abortar. Cuando el servidor escribe al cliente, net_write_timeout es el valor de tiempo de espera que controla cuándo abortar. Ver también slave_net_timeout.
  • net_write_timeout (Predeterminado 60): El número de segundos para esperar a que se escriba un bloque en una conexión antes de cancelar la escritura. Ver también net_read_timeout.

Asegúrese de que estos tiempos de espera estén configurados lo suficientemente alto como para dar cabida a las consultas que pueden ejecutarse durante mucho tiempo, que pueden incluir:

  • Masa UPDATEs
  • Masa DELETEs
  • ENABLE KEYS en un gran MyISAM

Para lidiar con las consultas que siguen ejecutándose después de perder el contacto, debe ejecutar KILL contra el ID de proceso de la consulta de ejecución prolongada. Incluso con el comando KILL, tendrá que esperar cualquier consulta que esté en medio de pasos intensivos en disco o que tenga mutexes internos en progreso.

RolandoMySQLDBA
fuente
¿Existe una forma estándar y robusta de ejecutar KILL contra procesos que se han estado ejecutando durante mucho tiempo, o generalmente se realiza a través de un script bash / trabajo cron?
asthasr
De hecho, escribí una publicación en mayo de 2011 sobre cómo iniciar un script usando el esquema de
RolandoMySQLDBA
"Asegúrese de que estos tiempos de espera estén configurados lo suficientemente alto como para dar cabida a consultas que pueden ejecutarse durante mucho tiempo, que pueden incluir: ACTUALIZACIONES masivas ..." ejemplo: php + mysql, tengo que seleccionar cada registro de una columna de tabla, así que busque filas y luego hacer algo ... luego actualizar otro registro con un nuevo valor. Ponga el caso de que este script requiere aproximadamente 5 minutos o más. Uno SELECCIONA al principio y uno ACTUALIZA al final, busca filas y haz ... en el medio. ¿Puedes explicar qué tiene que hacer el wait_timeout con esta situación? Realmente no está claro para mí ... cuál es un valor seguro para wait_timeout para liberar recursos