MySQL - 杀死所有睡眠连接

Kev*_*ter 3 mysql database stored-procedures

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

Kev*_*ter 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;
Run Code Online (Sandbox Code Playgroud)

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

像这样使用它

call kill_all_sleep_connections()
Run Code Online (Sandbox Code Playgroud)

现在,数据库实例上的空闲连接数应该少于 10 个。设置WHILE< 10服务可能会非常快地创建连接,因此请根据需要增加/减少。


您可以查看所有连接

  • SHOW PROCESSLIST;或者SELECT * FROM information_schema.PROCESSLIST;

id您可以通过引用这些结果中的来终止单个连接KILL

  • KILL 4212;

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