Come rilevare deadlock in Mysql / innodb?
-
22-07-2019 - |
Domanda
So che i deadlock si verificano inevitabilmente quando si utilizzano le transazioni in Innodb e che sono innocui se trattati correttamente dal codice dell'applicazione - "riprovare", come dice il manuale.
Quindi mi chiedevo: come si rilevano i deadlock? Un deadlock genera un numero di errore mysql speciale? Sto usando l'estensione mysqli di PHP se è importante.
Grazie.
Modifica: soluzione trovata, vedi commenti
Soluzione
http://dev.mysql.com/ doc / refman / 5.0 / it / InnoDB-error-codes.html
1213 (ER_LOCK_DEADLOCK)
Deadlock della transazione. Dovresti rieseguire la transazione.
Altri suggerimenti
" MOSTRA STATO INNODB MOTORE " dal client della riga di comando di MySQL (non un browser di query) fornirà informazioni sui deadlock.
I deadlock possono anche essere causati da transazioni non impegnate (di solito bug del programma) e la persona che sta eseguendo la transazione non impegnata non vedrà il problema in quanto funzionerà bene (attraverso i suoi dati non verrà eseguito il commit).
Prova MaatKit . Ha un logger deadlock.
Prova a utilizzare MONyog . Abilita il monitoraggio deadlock di MONyog " opzione per tracciare i deadlock segnalati da INNODB STATUS. MONyog invierà un avviso all'utente quando si verifica un nuovo deadlock.
Prova innotop, rileverà il deadlock per te.
Se sei su un mac:
$ brew install percona-toolkit
$ pt-deadlock-logger -uroot --ask-pass localhost
Di recente ho creato un controllo molto semplice per i deadlock per l'implementazione di un test del fumo di un'applicazione Web. Il codice può essere migliorato molto, ma per ora funziona. Vedi https://dev.mysql.com/doc /refman/8.0/en/innodb-standard-monitor.html per ulteriori informazioni sull'output della query utilizzata di seguito.
$status = DB::select("SHOW ENGINE INNODB STATUS")["Status"]??null;
if(strpos($status,"LATEST DETECTED DEADLOCK") !== false)
{
trigger_error("LATEST DETECTED DEADLOCK section present in output of SHOW ENGINE INNODB STATUS");
}
if(strpos($status,"LATEST FOREIGN KEY ERROR") !== false)
{
trigger_error("LATEST FOREIGN KEY ERROR section present in output of SHOW ENGINE INNODB STATUS");
}