我正在使用 MySQL 构建一个网站。我正在使用 TOAD for MySQL,突然无法连接到数据库,因为出现错误:
“连接太多”
Toad for MySQL 是否有任何方法可以查看现有连接以便能够终止它们或简单地关闭所有连接?
不,没有内置的 MySQL 命令。有各种工具和脚本支持它,您可以手动终止一些连接或重新启动服务器(但这会更慢)。
使用
SHOW PROCESSLIST
查看所有连接,然后使用 KILL
要杀死的进程 ID。
您可以编辑超时设置,让 MySQL 守护进程自行终止不活动的进程,或增加连接计数。您甚至可以限制每个用户名的连接量,这样,如果进程持续出现错误,唯一受影响的进程就是进程本身,并且数据库上的其他客户端不会被锁定。
如果您无法再连接到服务器,您应该知道 MySQL 始终为具有
SUPER
权限的用户保留 1 个额外连接。除非您的违规进程出于某种原因使用具有该权限的用户名......
然后,在您可以再次访问数据库之后,您应该修复产生大量连接的进程(网站)。
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
虽然您无法使用单个命令终止所有打开的连接,但如果需要手动执行的操作太多,您可以创建一组查询来为您执行此操作。
此示例将为从
KILL <pid>;
到 some_user
的所有 192.168.1.1
连接创建一系列 my_db
查询。
SELECT
CONCAT('KILL ', id, ';')
FROM INFORMATION_SCHEMA.PROCESSLIST
WHERE `User` = 'some_user'
AND `Host` = '192.168.1.1'
AND `db` = 'my_db';
我建议检查连接以显示最大线程连接是
show variables like "max_connections";
样品
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 13 |
+-----------------+-------+
1 row in set
然后通过例子来增加
set global max_connections = 500;
在 MySQL 工作台中:
左侧导航器 > 管理 > 客户端连接
它为您提供了终止查询和连接的选项。
注意:这不是像OP所要求的那样的TOAD,但像我这样的MySQL Workbench用户可能会在这里结束
如上所述,没有特殊的命令可以做到这一点。但是,如果所有这些连接均处于非活动状态,请使用“刷新表;”能够释放所有不活动的连接。
在选定的数据库上运行此命令
SELECT GROUP_CONCAT('KILL',id SEPARATOR ';') AS Kill_list
来自 INFORMATION_SCHEMA.PROCESSLIST
WHERE 命令='睡眠'并且数据库不为空;