• 【ERROR】MySQL太多连接数,导致阻塞


    1、引言:

    在当今数字化时代,数据扮演着至关重要的角色。作为企业的数据存储和管理引擎之一,MySQL在众多Web应用和服务中占有重要地位。然而,有时候,即使是最强大的工具也会出现问题。其中一个常见而令人头疼的问题就是"too many connections"错误。

    这个错误意味着MySQL服务器无法处理当前正在尝试连接的客户端请求,因为已经达到了最大允许的连接数。在这篇博客文章中,我们将深入探讨这个问题的原因,以及如何解决它,使您的MySQL数据库保持健康运行。

    2、理解"too many connections"错误

    MySQL默认的最大连接数为100,MySQL服务器允许的最大连接数16384

    首先,让我们来了解一下这个错误背后的原因。当MySQL服务器无法为新的客户端连接提供服务时,会触发"too many connections"错误。这可能发生因为以下几个原因:

    1. 达到最大连接数限制:MySQL服务器有一个最大连接数的限制,通常在配置文件中设置(通常是my.cnf或my.ini)。一旦达到这个限制,新的连接请求就会被拒绝。
    2. 长时间不关闭的连接:如果客户端应用程序在使用完连接后不及时关闭连接,会导致连接数堆积。
    3. 连接泄漏:有时应用程序中的bug或者编程错误可能导致连接没有被正确关闭,从而造成连接泄漏。

    3、排查步骤

    1、查询连接类容,定位大致机器

    #登录mysql
     mysql -uroot -p
    # 执行命令 
    SHOW PROCESSLIST;
    | 5148 | root            | kubernetes-node.0101211100.fjf:36334 | fubaoxx     | Sleep   |  561 |                        | NULL             |
    | 5201 | root            | kubernetes-node.0101211100.fjf:36936 | fubaoxx     | Sleep   |  541 |                        | NULL             |
    
    每个字段的含义如下:
    
    Id:连接的唯一标识符。
    User:连接的用户名。
    Host:连接的主机地址和端口号。
    db:当前连接的数据库。
    Command:当前连接正在执行的命令。
    Time:连接的持续时间(以秒为单位)。
    State:连接的状态。
    Info:当前连接正在执行的查询或操作的详细信息。
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    在这里插入图片描述
    根据这个时间,就可以推定是连接超时的参数为默认值,导致无法快速释放。

    2、查询最大连接数

    mysql>  show variables like 'max_connections';
    +-----------------+-------+
    | Variable_name   | Value |
    +-----------------+-------+
    | max_connections | 5000  |
    +-----------------+-------+
    1 row in set (0.00 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    这台MySQL服务器最大连接数是5000 ,然后查询一下服务器响应的最大连接数:

    mysql> show global status like 'Max_used_connections';
    +----------------------+-------+
    | Variable_name        | Value |
    +----------------------+-------+
    | Max_used_connections | 918   |
    +----------------------+-------+
    1 row in set (0.02 sec)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    MySQL服务器最大连接数是5000,没有达到服务器连接数上限5000,应该不会出现oo many connections(1040)错误,比较理想的设置是:
    Max_used_connections / max_connections * 100% ≈ 85%

    最大连接数占上限连接数的85%左右,如果发现比例在10%以下,MySQL服务器连接上限就设置得过高了。

    3、修改连接数

    1、方法一:修改配置文件。(推荐方法一)

    vim /etc/my.conf
    max_connections=5000
    
    • 1
    • 2

    进入制MySQL安装目录 打开MySQL配置文件 my.ini 或 my.cnf查找 max_connections=100 修改为 max_connections=5000服务里重起MySQL即可。

    方法二:命令行修改。(不推荐方法二)

    命令行登录MySQL后。
    设置新的MySQL最大连接数为200:

    MySQL> set global max_connections=500
    
    • 1

    这种方式有个问题,就是设置的最大连接数只在mysql当前服务进程有效,一旦mysql重启,又会恢复到初始状态。因为mysql启动后的初始化工作是从其配置文件中读取数据的,而这种方式没有对其配置文件做更改。

    4、wait_timeout和interactive_timeout 配置

    MySQL超时时间是指MySQL与客户端之间的连接时间,超出该时间则会断开连接。默认情况下,MySQL的超时时间是8小时。

    wait_timeout参数是指在没有活动连接的情况下,MySQL服务器关闭连接之前等待的秒数。默认时间为8小时,即28800秒。如果你的应用程序有长时间的空闲时间,可以适当地减少该值。

    interactive_timeout参数与wait_timeout类似,不同的是它只适用于交互式连接,例如使用命令行或者phpMyAdmin连接MySQL。默认时间也是8小时,即28800秒。同样地,如果你的应用程序有长时间的空闲时间,可以适当地减少该值。

    show GLOBAL VARIABLES like '%timeout%';
    
    • 1

    在这里插入图片描述
    通过设置以下两个参数进行配置:

    wait_timeout = 600
    interactive_timeout = 600
    
    • 1
    • 2

    在这里插入图片描述
    那么,该如何确定适合你的应用程序的超时时间呢?这需要针对不同的应用程序进行具体分析。如果你的应用程序有很快的响应时间和高流量,可以将超时时间设置为较低的值,比如5分钟。如果你的应用程序有较慢的响应时间和低流量,可以将超时时间设置为较高的值,比如30分钟。

    4、总结

    1. 控制连接最大空闲时长的wait_timeout参数。
    2. 对于非交互式连接,类似于jdbc连接,wait_timeout的值继承自服务器端全局变量wait_timeout。
    3. 对于交互式连接,类似于mysql客户单连接,wait_timeout的值继承自服务器端全局变量interactive_timeout。
    4. 判断一个连接的空闲时间,可通过show processlist输出中Sleep状态的时间。
    5. 超时时间只对非活动状态的connection进行计算。 超时时间只以session级别的wait_timeout
      为超时依据,global级别只决定session初始化时的超时默认值。

    注意事项
    在使用MySQL时,还有一些需要注意的问题:

    避免创建过多的连接,这会影响数据库性能。
    使用连接池管理连接。
    定期检查程序代码中是否正确关闭了数据库连接。

    "too many connections"错误可能会对您的MySQL数据库产生严重的影响,但通过理解其原因并采取适当的措施,您可以减轻这个问题的影响,确保您的数据库系统保持稳定和高效运行。

  • 相关阅读:
    Redis - 二进制位数组
    地塞米松/多柔比星/胡桃醌/丹皮酚-PLGA聚乳酸-羟基乙酸纳米粒
    力扣206. 反转链表
    实现领域驱动设计-应用结构
    基于SSM的宿舍管理系统【附源码文档】
    如何设计一个分布式 ID 发号器?
    JIT即时编译
    为什么有的人说技术不重要,有的人说重要?
    vue3 - pinia 中的 storeToRefs
    计算机的分类
  • 原文地址:https://blog.csdn.net/heian_99/article/details/134008042