客户端超时,而MySQL查询仍在运行?


9

我们遇到了一个问题,其中一个只读查询通过MySQL工作台运行,从用户的UI角度来看已超时,并一直在服务器上运行(并且显然消耗了越来越多的资源),直到出现中断为止。

问题

  • 有没有一种标准的方法来处理MySQL中的此类问题?
  • 是否有我们需要避免的根本原因?

Answers:


11

您需要查看超时的默认值:

mysql> show variables like '%timeout';
+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| connect_timeout            | 10    |
| delayed_insert_timeout     | 300   |
| innodb_lock_wait_timeout   | 50    |
| innodb_rollback_on_timeout | OFF   |
| interactive_timeout        | 60    |
| net_read_timeout           | 30    |
| net_write_timeout          | 60    |
| slave_net_timeout          | 3600  |
| table_lock_wait_timeout    | 50    |
| wait_timeout               | 60    |
+----------------------------+-------+
10 rows in set (0.00 sec)

通常,我会监视几个超时变量。如果从与数据库服务器上的MySQL联系的应用服务器上的MySQL Workbench,mysql客户端或PHP应用程序远程使用MySQL,这是非常必要的。

这是MySQL文档所说的以下设置之一:

  • wait_timeout(默认值为28800 [8小时]):服务器在关闭非交互式连接之前等待活动的秒数。此超时仅适用于TCP / IP和Unix套接字文件连接,不适用于使用命名管道或共享内存进行的连接。在线程启动时,根据客户端的类型(由mysql_real_connect()的CLIENT_INTERACTIVE connect选项定义),从全局wait_timeout值或全局global_timeout值初始化会话wait_timeout值。另请参见Interactive_timeout。
  • Interactive_timeout(默认值为28800 [8小时]):服务器在关闭交互式连接之前等待活动的秒数。交互式客户端定义为使用mysql_real_connect()的CLIENT_INTERACTIVE选项的客户端。另请参见wait_timeout。
  • net_read_timeout(默认值为 30):在中止读取之前等待连接中的更多数据的秒数。当服务器从客户端读取时,net_read_timeout是控制何时中止的超时值。当服务器正在写入客户端时,net_write_timeout是控制何时中止的超时值。另请参见slave_net_timeout。
  • net_write_timeout(默认值为 60):中止写入之前,等待块写入连接的秒数。另请参见net_read_timeout。

请确保将这些超时设置为足够高,以容纳可能会运行很长时间的查询,其中可能包括:

  • 弥撒 UPDATEs
  • 弥撒 DELETEs
  • ENABLE KEYS 在大型MyISAM上

要处理失去联系后仍在运行的查询,必须对长时间运行的查询的进程ID 运行KILL。即使使用KILL命令,也将必须等待磁盘密集型步骤中间的任何查询或正在进行内部互斥的查询。


是否有一种标准的,健壮的方法可以对已经运行很长时间的进程运行KILL,还是通常通过bash脚本/ cron作业来完成?
asthasr 2012年

我实际上在2011年5月写了一篇帖子,内容涉及如何使用information_schema启动脚本以杀死大量数据库连接:dba.stackexchange.com/a/2637/877
RolandoMySQLDBA 2012年

“请确保将这些超时设置得足够高,以容纳可能会运行很长时间的查询,其中可能包括:Mass UPDATEs ...”示例:php + mysql我必须从表列中选择每条记录,因此请提取行,然后执行某些操作...然后使用新值更新另一条记录。假设此脚本需要大约5分钟以上的时间。在开始处执行一个SELECT,在结束处执行一个UPDATE,在中间获取行并执行...。您能解释这种情况下的wait_timeout吗?真的对我来说还不清楚... wait_timeout释放资源的安全值是什么
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.