如何在不访问命令行的情况下删除 MySQL 中的所有空闲连接?我需要一个临时解决方案,因为我们的一项服务没有正确关闭其连接,并且数据库中充满了空闲连接。
您可以使用存储过程来终止多个连接,例如
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;
正确的解决方案是在完成数据库查询后关闭每个服务中的每个连接。
或者运行这样的命令:
SELECT GROUP_CONCAT(CONCAT("KILL ", id) SEPARATOR '; ') 来自 information_schema.PROCESSLIST 哪里
user
=“infoflot_cms_micro”
AND command
=“睡觉”
并且 time
> 6000;
将其输出复制粘贴到 SQL shell 编辑器中并运行它。