MySQL - 终止所有睡眠连接

MySQL - Kill all sleeping connections

如何在不访问命令行的情况下删除 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;

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

这样使用

call kill_all_sleep_connections()

数据库实例上的空闲连接现在应该少于 10 个。 WHILE 设置为 < 10,因为服务可能会非常快速地创建连接,因此 increase/decrease 如您所愿。


您可以查看所有

的连接
  • SHOW PROCESSLIST;SELECT * FROM information_schema.PROCESSLIST;

您可以使用 KILL

在这些结果中引用 id 来终止单个连接
  • KILL 4212;

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