Desde un script envié una consulta como esta miles de veces a mi base de datos local:
update some_table set some_column = some_value
Olvidé agregar la parte where, por lo que la misma columna se configuró con el mismo valor para todas las filas de la tabla y esto se hizo miles de veces y la columna se indexó, por lo que el índice correspondiente probablemente se actualizó muchas veces .
Noté que algo andaba mal, porque tardó demasiado, así que eliminé el guión. Incluso reinicié mi computadora desde entonces, pero algo se quedó atascado en la tabla, porque las consultas simples demoran mucho tiempo en ejecutarse y cuando intento soltar el índice relevante falla con este mensaje:
Lock wait timeout exceeded; try restarting transaction
Es una tabla innodb, por lo que la transacción atascada es probablemente implícita. ¿Cómo puedo arreglar esta tabla y eliminar la transacción atascada?
fuente
SHOW FULL PROCESSLIST
?Respuestas:
Tuve un problema similar y lo resolví revisando los hilos que se están ejecutando. Para ver los subprocesos en ejecución, use el siguiente comando en la interfaz de línea de comando mysql:
También se puede enviar desde phpMyAdmin si no tiene acceso a la interfaz de línea de comando mysql.
Esto mostrará una lista de subprocesos con identificadores correspondientes y tiempo de ejecución, por lo que puede MATAR los subprocesos que están tardando demasiado en ejecutarse. En phpMyAdmin tendrá un botón para detener los hilos usando KILL, si está usando la interfaz de línea de comando solo use el comando KILL seguido del id del hilo, como en el siguiente ejemplo:
Esto terminará la conexión para el hilo correspondiente.
fuente
Puede verificar las transacciones actualmente en ejecución con
Su transacción debería ser una de las primeras, porque es la más antigua de la lista. Ahora solo toma el valor
trx_mysql_thread_id
y envíale elKILL
comando:Si no está seguro de qué transacción es suya, repita la primera consulta con mucha frecuencia y vea qué transacciones persisten.
fuente
Verifique el estado de InnoDB para ver si hay bloqueos
Verifica las tablas abiertas de MySQL
Verificar transacciones pendientes de InnoDB
Comprobar dependencia de bloqueo: qué bloquea qué
Después de investigar los resultados anteriores, debería poder ver qué está bloqueando qué.
La causa raíz del problema también puede estar en su código; compruebe las funciones relacionadas, especialmente para las anotaciones si usa JPA como Hibernate.
Por ejemplo, como se describe aquí , el mal uso de la siguiente anotación puede causar bloqueos en la base de datos:
fuente
SELECT * FROM information_schema.innodb_trx t JOIN information_schema.processlist p ON t.trx_mysql_thread_id = p.id
reveló al culpable: el hilo de bloqueo vino de mi dirección IP ...Esto comenzó a sucederme cuando el tamaño de mi base de datos creció y estaba haciendo muchas transacciones en él.
La verdad es que probablemente haya alguna forma de optimizar sus consultas o su base de datos, pero pruebe estas 2 consultas para solucionar el problema.
Ejecuta esto:
Y luego esto:
fuente
Cuando establece una conexión para una transacción, adquiere un bloqueo antes de realizar la transacción. Si no puede adquirir el bloqueo, intente por algún tiempo. Si aún no se puede obtener el bloqueo, se genera el error de tiempo de espera de bloqueo excedido. La razón por la que no podrá adquirir un bloqueo es que no está cerrando la conexión. Por lo tanto, cuando intente obtener un bloqueo por segunda vez, no podrá adquirir el bloqueo ya que su conexión anterior aún no está cerrada y mantiene el bloqueo.
Solución: cierre la conexión o
setAutoCommit(true)
(según su diseño) para liberar el bloqueo.fuente
Reinicie MySQL, funciona bien.
PERO tenga en cuenta que si dicha consulta está atascada, hay un problema en alguna parte:
LIKE %...%
, etc.)Como dijo @syedrakib, funciona, pero esta no es una solución de larga duración para la producción.
Cuidado: hacer el reinicio puede afectar sus datos con un estado inconsistente.
Además, puede verificar cómo MySQL maneja su consulta con la palabra clave EXPLAIN y ver si hay algo allí para acelerar la consulta (índices, pruebas complejas, ...).
fuente
Ir a procesos en mysql.
Entonces puedo ver que hay una tarea que aún funciona.
Elimine el proceso en particular o espere hasta que se complete el proceso.
fuente
Me encontré con el mismo problema con una declaración de "actualización". Mi solución fue simplemente ejecutar las operaciones disponibles en phpMyAdmin para la tabla. Optimicé, enjuagué y desfragmenté la tabla (no en ese orden). No es necesario dejar la tabla y restaurarla desde la copia de seguridad para mí. :)
fuente
Tuve el mismo problema. Creo que fue un problema de bloqueo con SQL. Puede forzar el cierre del proceso SQL desde el Administrador de tareas. Si eso no lo solucionó, simplemente reinicie su computadora. No necesita soltar la tabla y volver a cargar los datos.
fuente
Tuve este problema al intentar eliminar un determinado grupo de registros (usando MS Access 2007 con una conexión ODBC a MySQL en un servidor web). Por lo general, eliminaría ciertos registros de MySQL y luego los reemplazaría con registros actualizados (eliminar en cascada varios registros relacionados, esto simplifica la eliminación de todos los registros relacionados para una sola eliminación de registros).
Traté de ejecutar las operaciones disponibles en phpMyAdmin para la tabla (optimizar, vaciar, etc.), pero estaba recibiendo un permiso necesario para RELOAD error cuando intenté vaciar. Como mi base de datos está en un servidor web, no pude reiniciar la base de datos. Restaurar desde una copia de seguridad no era una opción.
Intenté ejecutar la consulta de eliminación para este grupo de registros en el acceso cPanel mySQL en la web. Recibí el mismo mensaje de error.
Mi solución: utilicé el MySQL Query Browser gratuito de Sun (Oracle) (que instalé previamente en mi computadora) y ejecuté la consulta de eliminación allí. Funcionó de inmediato, problema resuelto. Luego pude realizar una vez más la función usando la secuencia de comandos Access usando la conexión ODBC Access to MySQL.
fuente
Arreglado.
Asegúrese de que no haya una inserción de tipo de datos no coincidente en la consulta. Tuve un problema por el que estaba intentando "datos del agente del navegador del usuario"
VARCHAR(255)
y tenía problemas con este bloqueo, pero cuando lo cambié aTEXT(255)
él, lo solucioné.Por lo tanto, lo más probable es que no coincidan los tipos de datos.
fuente
Resolví el problema soltando la tabla y restaurándola desde la copia de seguridad.
fuente