如何终止MySQL连接

75

我正在使用MySQL构建一个网站。我使用的是TOAD for MySQL,但突然间无法连接到数据库,因为出现了如下错误:

"Too many connections"

在TOAD for MySQL中,有没有一种方法可以查看现有的连接并将它们关闭或简单地关闭所有连接?


2
如果你的连接不足,那么很可能是因为你的网站出现了问题,比如没有正确关闭你的连接。 - jishi
7个回答

110

不,MySQL没有内置的命令可以用来实现这个功能。但有一些工具和脚本支持此操作,您可以手动杀死一些连接或重启服务器(但这会更慢)。

使用SHOW PROCESSLIST查看所有连接,并KILL想要终止的进程ID。

您可以编辑超时设置,让MySQL守护程序自己终止不活动的进程,或者增加连接数。您甚至可以限制每个用户名的连接数,以便如果该进程继续出现问题,则只受影响的进程是该进程本身,而不会锁定数据库中的其他客户端。

如果您无法再连接到服务器,您应该知道MySQL始终为具有SUPER特权的用户保留1个额外连接。除非您的进程出于某种原因正在使用该特权的用户名...

然后,在您重新访问数据库之后,您应该修复产生大量连接的进程(网站)。


1
请注意,每个用户名的限制是在5.0.3版本中引入的,因此如果您运行的是4.1或类似版本,那么就很遗憾了。 - jishi

58
mysql> SHOW PROCESSLIST;
+-----+------+-----------------+------+---------+------+-------+---------------+
| Id  | User | Host            | db   | Command | Time | State | Info      |
+-----+------+-----------------+------+---------+------+-------+----------------+
| 143 | root | localhost:61179 | cds  | Query   |    0 | init  | SHOW PROCESSLIST |
| 192 | root | localhost:53793 | cds  | Sleep   |    4 |       | NULL      |
+-----+------+-----------------+------+---------+------+-------+----------------+
2 rows in set (0.00 sec)

mysql> KILL 192;
Query OK, 0 rows affected (0.00 sec)

用户192:

mysql> SELECT * FROM exept;
+----+
| id |
+----+
|  1 |
+----+
1 row in set (0.00 sec)

mysql> SELECT * FROM exept;
ERROR 2013 (HY000): Lost connection to MySQL server during query

mysql> SELECT * FROM exept; ERROR 2006 (HY000): MySQL server has gone away No connection. Trying to reconnect... Connection id: 804 Current database: xxx - Tiina

31

虽然您不能使用单个命令杀死所有打开的连接,但如果手动处理过多,您可以创建一组查询来代替。

此示例将为some_user192.168.1.1my_db的所有连接创建一系列KILL <pid>;查询。

SELECT 
CONCAT('KILL ', id, ';') 
FROM INFORMATION_SCHEMA.PROCESSLIST 
WHERE `User` = 'some_user' 
AND `Host` = '192.168.1.1'
AND `db` = 'my_db';

1
作为输出得到 KILL <pid>,如何在同一位置执行它? - Prem
1
@Prem 根据您执行 SQL 查询的方式,Ctrl+C 然后 Ctrl+V 应该允许您复制查询的输出,并将其粘贴为新查询。您还可以巧妙地将查询的输出导入到另一个 MySQL 命令中,具体取决于您使用的 shell。 - Mark

14

我建议检查连接,以显示最大线程连接数。

show variables like "max_connections";

示例

+-----------------+-------+
| Variable_name   | Value |
+-----------------+-------+
| max_connections | 13  |
+-----------------+-------+
1 row in set

然后通过示例来增加它

set global max_connections = 500;

很酷,非常感谢。 - Ramin Farajpour Cami
编辑文件:/etc/mysql/mysql.conf.d/mysqld.cnf。Mysql安装默认值为151,最大值为100,000。请参阅:https://dev.mysql.com/doc/refman/5.7/en/server-system-variables.html#sysvar_max_connections。 - Tarik

9

在MySQL Workbench中:

左侧导航 > 管理 > 客户端连接

它提供了结束查询和连接的选项。

注意:这不是像OP所要求的TOAD,但像我一样使用MySQL Workbench的用户可能会来到这里


仅供参考:在Workbench 8.0中,管理选项卡位于左侧导航器中。打开该选项卡后,在管理标题下,客户端连接是一个选项。 - nocdib

5
如上所述,没有特殊的命令来完成此操作。但是,如果所有这些连接都处于非活动状态,则可以使用“flush tables;”来释放所有那些不活动的连接。

0
在所选的数据库上运行此命令:
SELECT GROUP_CONCAT('KILL ',id SEPARATOR '; ') AS kill_list
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE command='Sleep' AND DB IS NOT NULL;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接