2012-09-15 11 views
11

Tutto ad un tratto (senza alcuna modifica al codice correlato) che stiamo ottenendo gli errori di blocco attraverso il record attivo come ad esempio:Come posso risolvere gli errori di timeout del blocco 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 

e

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

Non stiamo facendo le nostre proprie transazioni in entrambe le di questi modelli, quindi le uniche transazioni sono quelle integrate. Non c'è stata un'impennata nel traffico o nel volume delle richieste.

Questi errori sembrano essere quando una "nuova" query tenta di essere eseguita su una tabella bloccata e deve attendere, come possiamo vedere cosa sta aspettando? Come possiamo capire quale parte del nostro codice sta emettendo query che bloccano le tabelle per lunghi periodi di tempo?

Qualche idea su dove possiamo guardare o su come indagare la causa di questo?

+0

Si potrebbe provare l'approccio per disabilitare il blocco del gap in questo modo: innodb_locks_unsafe_for_binlog = 1, tuttavia potrebbe causare alcuni record fantasma. leggi di più [qui] (http://dev.mysql.com/doc/refman/5.0/en/innodb-parameters.html#sysvar_innodb_locks_unsafe_for_binlog) – Yarneo

+0

Qual è il motore DB sottostante? Se il suo INNODB può pubblicare 'show innodb status'? – ethrbunny

+0

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

risposta

3

Date un'occhiata a pt-deadlock-logger, mentre non direttamente correlato ai binari, dovrebbe darvi una considerevole quantità di informazioni sui deadlock che si verificano.

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

C'è un interessante resoconto con alcuni esempi: http://www.mysqlperformanceblog.com/2012/09/19/logging-deadlocks-errors/

Lo strumento è molto semplice e utile. Monitora l'output di SHOW ENGINE INNODB STATUS e registra i nuovi deadlock in un file o in una tabella che possiamo rivedere in seguito. Vediamo come funziona con un esempio.

L'articolo prosegue spiegando che questo può registrare le informazioni sulla situazione di stallo, come le query coinvolte, che ospita, ID di thread, ecc

ho anche trovato utile per le query prefisso con commenti a consentire il tracciamento, come il file o il modulo, la funzione, anche quale utente. I commenti della query di solito vengono passati agli strumenti diagnostici come questo e possono aiutare a rintracciare quali parti del codice e in quali circostanze stanno causando deadlock.

Problemi correlati