あるトランザクションで触っている最中のテーブルに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)