在开发过程中,遇到的MySQL连接数过多的问题

MySQL连接数默认是151,在开发过程中出现过多的连接处于sleep状态未被释放,超过了默认的最大连接数,然后报错连接数过多。如果完全连不上,那就停掉占用连接的应用,停了还是连不上就重启MySQL。如果连的上那就可以使用下面的SQL来操作。下面这些手段都是在数据库本身做限制,真正要解决这个问题还是要排查出产生这么多sleep连接的原因,可能是数据库连接池参数设置的不合理、跑的应用程序过多负载太大等等原因。

杀死sleep中的连接

查看连接数

show status like '%thread%'

其中Threads_connected就是现在存活的连接数

查看所有连接

show full processlist

ID字段就是连接数的线程ID,可以通过执行SQLkill ID;来杀死线程

批量生成结束进程SQL

一个一个去点然后复制ID太麻烦,可以通过查询来生成

select concat("kill ", ID, ";") as command
from information_schema.PROCESSLIST

可以写where条件来过滤需要杀死的线程,然后直接复制查询结果的命令执行即可

设置wait_timeout和interactive_timeout

wait_timeout

参数含义:服务器关闭非交互连接之前等待活动的秒数。
在线程启动时,根据全局wait_timeout值或全局interactive_timeout值初始化会话wait_timeout值,取决于客户端类型(由mysql_real_connect()的连接选项CLIENT_INTERACTIVE定义)。
参数默认值:28800秒(8小时)

interactive_timeout

参数含义:服务器关闭交互式连接前等待活动的秒数。交互式客户端定义为在mysql_real_connect()中使用CLIENT_INTERACTIVE选项的客户端。
参数默认值:28800秒(8小时)

查看wait_timeout和interactive_timeout

show variables like '%timeout%';

设置wait_timeout和interactive_timeout

如果在生产环境数据库无法重启可以暂时使用root账户来设置这两个参数,但是数据库重启就会恢复默认值,要永久生效还是要在MySQL的配置文件中修改

#不重启修改wait_timeout和interactive_timeout,时间单位是秒,设置多少时间可以根据自己的需求来
set global wait_timeout=100;
set global interactive_timeout=100;