MySQL - 杀死所有睡眠连接

问题描述 投票:0回答:2

如何在不访问命令行的情况下删除 MySQL 中的所有空闲连接?我需要一个临时解决方案,因为我们的一项服务没有正确关闭其连接,并且数据库中充满了空闲连接。

mysql database stored-procedures
2个回答
5
投票

您可以使用存储过程来终止多个连接,例如

CREATE PROCEDURE kill_all_sleep_connections()
BEGIN
  WHILE (SELECT count(*) as _count from information_schema.processlist where Command = 'Sleep') > 10 DO
    set @c := (SELECT concat('KILL ', id, ';') as c from information_schema.processlist where Command = 'Sleep' limit 1);
    prepare stmt from @c;
    execute stmt;
  END WHILE;
END;

这将为匹配

KILL 4312;
条件的每一行创建一个类似
WHERE Command = 'Sleep'
的字符串,并引用
id
。然后它
EXECUTE
就是作为查询的字符串,结束连接。

像这样使用它

call kill_all_sleep_connections()

数据库实例上的空闲连接现在应该少于 10 个。

WHILE
设置为
< 10
,因为服务可能会非常快地创建连接,因此请根据需要增加/减少。


您可以查看所有

的联系
  • SHOW PROCESSLIST;
    SELECT * FROM information_schema.PROCESSLIST;

您可以通过使用

id
 引用这些结果中的 
KILL

来终止单个连接
  • KILL 4212;

正确的解决方案是在完成数据库查询后关闭每个服务中的每个连接。


0
投票

或者运行这样的命令:

SELECT GROUP_CONCAT(CONCAT("KILL ", id) SEPARATOR '; ') 来自 information_schema.PROCESSLIST 哪里

user
=“infoflot_cms_micro” AND
command
=“睡觉” 并且
time
> 6000;

将其输出复制粘贴到 SQL shell 编辑器中并运行它。

© www.soinside.com 2019 - 2024. All rights reserved.