首页 > 数据库 >MySQL sleep 线程过多怎么解决

MySQL sleep 线程过多怎么解决

时间:2025-01-12 09:49:13浏览次数:1  
标签:MySQL sleep timeout mysql 线程 interactive wait

1 知道 sleep 线程过多原因

首先要知道到底是什么原因导致的 sleep 线程过多的:

  1. 程序逻辑问题,导致连接一直不释放;

  2. mysql 参数的问题,是不是参数配置的不合理,一直不释放连接;

  3. mysql 语句的问题,数据库查询不够优化,过度耗时。

  4. 大并发情况问题,导致 sleep 情况过多;

2 临时解决 sleep 线程

很多人都是重启大法,重启大法确实好, 能够释放,生产重启对业务有影响的,不能随便重启的

shell脚本+cron计划任务,来kill sleep 线程,这个不靠谱啊, 你不知道 sleep 线程,里面是不是还有事务还在执行没有提交,也是sleep 状态,这个kill 操作有点莽夫,对生产数据数据库还是要理智啊。

我临时解决的办法:

  1. 对用户资源做限制,看看那个用户连接的sleep线程比较多,对这个用户连接多的做一些限制,比如一个小时可以连接多少次啊等等

  2. 修改 mysql 参数问题 ,修改wait_timeout 和interactive_timeout默认都是28800秒有,也就是8个小时以后才释放空链接。

例子:

 

 

不同用户登录到数据库,wait_timeout和interactive_timeout都是28800秒

修改参数,我生产环境设置的是半个小时,也就是1800秒

1 2 3 4 5 6 7 mysql> set global wait_timeout=1800; mysql> set global interactive_timeout=1800;   shell> vim my.cnf [mysqld] wait_timeout=1800 interactive_timeout=1800

  

这样修改完,由于已近保持的会话连接需要等到8个小时才会释放, 所以修改了wait_timeout和interactive_timeout不会立即生效的原因,这时候就要修改连接过多的用户资源了来释放sleep线程了

如下:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #开启两个会话窗口 mysql> # 重新登录了会话,wait_timeout和interactive会生效 mysql> show variables like 'wait_timeout'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wait_timeout  | 1800  | +---------------+-------+ 1 row in set (0.00 sec)   mysql> show variables like 'interactive_timeout'; +---------------------+-------+ | Variable_name       | Value | +---------------------+-------+ | interactive_timeout | 1800  | +---------------------+-------+ 1 row in set (0.00 sec)   #session2 mysql> #这个是其他用户连接的mysql,这个会话一直没有断开,参数还是28800 mysql> show variables like 'wait_timeout'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | wait_timeout  | 28800 | +---------------+-------+ 1 row in set (0.01 sec)   mysql> show variables like 'interactive_timeout'; +---------------------+-------+ | Variable_name       | Value | +---------------------+-------+ | interactive_timeout | 28800 | +---------------------+-------+ 1 row in set (0.00 sec)

 

 

3 怎么根本解决

这时候就要知道 造成 sleep 线程过多的原因来解决:

  1. 程序执行完毕,应该显式调用mysql_close

  2. 程序中根据业务访问情况,选择长连接还是短连接

  3. 能逐步分析系统的SQL查询,找到查询过慢的SQL优化

  4. 合理设置mysql参数值

标签:MySQL,sleep,timeout,mysql,线程,interactive,wait
From: https://www.cnblogs.com/shujuyr/p/18666622

相关文章

  • MySQL主从同步不一致解决办法
    一般主从同步错误首先要考虑是不是在从库中误操作导致的。结果发现,有人在从库中进行了一条针对有主键表的sql语句的插入,导致主库再插入相同sql的时候,主从状态出现异常。发生主键冲突的报错。解决方法:在确保主从数据一致性的前提下,可以在从库进行错误跳过。像从库如果不提供......
  • MySQL数据库出现乱码怎么解决
    为什么我的数据库总会出现中文乱码的情况。一堆中文乱码不知道怎么回事?当向数据库中写入创建表,并插入中文时,会出现这种问题。此报错会涉及数据库字符集的问题。.1解决乱码的几个方面对于中文乱码的情况,从三个方面数据终端:就是我们连接数据库的工具设置为utf8操作系统层面:l......
  • MySQL can't opet file(errno:24)
    有的时候,数据库跑得好好的,突然报不能打开数据库文件的错误了。解决思路:首先我们要先查看数据库的errorlog。然后判断是表损坏,还是权限问题。还有可能磁盘空间不足导致的不能正常访问表,操作系统的限制也要关注下,相关应用限制也要关注下;123#ulimit-n查看系统的......
  • MySQL 中删除重复数据 SQL 写法
    要在MySQL中删除重复的数据并只保留一条,可以使用下面的方法(要用的时候直接复制小改下条件和表名称即即可)方法一:使用leftjoin+子查询删除重复数据(推荐)温馨提示:本人在500w数据下执行此SQL耗费15s-30s左右使用leftjoin(推荐方法删除重复数据,添加唯一组......
  • MySQL练习2
    1.单表查询(1)素材表名:worker--表中字段均为中文,比如“部门号,工资,职工号,参加工作”等(2)创建worker表CREATETABLEworker (部门号 int(11) NOT NULL, 职工号 int(11) NOT NULL, 工作时间 date NOT NULL, 工资 float(8,2) NOT NULL, 政......
  • Mysql--重点篇--索引(索引分类,Hash和B-tree索引,聚簇和非聚簇索引,回表查询,覆盖索引,索引
    索引是数据库中用于加速查询操作的重要机制。通过索引,MySQL可以快速定位到满足查询条件的数据行,而不需要扫描整个表。合理的索引设计可以显著提高查询性能,但不合理的索引可能会导致性能下降和磁盘空间浪费。因此,理解索引的工作原理、类型以及如何优化索引非常重要。一、索......
  • 1.4. 线程状态转化及源码解读
    2.init()packageThreadPackage;publicclassThreadTest{publicstaticvoidmain(String[]args){//创建一个线程,显式调用Thread的构造函数Threadthread=newThread(()->{System.out.println("线程运行");},"M......
  • 【MySQL】常用的内置函数
    文章目录1.日期函数2.字符串函数3.数学函数4.其它函数在MySQL内部,有很多的函数供我们使用1.日期函数获取时间与日期current_date()current_time()current_timestamp()now()date()获取当前的日期时间仅获取当前的日期/时间获取一个时间加/减一个......
  • MySQL如何对用户资源进行限制
    MySQL提供了对每个用户的资源限制管理MAX_QUERIES_PER_HOUR: 一个用户在一个小时内可以执行查询的次数(基本包含所有语句)MAX_UPDATES_PER_HOUR:一个用户在一个小时内可以执行修改的次数(仅包含修改数据库或表的语句)MAX_CONNECTIONS_PER_HOUR:允许用户每小时连接的次数MAX_U......
  • MySQL主要的SQL_Mode值详解
    ANSI更改语法和行为,使其更符合标准SQL。STRICT_TRANS_TABLESTRADITIONAL使MySQL的行为象“传统”SQL数据库系统。该模式的简单描述是当在列中插入不正确的值时“给出错误而不是警告”等同STRICT_TRANS_TABLES、STRICT_ALL_TABLES、NO_ZERO_IN_DATE、NO_ZERO_DATE......