it-swarm.com.de

MySQL: "Wartet auf Tabellenmetadatensperre"

Meine MySQL-Datenbank stellt drei Webapps als Speicher-Backend bereit. Ich stelle jedoch in letzter Zeit dauerhaft den Fehler "Warten auf Tabellenmetadatensperre" fest. Es passiert fast immer und ich verstehe nicht warum.

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

Natürlich kann man den entsprechenden Prozess abbrechen. Wenn ich jedoch mein Programm neu starte, das versucht, die Tabellenstruktur meiner Datenbank "bookmaker3" zu erstellen, landet der neu erstellte Prozess wieder in einem Metalock.

Ich kann die Datenbank sogar nicht löschen:

mysql> drop database bookmaker3;

Dies ergibt auch einen Metalock.

Wie kann das repariert werden?

13
toom

Töte die Verbindung mit dem Schloss

Kill 1398

Dann prüfen Sie, ob Sie Autocommit auf 0 gesetzt haben

select @@autocommit;

Wenn ja, haben Sie wahrscheinlich vergessen, die Transaktion auszuführen. Dann möchte eine andere Verbindung etwas mit dieser Tabelle machen, was die Sperre verursacht.

In Ihrem Fall: Wenn Sie eine Abfrage an LogEntries (die vorhanden ist) und nicht festgeschrieben haben, versuchen Sie CREATE TABLE WENN NOT EXISTS von einer anderen Verbindung aus auszuführen - die Metadatensperre tritt auf.

edit Für mich liegt der Fehler irgendwo in Ihrer Anwendung. Überprüfen Sie dort oder setzen Sie Autocommit auf 1, wenn Sie keine Transaktionen in der Anwendung verwenden.

ps prüft auch diese Beiträge: 

19
michalczukm

Falls Sie ein HS-Plugin haben und versuchen, eine CREATE- oder ALTER-Tabelle zu verwenden, die bereits versucht wurde, die Bewertung über HS zu ermitteln, werden Sie mit einem ähnlichen Problem konfrontiert. Sie müssen das HS-Plugin auf diese Weise neu starten, um die Metadatensperre der Tabelle zu lösen:

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