本篇文章给大家分享的是有关MySQL从库大量select堵塞处于Waiting for table flush 状态该怎么办,小编觉得挺实用的,因此分享给大家学习,希望大家阅读完这篇文章后可以有所收获,话不多说,跟着小编一起来看看吧。

创新互联建站专注于松滋网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供松滋营销型网站建设,松滋网站制作、松滋网页设计、松滋网站官网定制、重庆小程序开发公司服务,打造松滋网络公司原创品牌,更为您提供松滋网站排名全网营销落地服务。
背景:
- mycat读写分离,应用大量select超时 
1.检查
- 通过检查发现大量select处于Waiting for table flush 状态,仔细看了一下processlist以及时间段,可以断定是备份加select慢查询引起的! 
2.重现环境
- session1 
 session2
 查看此时的processlist状态
- mysql> show full processlist; 
- +------+------+---------------------+--------+-------------+---------+-----------------------------------------------------------------------+---------------------------------------------------+ 
- | Id | User | Host | db | Command | Time | State | Info | 
- +------+------+---------------------+--------+-------------+---------+-----------------------------------------------------------------------+---------------------------------------------------+ 
- | 2 | repl | 47.93.243.162:43700 | NULL | Binlog Dump | 1527333 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL | 
- | 9140 | root | localhost | devops | Query | 564 | User sleep | select *,sleep(1000) from operation_log limit 100 | 
- | 9141 | root | localhost | NULL | Query | 0 | init | show full processlist | 
- | 9143 | root | localhost:56880 | NULL | Query | 509 | Waitingfor table flush| FLUSH NO_WRITE_TO_BINLOG TABLES| 
- 终端二执行xtracebackup备份 
- 。。。。。 
- 。。。。。 
- >> log scanned up to (768745274) 
- 。。。。。备份堵塞 
- 终端一执行一个慢查询 
- mysql> select *,sleep(1000) from operation_loglimit 100 
- session3 
- 终端3对慢查询涉及到的表进行查询操作 
- [root@iZ2ze66bhrbxkc31nljgjnZ ~]# mysql -uroot -p***** -e "select * from operation_log limit 10" devops 
- Warning: Using a password on the command line interface can be insecure. 
- ...堵塞状态 
- 此时的processlist状态 
- mysql> show full processlist; 
- +------+------+---------------------+--------+-------------+---------+-----------------------------------------------------------------------+---------------------------------------------------+ 
- | Id | User | Host | db | Command | Time | State | Info | 
- +------+------+---------------------+--------+-------------+---------+-----------------------------------------------------------------------+---------------------------------------------------+ 
- | 2 | repl | 47.93.243.162:43700 | NULL | Binlog Dump | 1527460 | Master has sent all binlog to slave; waiting for binlog to be updated | NULL | 
- | 9140 | root | localhost | devops | Query | 691 | User sleep | select *,sleep(1000) from operation_log limit 100 | 
- | 9141 | root | localhost | NULL | Query | 0 | init | show full processlist | 
- | 9143 | root | localhost:56880 | NULL | Query | 636 | Waitingfor table flush| FLUSH NO_WRITE_TO_BINLOG TABLES| 
- | 9150 | root | localhost | devops | Query | 454 | Waitingfor table flush| select* from operation_log limit 10| --查询被堵塞 
- +------+------+---------------------+--------+-------------+---------+-----------------------------------------------------------------------+---------------------------------------------------+ 
- 步骤1阻塞了步骤二,步骤二导致步骤三需要等待步骤一。 
- session4 
- 终端四对其它非慢查询中的表进行查询(不堵塞) 
- [root@iZ2ze66bhrbxkc31nljgjnZ ~]# mysql -uroot -pESBecs00 -e "select * from role limit 10" devops 
- Warning: Using a password on the command line interface can be insecure. 
- +----+-----------------+--------------------------------+--------+ 
- | id | role_name | description | status | 
- +----+-----------------+--------------------------------+--------+ 
- | 1 | 超级管理员 | 所有权限 | 1 | 
- | 3 | 开发工程师 | 开发工程师开发工程师 | 1 | 
- | 4 | 运维工程师 | 运帷工程师运帷工程师 | 1 | 
- +----+-----------------+--------------------------------+--------+ 
- [root@iZ2ze66bhrbxkc31nljgjnZ ~]# mysql -uroot -pESBecs00 -e "select * from module limit 10" devops 
- Warning: Using a password on the command line interface can be insecure. 
- +-----+--------------+--------+------------+ 
- | id | module_name | status | list_order | 
- +-----+--------------+--------+------------+ 
- | 100 | 系统管理 | 1 | 2 | 
- | 600 | 环境管理 | 1 | 3 | 
- +-----+--------------+--------+------------+ 
- 解决办法: 
- 杀掉原始慢查询sql即可! 
- xtrace版本2.2可加参数 --lock-wait-query-type=all 
- xtrace版本2.4可加参数 --ftwrl-wait-query-type 
- 该选项表示获得全局锁之前允许那种查询完成,默认是ALL,可选update。 
原因:
在flush tables with read lock成功获得锁之前,必须等待所有语句执行完成(包括SELECT)。所以如果有个慢查询在执行,或者一个打开的事务,或者其他进程拿着表锁,flush tables
with read lock就会被阻塞,直到所有的锁被释放。
- The thread got a notification that the underlying structure for a table has changed 
- and it needs to reopen the table to get the new structure. 
- However, to reopen the table, 
- it must wait until all other threads have closed the table in question. 
- This notification takes place if another thread has used FLUSH TABLES 
- or one of the following statements on the table in question: 
- FLUSH TABLES tbl_name, ALTER TABLE, RENAME TABLE, REPAIR TABLE, ANALYZE TABLE, orOPTIMIZE TABLE. 
以上就是Mysql从库大量select堵塞处于Waiting for table flush 状态该怎么办,小编相信有部分知识点可能是我们日常工作会见到或用到的。希望你能通过这篇文章学到更多知识。更多详情敬请关注创新互联行业资讯频道。
文章名称:Mysql从库大量select堵塞处于Waitingfortableflush状态该怎么办
文章链接:http://www.scyingshan.cn/article/gdghdd.html

 建站
建站
 咨询
咨询 售后
售后
 建站咨询
建站咨询 
 