J'essaye d'exécuter un peu de DDL sur une table et des SHOW PROCESSLIST
ré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:
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.
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.
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.
INFORMATION_SCHEMA
base de données.