Mysql too many connection 错误处理
感觉是有一些客户端没有正确调用 mysql_close 来退出,导致 too many connection 的问题。我想用命令行登进去都不行
$ mysql -u root -p
Enter password:
ERROR 1040 (HY000): Too many connections
后来我直接先关掉几个 mysql 客户端,然后再连进去就可以了。
连进去后首先先执行:
SHOW VARIABLES LIKE "max_connections";
这个显示的是最大连接数,默认是 151。
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| max_connections | 151 |
+-----------------+-------+
接着确认一下当前 process 的数量:
show processlist;
process 如下,总数也是 151,所以已经无法再连入新客户端了。
+-------+------+--------------+-----------+---------+------+----------+------------------+
| Id | User | Host | db | Command | Time | State | Info |
+-------+------+--------------+-----------+---------+------+----------+------------------+
| 50540 | root | host:35772 | db_a | Sleep | 28 | | NULL |
| 50617 | root | host:52416 | db_b | Sleep | 0 | | NULL |
| 50618 | root | host:52418 | db_a | Sleep | 11 | | NULL |
| 50619 | root | host:52420 | db_b | Sleep | 0 | | NULL |
| 50620 | root | host:52422 | db_a | Sleep | 5 | | NULL |
| 50621 | root | host:52424 | NULL | Sleep | 262 | | NULL |
| 50622 | root | host:52426 | NULL | Sleep | 262 | | NULL |
我们现在希望找出那些没用的数据库连接,然后删除掉。其中 host 和 db_a, db_b 被我打码,可略过。而有的 db 为 NULL 表示那个连接是没有使用任何数据库的,所以可以安全删掉,停止对应进程的命令是 kill id。
processlist 实际上是存放在 information_schema 表中,所以可以用 sql 语句获取所有 db 为 NULL 的连接,并用 kill 语句结束进程:
select concat('kill ', ID, ';')select * from PROCESSLIST from PROCESSLIST where DB is null;
接着把输出的内容再粘贴回去运行即可。
还有一个步骤,就是把 process 上限提高:
set global max_connections = XXXX;