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

ast*_*asr 9 mysql query-timeout connectivity

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

问题

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

Rol*_*DBA 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)
Run Code Online (Sandbox Code Playgroud)

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

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

  • wait_timeout(默认 28800 [8 小时]):服务器在关闭非交互式连接之前等待活动的秒数。此超时仅适用于 TCP/IP 和 Unix 套接字文件连接,不适用于使用命名管道或共享内存建立的连接。在线程启动时,会话wait_timeout 值从全局wait_timeout 值或全局interactive_timeout 值初始化,这取决于客户端的类型(由mysql_real_connect() 的CLIENT_INTERACTIVE 连接选项定义)。另见interactive_timeout。
  • Interactive_timeout (Default 28800 [8 hours]) :服务器在关闭交互式连接之前等待它的活动的秒数。交互式客户端被定义为使用 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 命令,您也必须等待任何处于磁盘密集型步骤中间或正在进行内部互斥锁的查询。