Solución:
Solución 1:
Vea el enlace de Marko para las tablas InnoDB y las advertencias.
Para MyISAM, no hay una solución sencilla de “esta es la consulta ofensiva”. Siempre debe comenzar con una lista de procesos. Pero asegúrese de incluir la palabra clave completa para que las consultas impresas no se trunquen:
SHOW FULL PROCESSLIST;
Esto le mostrará una lista de todos los procesos actuales, su consulta SQL y su estado. Ahora, por lo general, si una sola consulta hace que muchas otras se bloqueen, debería ser fácil de identificar. Las consultas afectadas tendrán un estado de Locked
y la consulta ofensiva se quedará afuera por sí sola, posiblemente esperando algo intensivo, como una tabla temporal.
Si no es obvio, tendrá que usar sus poderes de deducción de SQL para determinar qué parte de SQL ofensivo puede ser la causa de sus problemas.
Solucion 2:
Si usa InnoDB y necesita verificar las consultas en ejecución, le recomiendo
show engine innodb status;
como se menciona en el enlace de Marko. Esto le dará la consulta de bloqueo, cuántas filas / tablas están bloqueadas, etc. Busque en TRANSACCIONES.
El problema de usar SHOW PROCESSLIST
es que no verá los bloqueos a menos que haya otras consultas en cola.
Solución 3:
Tratar SHOW OPEN TABLES
:
show open tables where In_Use > 0 ;
Solución 4:
Ninguna de las respuestas puede mostrar todos los bloqueos que se mantienen actualmente.
Haga esto, por ejemplo, en mysql en una terminal.
start transaction;
update someTable set name="foobar" where ID=1234;
-- but no rollback or commit - just let it sit there
Claramente, la transacción anterior tiene un bloqueo, porque la transacción aún está activa. Pero no hay ninguna consulta en este momento y nadie está esperando un candado en ninguna parte (al menos todavía).
INFORMATION_SCHEMA.INNODB_LOCKS
está vacío, lo cual tiene sentido dada la documentación, porque solo hay una transacción y actualmente nadie espera ningún bloqueo. También INNODB_LOCKS
está en desuso de todos modos.
SHOW ENGINE INNODB STATUS
es inútil: someTable
no se menciona en absoluto
SHOW FULL PROCESSLIST
está vacío, porque el culpable no está ejecutando una consulta en este momento.
Puedes usar INFORMATION_SCHEMA.INNODB_TRX
, performance_schema.events_statements_history
y performance_schema.threads
para extraer las consultas que las transacciones activas han ejecutado en el pasado como se describe en mi otra respuesta, pero no he encontrado ninguna forma de ver eso someTable
está bloqueado en el escenario anterior.
Las sugerencias en las otras respuestas hasta ahora no ayudarán al menos.
Descargo de responsabilidad: no tengo innotop instalado y no me molesté. Tal vez eso podría trabaja.
Solución 5:
Usando este comando
SHOW PROCESSLIST
mostrará todo el proceso que se está ejecutando actualmente, incluido el proceso que ha adquirido un bloqueo en las tablas.