MySQL: Постоянное получение "Ожидание блокировки метаданных таблицы"

Моя база данных MySQL обслуживает три webapps в качестве хранилища. Однако я недавно столкнулся с постоянной ошибкой "Ожидание блокировки метаданных таблицы". Это происходит почти все время, и я не понимаю, почему.

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                                                                                     |
+------+-----------+-----------------+------------+---------+------+---------------------------------+------------------------------------------------------------------------------------------------------+

Конечно, можно убить соответствующий процесс. Однако, если я перезапущу свою программу, которая пытается создать структуру таблицы моей базы данных "bookmaker3", вновь созданный процесс снова заканчивается на металлическом столе.

Я даже не могу отказаться от базы данных:

mysql> drop database bookmaker3;

Это дает также металлик.

Как это можно отремонтировать?

Ответ 1

Убейте соединение с блокировкой

Kill 1398

Затем проверьте, установлена ​​ли у вас автозагрузка 0 на

select @@autocommit;

Если да, вы, возможно, забыли совершить транзакцию. Затем другое соединение хочет что-то сделать с этой таблицей, что вызывает блокировку.

В вашем случае: если вы сделали какой-то запрос в LogEntries (whitch exists) и не зафиксировали его, то вы попытаетесь выполнить CREATE TABLE, если не EXISTS из другого соединения - произойдет блокировка метаданных.

изменить Для меня ошибка где-то в вашем приложении. Проверьте там или установите автосообщение в 1, если вы не используете транзакции в приложении.

ps также проверяют эти сообщения:

Ответ 2

Если у вас есть плагин HS и вы пытаетесь выполнить таблицу CREATE или ALTER, которую уже пытались оценить через HS, вы столкнетесь с подобной проблемой, и вам придется перезапустить плагин HS таким образом, чтобы освободить блокировку метаданных таблицы

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