ITPub博客

首页 > 数据库 > MySQL > kill flush tables的思考

kill flush tables的思考

原创 MySQL 作者:psufnxk2000 时间:2015-09-08 15:48:31 0 删除 编辑
数据库发生一个现象:
在mysqldump备份的时候,会执行flush tables语句,再连接上的dml语句就会等待Waiting for table flush。是因为一个长时间运行的select导致flush tables语句的等待。这时把 flush tables语句kill 掉, dml语句依然还在。并且还是等待相同的事件。 把长时间运行的select kill之后,回到正常状态。


重现:


session  1 :  ---这个需要3分钟+运行完
select url,count(*) from t_test a, t1 b where a.help_category_id = b.id  group by url;


session 2 :
 flush tables   ;
 
view session:     --通过这个session查看进程


mysql> show full processlist;
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
| Id | User            | Host      | db   | Command | Time    | State                   | Info                                                                                  |
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
|  1 | event_scheduler | localhost | NULL | Daemon  | 1024079 | Waiting on empty queue  | NULL                                                                                  |
| 14 | root            | localhost | test | Query   |      18 | Sending data            | select url,count(*) from t_test a, t1 b where a.help_category_id = b.id  group by url |
| 16 | root            | localhost | test | Query   |       0 | init                    | show full processlist                                                                 |
| 18 | root            | localhost | test | Sleep   |      59 |                         | NULL                                                                                  |
| 20 | root            | localhost | NULL | Query   |      11 | Waiting for table flush | flush tables                                                                          |
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+


session 3 :
mysql> insert into t1 values (20000);




view session:


mysql> show full processlist;
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
| Id | User            | Host      | db   | Command | Time    | State                   | Info                                                                                  |
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
|  1 | event_scheduler | localhost | NULL | Daemon  | 1024100 | Waiting on empty queue  | NULL                                                                                  |
| 14 | root            | localhost | test | Query   |      39 | Sending data            | select url,count(*) from t_test a, t1 b where a.help_category_id = b.id  group by url |
| 16 | root            | localhost | test | Query   |       0 | init                    | show full processlist                                                                 |
| 18 | root            | localhost | test | Query   |      16 | Waiting for table flush | insert into t1 values (20000)                                                         |
| 20 | root            | localhost | NULL | Query   |      32 | Waiting for table flush | flush tables                                                                          |
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
5 rows in set (0.00 sec)




mysql> kill 20;
Query OK, 0 rows affected (0.00 sec)


mysql> show full processlist;
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
| Id | User            | Host      | db   | Command | Time    | State                   | Info                                                                                  |
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
|  1 | event_scheduler | localhost | NULL | Daemon  | 1024113 | Waiting on empty queue  | NULL                                                                                  |
| 14 | root            | localhost | test | Query   |      52 | Sending data            | select url,count(*) from t_test a, t1 b where a.help_category_id = b.id  group by url |
| 16 | root            | localhost | test | Query   |       0 | init                    | show full processlist                                                                 |
| 18 | root            | localhost | test | Query   |      29 | Waiting for table flush | insert into t1 values (20000)                                                         |
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)


mysql> show full processlist;
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
| Id | User            | Host      | db   | Command | Time    | State                   | Info                                                                                  |
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
|  1 | event_scheduler | localhost | NULL | Daemon  | 1024208 | Waiting on empty queue  | NULL                                                                                  |
| 14 | root            | localhost | test | Query   |     147 | Sending data            | select url,count(*) from t_test a, t1 b where a.help_category_id = b.id  group by url |
| 16 | root            | localhost | test | Query   |       0 | init                    | show full processlist                                                                 |
| 18 | root            | localhost | test | Query   |     124 | Waiting for table flush | insert into t1 values (20000)                                                         |
+----+-----------------+-----------+------+---------+---------+-------------------------+---------------------------------------------------------------------------------------+
4 rows in set (0.00 sec)


mysql> \s
--------------
mysql  Ver 14.14 Distrib 5.6.20


这时在别的session中操作别的表是没有问题的,但是和长时间运行的select相关的表都是有问题的。


照我的理解:
dml在等待table flush, 那么我把flush 语句kill了, dml语句应该可以正常运行才对。
查看文档:
FLUSH TABLES
Closes all open tables, forces all tables in use to be closed, and flushes the query cache. FLUSH
TABLES also removes all query results from the query cache, like the RESET QUERY CACHE statement.


在网上搜索:
https://bugs.mysql.com/bug.php?id=44884  Bug #44884 KILL of FLUSH TABLES does not remove TDC version lock on tables in use


但对于为什么出现这种情况 ,还不是太理解。
why????




转载请注明源出处
QQ 273002188  欢迎一起学习
QQ 群 236941212

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/25099483/viewspace-1794426/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2011-05-31

  • 博文量
    215
  • 访问量
    618398