asthasr Asked: 2012-01-13 06:12:12 +0800 CST2012-01-13 06:12:12 +0800 CST 2012-01-13 06:12:12 +0800 CST 客户端超时,而 MySQL 查询仍在运行? 772 我们遇到了一个问题,其中一个只读查询通过 MySQL 工作台运行,从用户的 UI 角度来看超时,并在服务器上继续运行(并且显然消耗越来越多的资源),直到我们发生中断。 问题 在 MySQL 中是否有处理此类问题的标准方法? 是否有我们需要避免的根本原因? mysql query-timeout 2 个回答 Voted Best Answer RolandoMySQLDBA 2012-01-13T09:27:25+08:002012-01-13T09:27:25+08:00 您需要查看超时的默认值: 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 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(默认 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 命令,您也必须等待任何处于磁盘密集型步骤中间或正在进行内部互斥锁的查询。 MANIKANTA 2021-02-12T00:02:57+08:002021-02-12T00:02:57+08:00 当 UI 中发生超时时,查询可能仍在数据库中运行并消耗资源。处理这个问题的一般方法是从进程列表中找到超时 UI 查询的 mysql 连接 ID 并终止查询/连接。假设如果我们使用“xx_ui_user”来运行查询,然后找到时间>“应用程序超时时间”的连接 ID 列表并杀死它们。 select concat("kill ",id,";") from information_schema.processlist where user = "xx_ui_user" and time > "app time out time in seconds"; 上述语句将生成所需的 kill 命令。 如果 UI 超时时应用程序中有选项,则使用找到当前的 connection_idSELECT CONNECTION_ID();并向带有 connection_id 的数据库发送 kill 命令将自动解决该问题。 不确定这是否可以从应用程序中实现。
您需要查看超时的默认值:
通常,我会注意几个超时变量。如果您从 MySQL Workbench、mysql 客户端或应用程序服务器上的 PHP 应用程序远程使用 MySQL,并联系数据库服务器上的 MySQL,则这是非常必要的。
这是 MySQL 文档中所说的这些设置之一:
请确保将这些超时设置得足够高,以适应可能运行很长时间的查询,其中可能包括:
UPDATEs
DELETEs
ENABLE KEYS
在大型 MyISAM 上要处理在您失去联系后继续运行的查询,您必须针对长时间运行的查询的进程 ID运行KILL 。即使使用 KILL 命令,您也必须等待任何处于磁盘密集型步骤中间或正在进行内部互斥锁的查询。
当 UI 中发生超时时,查询可能仍在数据库中运行并消耗资源。处理这个问题的一般方法是从进程列表中找到超时 UI 查询的 mysql 连接 ID 并终止查询/连接。假设如果我们使用“xx_ui_user”来运行查询,然后找到时间>“应用程序超时时间”的连接 ID 列表并杀死它们。
上述语句将生成所需的 kill 命令。
如果 UI 超时时应用程序中有选项,则使用找到当前的 connection_id
SELECT CONNECTION_ID();
并向带有 connection_id 的数据库发送 kill 命令将自动解决该问题。不确定这是否可以从应用程序中实现。