Comment trouver quelle transaction provoque un état «En attente de verrouillage des métadonnées de la table»?


95

J'essaye d'exécuter un peu de DDL sur une table et des SHOW PROCESSLISTrésultats dans un message «En attente de verrouillage des métadonnées de table».

Comment puis-je savoir quelle transaction n'est pas encore clôturée?

J'utilise MySQL v5.5.24.

Réponses:


148
SHOW ENGINE INNODB STATUS \G

Recherchez la section -

TRANSACTIONS

Nous pouvons utiliser les tables INFORMATION_SCHEMA .

Requêtes utiles

Pour vérifier toutes les transactions de verrouillage sont en attente:

USE INFORMATION_SCHEMA;
SELECT * FROM INNODB_LOCK_WAITS;

Une liste des transactions de blocage:

SELECT * 
FROM INNODB_LOCKS 
WHERE LOCK_TRX_ID IN (SELECT BLOCKING_TRX_ID FROM INNODB_LOCK_WAITS);

OU

SELECT INNODB_LOCKS.* 
FROM INNODB_LOCKS
JOIN INNODB_LOCK_WAITS
  ON (INNODB_LOCKS.LOCK_TRX_ID = INNODB_LOCK_WAITS.BLOCKING_TRX_ID);

Une liste de verrous sur une table particulière:

SELECT * FROM INNODB_LOCKS 
WHERE LOCK_TABLE = db_name.table_name;

Une liste de transactions en attente de verrous:

SELECT TRX_ID, TRX_REQUESTED_LOCK_ID, TRX_MYSQL_THREAD_ID, TRX_QUERY
FROM INNODB_TRX
WHERE TRX_STATE = 'LOCK WAIT';

Référence - Dépannage MySQL: Que faire lorsque les requêtes ne fonctionnent pas , Chapitre 6 - Page 96.


17
A noter simplement que toutes les tables référencées sont dans la INFORMATION_SCHEMAbase de données.
Michael Mior

9
Ces tables InnoDB contiennent-elles vraiment des informations sur les verrous de métadonnées? Ce billet de blog suggère le contraire: mysql.wisborg.dk/2014/01/13/…
Gareth

1
@Gareth: fonctionne jusqu'à mysql -mysql-5-7-3-. Merci pour la mise à jour.
Joddy

11
tous avaient des ensembles vides ... mais il y a toujours le verrou affiché sur la liste de processus ...
K2xL

1
Consultez le commentaire ci-dessous stackoverflow.com/a/36175882/362574
Joddy

50

Si vous ne trouvez pas le processus verrouillant la table (car il est déjà mort), il peut s'agir d'un thread qui nettoie toujours comme ceci

section TRANSACTION de

show engine innodb status;

à la fin

---TRANSACTION 1135701157, ACTIVE 6768 sec
MySQL thread id 5208136, OS thread handle 0x7f2982e91700, query id 882213399 xxxIPxxx 82.235.36.49 my_user cleaning up

comme mentionné dans un commentaire dans Clear transaction deadlock?

vous pouvez essayer de tuer directement le thread de transaction, ici avec

 KILL 5208136;

travaillé pour moi.


10

mysql 5.7 expose les informations de verrouillage des métadonnées à travers la performance_schema.metadata_lockstable.

Documentation ici


4

J'ai eu un problème similaire avec Datagrip et aucune de ces solutions n'a fonctionné.

Une fois que j'ai redémarré le client Datagrip, ce n'était plus un problème et je pouvais à nouveau supprimer des tables.


3
redémarrer / redémarrer - la solution 100% fonctionnelle pour tous les problèmes informatiques. Cependant, dans Prod, les redémarrages ne sont pas toujours possibles
asgs

2
J'ai eu le même problème et la fermeture de DataGrip a soudainement laissé tomber tous les verrous. C'est beaucoup de temps perdu.
ScottBurfieldMills
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.