地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【MySQL】metadatalock

あるトランザクションで触っている最中のテーブルにDDLを発行するとmetadataロック待ちが発生する。以降のmetadataロック待ちのテーブルへのDMLは全て最初のトランザクションが終わるのを待ち続けるという話。

mysql> desc text;
+-----------+------------------+------+-----+---------+----------------+
| Field     | Type             | Null | Key | Default | Extra          |
+-----------+------------------+------+-----+---------+----------------+
| old_id    | int(10) unsigned | NO   | PRI | NULL    | auto_increment |
| old_text  | mediumblob       | NO   |     | NULL    |                |
| old_flags | tinyblob         | NO   |     | NULL    |                |
+-----------+------------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

mysql> insert into text values(1,"aaa","bbb");
Query OK, 1 row affected (0.00 sec)
mysql> drop table text;
<- 待ち
mysql> select * from text;
<- 待ち

こうなってしまっては最初のクエリを特定してkillする必要がある。

mysql> show processlist;
+----+------+-----------+---------------+---------+------+---------------------------------+--------------------+
| Id | User | Host      | db            | Command | Time | State                           | Info               |
+----+------+-----------+---------------+---------+------+---------------------------------+--------------------+
|  5 | root | localhost | test_database | Query   |    0 | starting                        | show processlist   |
|  6 | root | localhost | test_database | Query   |   35 | Waiting for table metadata lock | drop table text    |
|  7 | root | localhost | test_database | Query   |   11 | Waiting for table metadata lock | select * from text |
+----+------+-----------+---------------+---------+------+---------------------------------+--------------------+
3 rows in set (0.00 sec)