2012-09-15 30 views
11

De repente (sin cambios en el código relacionado) que se producen errores de bloqueo a través de registro activo, tales como:¿Cómo puedo solucionar los errores de tiempo de espera de bloqueo de MySQL con Rails?

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: UPDATE `items` SET `state` = 'reserved', `updated_at` = '2012-09-15 17:58:21' WHERE `items`.`id` = 248220 

y

ActiveRecord::StatementInvalid: Mysql2::Error: Lock wait timeout exceeded; 
try restarting transaction: DELETE FROM `sessions` WHERE `sessions`.`id` = 41997883 

No estamos haciendo nuestras propias transacciones en cualquiera de estos modelos, por lo que las únicas transacciones son las integradas en rieles. No ha habido un aumento en el tráfico o volumen de solicitudes.

Estos errores parecen ser cuando una "nueva" consulta intenta ejecutarse en una tabla bloqueada y tiene que esperar, ¿cómo vemos lo que está esperando? ¿Cómo averiguamos qué parte de nuestro código está emitiendo consultas que bloquean las tablas durante períodos de tiempo prolongados?

¿Alguna idea sobre dónde podemos mirar o cómo investigar la causa de esto?

+0

Puede intentar ir por el enfoque de desactivar el bloqueo de hueco de la siguiente manera: innodb_locks_unsafe_for_binlog = 1, aunque podría causar algunos registros fantasma. leer más sobre esto [aquí] (http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_locks_unsafe_for_binlog) – Yarneo

+0

¿Cuál es el motor de base de datos subyacente? Si su INNODB puede publicar 'show innodb status'? – ethrbunny

+0

SHOW ENGINE INNODB STATUS https://gist.github.com/3758910 – chrishomer

Respuesta

3

Echar un vistazo a pt-deadlock-logger, aunque no esté directamente relacionado con los rieles, debería darle una cantidad considerable de información sobre los bloqueos que se producen.

http://www.percona.com/doc/percona-toolkit/2.1/pt-deadlock-logger.html

hay un bonito valoración crítica con algunos ejemplos: http://www.mysqlperformanceblog.com/2012/09/19/logging-deadlocks-errors/

La herramienta es muy simple y útil. Supervisa la salida de SHOW ENGINE INNODB STATUS y registra los nuevos deadlocks en un archivo o en una tabla que luego podemos revisar. Veamos cómo funciona con un ejemplo.

El artículo continúa explicando que esto se puede registrar información sobre el punto muerto como consultas involucradas, donde se aloja, identificadores de hilo, etc.

También he encontrado que es útil para consultas con prefijo a los comentarios Permitir el seguimiento, como el archivo o módulo, función, incluso qué usuario. Por lo general, los comentarios de la consulta se transmiten a herramientas de diagnóstico como este y pueden ayudar a rastrear qué partes del código y en qué circunstancias están causando interbloqueos.

Cuestiones relacionadas