解决MySQL休眠sleep进程过多的问题

现象: 会报错过多连接,超过默认最大值(151)

原因:

1.使用了太多持久连接(个人觉得,在高并发系统中,不适合使用持久连接)

2.程序中,没有及时关闭mysql连接

3.数据库查询不够优化,过度耗时。

STP1. 在workbench或者msql命令行工具 输入show full processlist,可以发现很多Sleep的线程ID

STEP2: 输出需要kill的任务

SELECT GROUP_CONCAT(CONCAT('kill ',id) SEPARATOR '; ') AS cmd FROM information_schema.processlist 
WHERE USER='root' 
AND command='Sleep'
AND db='YourDBName'

STEP3: 执行STEP2生成的内容,即执行kill

kill 5040; kill 5128; kill 5136; kill 5056; kill 5184; kill 5088; kill 5144; kill 5152; kill 5160; kill 5096; kill 5256; kill 5041; kill 5129; kill 5137; kill 5057; kill 5025; kill 5089; kill 5153; kill 5161; kill 5145; kill 5185; kill 5105; kill 5257; kill 5249; kill 5034; kill 5122; kill 5058; kill 5090; kill 4778; kill 5154; kill 5162; kill 5170; kill 5186; kill 5098; kill 5106; kill 5250; kill 5258; kill 5035; kill 2059; kill 5091; kill 5123; kill 5131; kill 5139; kill 5059; kill 5155; kill 5163; kill 5171; kill 5099; kill 5203; kill 5259; kill 5036; kill 2060; kill 5132; kill 5140; kill 5092; kill 5156; kill 5164; kill 5172; kill 5188; kill 5100; kill 5108; kill 5204; kill 5037; kill 5181; kill 5125; kill 5133; kill 5141; kill 5069; kill 5149; kill 5157; kill 4989; kill 5189; kill 5093; kill 5101; kill 5173; kill 5253; kill 5126; kill 5054; kill 5158; kill 5190; kill 5094; kill 5102; kill 5254; kill 5047; kill 5183; kill 5127; kill 5135; kill 4903; kill 5055; kill 5143; kill 5159; kill 5095; kill 5103; 

从长远看,

1.查看代码是否每一次都有conn.close(),尤其是有一些代码出了异常后没有进行close

2.需要优化长连接时间:

SET GLOBAL interactive_timeout=120;
SET GLOBAL mysqlx_interactive_timeout=120;

SET GLOBAL wait_timeout=120;
SET GLOBAL mysqlx_wait_timeout=120;


SHOW variables like '%timeout';

wait_timeout — 指的是mysql在关闭一个非交互的连接之前所要等待的秒数,其取值范围为1-2147483(Windows),1-31536000(linux),默认值28800。
interactive_timeout — 指的是mysql在关闭一个交互的连接之前所要等待的秒数(交互连接如mysql gui tool中的连接),其取值范围随wait_timeout变动,默认值28800。

3.查看并设置最大连接数

SHOW variables like '%max_connections%';



SET GLOBAL max_connections = 15000;
SET GLOBAL mysqlx_max_connections = 15000;

  • 7
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
MySQLsleep线程过多时,可能会出现以下几种情况和解决方法: 1. 过多sleep线程可能会导致数据库的性能下降。因为每个sleep线程都占用一定的系统资源,当这些线程的数量过多时,会导致系统资源的消耗增加,从而影响数据库的性能。解决方法是通过增加max_connections或者调整wait_timeout参数来限制sleep线程的数量。 2. 过多sleep线程可能是由于连接池没有正确关闭连接导致的。连接池负责管理数据库连接的分配和回收,在请求处理完毕后应该将连接释放回连接池,但如果没有正确关闭连接,则会导致sleep线程的增多。解决方法是确保在请求处理完毕后正确关闭连接,并且及时释放连接资源。 3. 过多sleep线程可能是由于长时间的事务或者锁定操作导致的。在MySQL中,事务或者锁定操作会导致连接处于waiting状态,从而导致sleep线程增多。解决方法是尽量缩短事务的执行时间,避免长时间的事务操作,并且合理使用锁定机制,避免不必要的锁定操作。 4. 过多sleep线程也可能是由于代码中的延迟操作导致的。如果应用程序中存在大量的延迟操作,比如sleep函数,可能会导致数据库中的sleep线程增多。解决方法是优化应用程序的代码,避免不必要的延迟操作,以减少数据库中sleep线程的数量。 综上所述,当MySQLsleep线程过多时,我们可以通过增加max_connections、调整wait_timeout参数、正确关闭连接、缩短事务执行时间、合理使用锁定机制、优化应用程序代码等方法来解决问题,并提高数据库的性能。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值