一、问题描述
问题如下:
mysql> show processlist;
+----+-----------------+-----------+------+---------+-------+-------------------------+----------------------------------+
| Id | User | Host | db | Command | Time | State | Info |
+----+-----------------+-----------+------+---------+-------+-------------------------+----------------------------------+
| 5 | event_scheduler | localhost | NULL | Daemon | 34025 | Waiting on empty queue | NULL |
| 11 | root | localhost | NULL | Query | 1528 | User sleep | select sleep(1000) from test.e01 |
| 12 | root | localhost | NULL | Query | 0 | starting | show processlist |
| 23 | root | localhost | NULL | Query | 33 | Waiting for table flush | select * from test.e01 |
| 24 | root | localhost | NULL | Query | 7 | Waiting for table flush | select * from test.e01 |
+----+-----------------+-----------+------+---------+-------+-------------------------+----------------------------------+
乍一看来,很是奇怪,这里没有出现我们经常遇到的flush table/flush table with read lock 堵塞,直接出现了 Waiting for table flush的堵塞,有点像
https://www.jianshu.com/p/b141585cd844
以前记录的文章中的案例2,但是其实并不一样,这里是由于analyze table语句造成的。构造非常简单(必须是社区版本,我使用的8.0.21),如下:
窗口1:
mysql> select sleep(1000) from test.e01;(要有几条数据)
这条语句肯定结束不了
窗口2:
mysql> analyze table test.e01
-> ;
+----------+---------+----------+----------+</