web-dev-qa-db-fra.com

MySQL: obtient en permanence "En attente du verrouillage des métadonnées de table"

Ma base de données MySQL sert trois applications Web en tant que back-end de stockage. Cependant, j'ai récemment rencontré de façon permanente l'erreur "En attente du verrouillage des métadonnées de table". Cela arrive presque tout le temps et je ne comprends pas pourquoi.

mysql> show processlist
    -> ;
+------+-----------+-----------------+------------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+
| Id   | User      | Host            | db         | Command | Time | State                           | Info                                                                                                 |
+------+-----------+-----------------+------------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+
|   36 | root      | localhost:33444 | bookmaker2 | Sleep   |  139 |                                 | NULL                                                                                                 |
|   37 | root      | localhost:33445 | bookmaker2 | Sleep   |  139 |                                 | NULL                                                                                                 |
|   38 | root      | localhost:33446 | bookmaker2 | Sleep   |  139 |                                 | NULL                                                                                                 |
|   39 | root      | localhost:33447 | bookmaker2 | Sleep   |   49 |                                 | NULL                                                                                                 |
|   40 | root      | localhost:33448 | bookmaker2 | Sleep   |  139 |                                 | NULL                                                                                                 |
| 1315 | bookmaker | localhost:34869 | bookmaker  | Sleep   |   58 |                                 | NULL                                                                                                 |
| 1316 | root      | localhost:34874 | bookmaker3 | Sleep   |   56 |                                 | NULL                                                                                                 |
| 1395 | bookmaker | localhost:34953 | bookmaker  | Sleep   |   58 |                                 | NULL                                                                                                 |
| 1396 | root      | localhost:34954 | bookmaker3 | Sleep   |   46 |                                 | NULL                                                                                                 |
| 1398 | root      | localhost:34956 | bookmaker3 | Query   |   28 | Waiting for table metadata lock | CREATE TABLE IF NOT EXISTS LogEntries  ( 
                    lid         INT NOT NULL AUTO_INCREMEN |
| 1399 | root      | localhost       | NULL       | Query   |    0 | NULL                            | show processlist                                                                                     |
+------+-----------+-----------------+------------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+

Bien sûr, on peut tuer le processus correspondant. Cependant, si je redémarre mon programme qui tente de créer la structure de table de ma base de données "bookmaker3", le processus nouvellement créé se retrouve à nouveau dans un metalock.

Je ne peux même pas laisser tomber la base de données:

mysql> drop database bookmaker3;

Cela donne aussi un métalock.

Comment cela peut-il être réparé?

13
toom

Tuez la connexion avec le verrou

Kill 1398

Ensuite, vérifiez si autocommit est défini sur 0 par

select @@autocommit;

Si oui, vous avez probablement oublié de valider votre transaction. Puis une autre connexion veut faire quelque chose avec cette table, ce qui provoque le verrouillage.

Dans votre cas: Si vous avez interrogé LogEntries (ce qui existe) et ne l'avez pas validé, vous essayez d'exécuter CREATE TABLE SI PAS EXISTS d'une autre connexion - le verrouillage des métadonnées se produit.

edit Pour moi, le bogue est quelque part dans votre application. Vérifiez-le ou définissez autocommit sur 1 si vous n'utilisez pas de transactions dans l'application.

ps vérifie également ces messages: 

19
michalczukm

Dans le cas où vous avez un plug-in HS et tentez de CREATE ou ALTER table que vous avez déjà tenté d'évaluer via HS, vous rencontrez un problème similaire et vous devez redémarrer le plug-in HS de cette manière pour libérer le verrou de métadonnées de table:

UNINSTALL PLUGIN HANDLERSOCKET;
INSTALL PLUGIN HANDLERSOCKET SONAME 'handlersocket.so';
0