数据库大量Waiting for table flush 状态SQL问题排查
环境:rds for mysql5.7
因特殊原因,业务侧账号有reload权限
今天收到活跃会话数过多的告警,登录服务器查看有大量SQL语句状态处于【Waiting for table flush 】
下图是复现之后的场景,只有一个大查询再跑,其它的查询语句都是【Waiting for table flush 】状态,
mysql> show processlist; +----+-------------+-----------------+-------+---------+-------+--------------------------------------------------------+------------------------------------------------+ | Id | User | Host | db | Command | Time | State | Info | +----+-------------+-----------------+-------+---------+-------+--------------------------------------------------------+------------------------------------------------+ | 1 | system user | | NULL | Connect | 21234 | Connecting to master | NULL | | 2 | system user | | NULL | Connect | 21234 | Slave has read all relay log; waiting for more updates | NULL | | 8 | root | 127.0.0.1:39070 | ceshi | Sleep | 10 | | NULL | | 9 | root | 127.0.0.1:39120 | ceshi | Query | 65 | User sleep | select * from tt where id=(select sleep(3000)) | | 11 | root | 127.0.0.1:39124 | ceshi | Query | 45 | Waiting for table flush | select * from tt | | 12 | root | 127.0.0.1:39126 | NULL | Query | 0 | starting | show processlist | | 15 | root | 127.0.0.1:39132 | NULL | Sleep | 24 | | NULL | +----+-------------+-----------------+-------+---------+-------+--------------------------------------------------------+------------------------------------------------+
第一反应想到了高鹏的一篇文章,
https://blog.csdn.net/n88Lpo/article/details/113749804
在有大查询时,对查询的表执行一次analyze table ,后面所有关于这张表的查询都会被阻塞,状态并处于【Waiting for table flush】,同事将大查询KILL掉以后,实例恢复正常。
当时怀疑有人执行了analyze table 或代码框架执行过 analyze table,或者其它操作,查看RDS慢日志有一些线索,看到有过几次flush table with read lock;
这个操作非常重,联系开发查看代码,为了获取binlog位点会锁一次,但似乎这个命令会并发执行,研发将flush table with read lock命令屏蔽掉后,实例一直运行正常。
正常情况下flush table with lock 后,SQL状态应该是等待全局锁,但不知道为什么会是等待flush table。
尝试后复现该问题
从整个过程看,第二个flush table with lock 我停掉后,后续的SQL并没有正常执执行,还是【Waiting for table flush】
个人猜测原因和高鹏的那篇相似。