Cerraduras de table InnoDB sin razón aparente

Tengo una tabla de InnoDB para el conteo de visitantes, que ha funcionado perfectamente durante varios años, pero falló dos veces ayer, puede ser causa del aumento de visitantes Sin razón aparente, esta tabla bloqueada, con cientos de DELETE una REPLACE INTO consultas (+ 500) con estado de "actualización" o "limpieza". (Ya no tengo la copy de la list de processs …)

Esta tabla contiene pocas inputs, entre 500 y 1500, por lo que las consultas de actualización son generalmente muy rápido y no se bloquean.

Cuando ocurrió el problema, comprobé la list de process muchas veces, y no he visto ninguna consulta que bloqueaba la tabla explícitamente. En realidad, establecí mis sitios web en el modo de mantenimiento, por lo que no más consultas se agregaron a la queue, y todavía había más de 500 consultas, todos iguales:

 +---------+---------+--------------+---------+---------+------+----------+-----------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +---------+---------+--------------+---------+---------+------+----------+-----------------------------------------------+ | 2780657 | XXXXXXX | XXXXXX:58199 | XXXXXXX | Query | 660 | updating | DELETE FROM connected WHERE time < 1272100968 | | 2764941 | XXXXXXX | XXXXXX:57314 | XXXXXXX | Query | 660 | updating | DELETE FROM connected WHERE time < 1272100968 | | 2784467 | XXXXXXX | XXXXXX:44221 | XXXXXXX | Query | 661 | updating | DELETE FROM connected WHERE time < 1272100969 | ... 

No sé dónde debo search para encontrar la causa de este problema y resolverlo definitivamente.

Pero supongo que esto podría darle una mejor visión del problema:

 mysql> show global status like "%innodb_row_lock%"; +-------------------------------+-----------+ | Variable_name | Value | +-------------------------------+-----------+ | Innodb_row_lock_current_waits | 0 | | Innodb_row_lock_time | 132004175 | | Innodb_row_lock_time_avg | 10521 | | Innodb_row_lock_time_max | 59373 | | Innodb_row_lock_waits | 12546 | +-------------------------------+-----------+ 5 rows in set (0.00 sec) 

Lo siento por mi pobre inglés, y gracias por tu ayuda 😉

El truco suele ser localizar la consulta más larga en ejecución, que se identifica en show full processlist; También puede utilizar una utilidad como mytop para orderar las consultas por time de ejecución.

Una vez que aislar la consulta que causa el locking, puede intentar determinar por qué se bloqueó. ¿Hubo una alteración en la table causando un locking de escritura? Hay una variedad de escenarios diferentes, que en la mayoría de los casos estarán relacionados con un problema de aplicación.

Es muy difícil proporcionar una recomendación definitiva sin solucionar activamente los problemas. Por lo less, más detalles como la list de processs y la aplicación en cuestión sería útil.