mysql command为sleep时项目可以连接_Mysql中Sleep进程连接数过多问题解决

b3d2243a03fe35e61ca35187e1f48f70.png

连接数查看

进入MySQL命令行,输入“show processlist;”命令后,Command列出现一大堆Sleep睡眠状态的连接进程。如下图:

041480f4dd0ef1d47a12a24517a0d62e.png

mysql连接进程Sleep睡眠状态过多将影响MySQL系统资源,主要是CPU、内存。超过配置的最大连接数,新的客户端连接将无法连接,mysql将无法提供服务,Web系统无法访问、崩塌。

造成连接数过多原因

1)、常见是程序中没有关闭DB连接,客户端在退出前没有调用mysql_close()函数。这是写程序的疏忽。

2)、DB查询复杂,优化不够,造成查询耗时长。

3)、使用过多持久连接。不适合高并发场景系统中。

解决方法

批量删除 sleep 进程状态的连接数。

1)、一种直接在MySQL命令控制台操作:

mysql> show processlist;

mysql> SELECT concat(‘KILL ‘,id,‘;‘) FROM information_schema.processlist WHERE user=‘user1‘;

mysql> select concat(‘KILL ‘,id,‘;‘) from information_schema.processlist where user=‘user1‘ into outfile ‘/tmp/a.txt‘;

mysql> source /tmp/a.txt;

其中上面user1用户是“show processlist;” 命令下,User列对应最多的Sleep进程连接状态的用户。

注:如上面导出为指定文件路径报“ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement”错误。

5415e980a5a305622b84bd9766c95183.png

是由于MySQL在文件的导入、导出有个默认的文件路径。通过“show variables like ‘%secure%‘;”命令查看默认导入、导出文件路径。

4f57f0778adcc8b745d7feae0e264986.png

从上面可看出默认路径为“/var/lib/mysql-files/”;所以改下导出文件路径:

3407afd75f775b79f5dc18e12b40f682.png

然后在执行“source /var/lib/mysql-files/a.txt;”命令,接下来是出现一堆“Query OK, 0 rows affected (0.00 sec)”,执行成功。

2)、另一种是写Shell脚步方法,配合设置cron定时任务

#!/bin/sh

while :

do

sleep_num=`mysqladmin processlist -u user -ppassword -h 10.10.10.100 | grep -ie sleep |wc -l`

date=`date +%Y%m%d[%H:%M:%S]`

echo $sleep_num

if [ "$sleep_num" -gt 100 ];then

for i in `mysqladmin processlist -u user -ppassword -h 10.10.10.100 | grep -ie sleep | awk ‘{print $2}‘`

do

mysqladmin -u user -ppassword -h 10.10.10.100 kill $i

done

echo "sleep is too many more than 100, killed it " >> /tmp/sleep.log

echo "$date : $sleep_num" >> /tmp/sleep.log

fi

sleep 1

done

接下来设置个cron定时任务,设置多长时间跑一次。

修改配置

上面方法比较繁琐,写脚本、配置定时任务,而且这种以暴制暴方法可能会导致数据奔溃,不可取。更好的方法应该是让MySQL自己决定这些Sleep睡眠状态连接的命运,实施会更简单,有效。

MySQL配置项中有一项 wait_timeout 配置项,表示Sleep睡眠状态连接数超时时长。超过设置的时长,MySQL自动终止连接。

输入“show global variables like ‘%timeout%‘;” 命令查看:

f20770ce2b088e63cef48baa73c8ca8f.png

当前关于睡眠状态连接数超时时长,默认超时时长 wait_timeout 为28800秒,还有一个相关的 interactive_timeout 配置。

wait_timeout 与 interactive_timeout 区别在于 wait_timeout 是MySQL服务器关闭非交互连接之前等待的秒数, interactive_timeout 是MySQL服务器关闭交互式连接前等待的秒数。

什么是交互连接,什么是非交互连接?

通过MySQL客户端连接DB的就是交互式的会话连接,通过JDBC程序连接DB的就是非交互式的会话连接。

接下来修改 wait_timeout、interactive_timeout 全局变量。要配合这两块一起修改才有效。设置DB连接超时时长为3600秒,如下:

set global wait_timeout=3600;

set global interactive_timeout=3600;

Mysql中Sleep进程连接数过多问题解决

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
MySQL连接数过多的情况有多种可能性。常见的情况包括没有正确关闭连接,导致连接数不断增加,当连接数达到最大限制,会出现"Too many connections"错误。另外,在某些情况下,MySQL的默认最大连接数可能会被占用,导致无法通过登录MySQL来调整参数来处理这个错误。 要解决问题,可以采取以下方法: 1. 检查代码mysql_connect和mysql_close函数是否正确使用。确保在每次使用完数据库连接后都调用了mysql_close来关闭连接,释放资源。 2. 使用命令行工具或者通过查询系统变量的方式,确认当前MySQL的最大连接数设置。可以通过以下命令登录MySQL并查询最大连接数: ``` sudo mysql -uroot -p ``` 然后输入密码,如果出现"ERROR 1040 (00000): Too many connections"错误,说明当前连接数已经达到了最大限制。 3. 查看当前MySQL连接情况。可以通过以下方式查看当前连接数和已经建立的连接数: ``` SHOW STATUS LIKE 'Threads_connected'; ``` 这将显示当前连接数。如果连接数过多,可以通过以下命令查看当前所有的连接: ``` SHOW PROCESSLIST; ``` 这将显示当前所有的连接和相关信息,包括连接的状态、用户和主机等。 4. 根据现有的连接数情况,评估是否需要增加最大连接数限制。如果连接数经常达到最大限制,可以考虑增加最大连接数。可以通过修改MySQL的配置文件my.cnf来设置最大连接数参数max_connections。找到该配置文件并添加或修改以下行: ``` max_connections = 200 ``` 然后重新启动MySQL服务。 需要注意的是,增加最大连接数可能会对服务器资源造成负担,因此在增加前需要评估服务器的性能和资源使用情况。 综上所述,解决MySQL连接数过多问题,一方面需要检查代码是否正确关闭连接,另一方面可以通过查询当前连接状态和最大连接数设置来评估并调整最大连接数限制。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值