一招解决MySQL中DDL语句被阻塞的问题场景
mysql> use test;<br>Database changed<br><br>mysql> CREATE TABLE `test` (<br> -> `id` int(11) AUTO_INCREMENT PRIMARY KEY,<br> -> `name` varchar(10)<br> -> );<br>Query OK, 0 rows affected (0.01 sec)<br><br># 插入数据<br>mysql> insert into test values (1,'aaa'),(2,'bbb'),(3,'ccc'),(4,'ddd');<br>Query OK, 1 row affected (0.01 sec)<br><br>mysql> begin;<br>Query OK, 0 rows affected (0.01 sec)<br><br><br>mysql> select * from test;<br>+----+------+<br>| id | name |<br>+----+------+<br>| 1 | aaa |<br>| 2 | bbb |<br>| 3 | ccc |<br>| 4 | ddd |<br>+----+------+<br>4 rows in set (0.00 sec)<br><br># 模拟元数据锁阻塞<br># 会话 1<br>mysql> lock tables test read;<br>Query OK, 0 rows affected (0.00 sec)<br><br># 会话 2<br>mysql> alter table test add c1 varchar(25);<br>阻塞中<br><br># 会话 3<br><br>mysql> show processlist;<br>+-------+-------------+---------------------+------+------------------+--------+---------------------------------------------------------------+-------------------------------------+<br>| Id | User | Host | db | Command | Time | State | Info |<br>+-------+-------------+---------------------+------+------------------+--------+---------------------------------------------------------------+-------------------------------------+<br>| 1 | universe_op | 127.0.0.1:28904 | NULL | Sleep | 12 | | NULL |<br>| 2 | universe_op | 127.0.0.1:28912 | NULL | Sleep | 12 | | NULL |<br>| 5752 | universe_op | 10.186.64.180:51808 | NULL | Binlog Dump GTID | 605454 | Master has sent all binlog to slave; waiting for more updates | NULL |<br>| 28452 | root | 10.186.65.110:10756 | test | Sleep | 73 | | NULL |<br>| 28454 | root | 10.186.64.180:45674 | test | Query | 7 | Waiting for table metadata lock | alter table test add c1 varchar(25) |<br>| 28497 | root | 10.186.64.180:47026 | test | Query | 0 | starting | show processlist |<br>+-------+-------------+---------------------+------+------------------+--------+---------------------------------------------------------------+-------------------------------------+<br>