百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术资源 > 正文

线上问题之数据连接满了建立新连接失败

lipiwang 2024-11-02 13:39 14 浏览 0 评论

前言:

前两天,作者晚上九点下班,打车回去,想着可以美美的睡上一觉啦(ps:由于最近项目比较忙,就加班到九点,作者是很讨厌加班的)。可谁想,在凌晨十二点手机铃声响了,我迷迷糊糊的在睡梦中醒来,接通了电话。。。果不其然,是现场问题,需要立即支撑并解决。

到底是什么问题呢?原来是数据连接满了,导致业务无法再次和数据库建立连接,程序报错。需要优化修改。

问题分析

我们用的是MySQL数据库,会连不上数据库既连接太多,要么减少连接,要么扩大最大可连接数,经过查询,MySQL 数据库 的默认最大连接数是经常设置在151的默认值,而最大连接数可以达到16384个

报错信息:

com.mysql.cj.jdbc.exceptions.CommunicationsException: Communications link failure
too many connections

分析过程

一:

查看数据库当前连接信息,可以看到连接数据库的进程id,ip,用户名,连接的数据库,连接状态,连接时长等如果发现有大量的sleep状态的连接进程,则说明该参数设置的过大,可以进行适当的调整小一些。

SHOW FULL processlist;

在MySQL中,使用 SHOW FULL PROCESSLIST; 命令可以显示系统中所有当前运行的线程,包括每个线程的状态、是否锁定等信息。

这个命令输出的表格中包含的字段具有以下含义:

  1. Id: 线程的唯一标识符。这个ID可以用来引用特定的线程,例如,在需要终止一个特定的线程时可以使用 KILL 命令。
  2. User: 启动线程的MySQL用户。
  3. Host: 用户连接到MySQL服务器的主机名和端口号,显示格式通常是 host_name:port。
  4. db: 当前线程所在的数据库。如果线程没有使用任何数据库,这一列可能显示为NULL。
  5. Command: 线程正在执行的命令类型,例如 Query、Sleep、Connect 等。
  6. Time: 命令执行的时间,以秒为单位。对于 Sleep 状态,这表示线程处于空闲状态的时长。
  7. State: 线程的当前状态,提供了正在执行的命令的额外信息。这可以是 Sending data、sorting result、Locked 等。
  8. Info: 如果线程正在执行查询,则这一列显示具体的SQL语句。对于其他类型的命令,这一列可能为空或显示为NULL。

当 Command 列显示为 Sleep 时,这意味着该线程当前没有执行任何查询,只是在连接池中等待下一个查询命令。通常,应用程序执行完一个查询后,连接可能会保持打开状态而不是立即关闭,以便可以重用该连接执行后续的查询。在这种状态下,线程不会使用服务器资源来处理任何数据,但仍占用一个连接槽。如果看到很多线程处于 Sleep 状态且持续时间较长,这可能是一个优化点,例如,通过调整应用逻辑或连接池设置来减少空闲连接的数量。

二:

查询当前最大连接数和超时时间

# 查看最大连接数
show variables like '%max_connections%';
# 查看非交互式超时时间 单位秒
show variables like 'wait_timeout';
# 查看交互式叫号时间 单位秒
show variables like 'interactive_timeout';
  • max_connections:
    1. max_connections 参数定义了数据库服务器能够同时接受的最大客户端连接数。当达到这个限制时,任何新的尝试连接的客户端将会收到一个错误,通常是“Too many connections”。
    2. 默认值通常基于系统的能力和配置,但经常设置在151的默认值。这个值可以根据服务器的硬件资源(如CPU和内存)和负载要求进行调整。
  • mysqlx_max_connections:
    1. mysqlx_max_connections 参数是专门为MySQL的X协议设定的最大连接数。X协议使得开发者能够使用NoSQL风格的接口与数据库交互。
    2. 默认值通常较小,因为X协议的使用还不如传统SQL协议普遍。这个参数允许你独立于max_connections控制通过X协议可能的连接数。
  • wait_timeout
    1. wait_timeout 设置的是非交互式(非控制台)客户端连接在变成非活动状态后,在被自动关闭之前等待的秒数。非交互式连接通常指的是通过网络或API等进行的数据库连接,如应用程序服务器到数据库的连接。
    2. 默认值通常较长,如8小时(28800秒),但这可以根据需要进行调整,特别是在连接数资源受限的环境中。
  • interactive_timeout
    1. interactive_timeout 适用于MySQL服务器与客户端进行交互式会话时的连接超时设置。交互式会话通常是指用户通过MySQL命令行客户端或类似工具直接连接并操作数据库。
    2. 这个超时值只会在MySQL服务器识别连接为交互式时应用。它的默认值也通常是8小时。

    三:

    修改最大连接数和超时时间

    SQL直接改:

    # 重启后失效 这里直接设置1000
    SET GLOBAL max_connections = 1000;
    # 设置全局 非交互连接 超时时间 单位秒
    SET GLOBAL wait_timeout = 300;

    配置文件改:
    MySQL的配置文件通常是 my.cnf(在Linux系统中)或 my.ini(在Windows系统中)。你应该在 [mysqld] 部分中设置这些参数

    在Linux系统上,MySQL的配置文件一般位于以下几个路径之一:

    1. /etc/my.cnf
    2. /etc/mysql/my.cnf
    3. /var/lib/mysql/my.cnf

    具体位置可能会根据不同的Linux发行版和MySQL安装方式有所不同。你可以使用 find 命令来搜索这个文件,例如:sudo find / -name my.cnf

    找到到文件后,将这些值修改为下列的值 这里直接设置1000

    [mysqld]
    max_connections = 1000
    
    wait_timeout = 300
    

    四:
    docker容器修改配置

    1. 使用Docker命令行参数
    2. 可以在运行MySQL容器时通过Docker命令行直接设置配置参数,例如:
    docker run -d \
      -p 3306:3306 \
      --name mysql \
      -e MYSQL_ROOT_PASSWORD=my-secret-pw \
      -e MYSQL_DATABASE=mydatabase \
      mysql:tag --max-connections=1000 --wait-timeout=300

    --max-connections=1000 是作为命令行参数传递给MySQL服务器的

    修改配置文件并挂载,修改完后再查一遍看看有没有改成功

    # 查看最大连接数
    show variables like '%max_connections%';
    # 查看非交互式超时时间
    SHOW GLOBAL VARIABLES LIKE 'wait_timeout';

    说明:

    wait_timeout 变量分为全局级别和会话级别:
    执行 SET GLOBAL wait_timeout = 300;后,

  • 使用执行 show variables like 'wait_timeout'; 发现并没有改变是因为在MySQL中,当你执行 SET GLOBAL wait_timeout = 300; 这条命令时,理论上应该是会设置全局的 wait_timeout 值为300秒。在查询 wait_timeout 时,没有指定是查询全局变量,可能会返回会话级的值。会话级的 wait_timeout 并没有被改变。尝试使用以下命令来查看全局设置:
  • # 查看全局变量
    SHOW GLOBAL VARIABLES LIKE 'wait_timeout';
    # 与之对应的,查看会话级别的变量可以使用:
    SHOW SESSION VARIABLES LIKE 'wait_timeout';

    全局变量和会话变量的区别:

    全局变量:

    1. 全局变量对服务器上所有当前会话和未来会话都有效。
    2. 当你设置一个全局变量时,它的值会影响所有新建的连接。然而,对于已经存在的连接,全局变量的更改通常不会影响它们,除非这些连接被重新启动或者明确地重新读取全局设置。
    3. 通过 SET GLOBAL 命令修改全局变量,或者在服务器的配置文件中设置并重新启动服务器。

    会话变量:

    1. 会话变量只对当前连接的会话有效,并且当会话结束时,会话变量的设置就会失效。
    2. 修改会话变量的命令是 SET SESSION 或者简单的 SET,它不会影响其他会话或连接。
    3. 每个新的会话都会从当前的全局设置中继承变量的值,但在会话中对这些变量的修改不会影响到其他会话。

    关于是否改变全局变量,这取决于你试图解决的具体问题:

    • 如果你需要修改的设置应该对所有新的连接生效,例如,修改 wait_timeout 来减少空闲连接超时,那么修改全局变量是合适的。这样,所有新建立的连接都会采用新的超时设置。
    • 然而,如果你需要立即影响当前活动的会话,你必须在每个会话中单独设置会话变量。这在某些操作中可能是必需的,比如调整当前事务的隔离级别或者调试中动态改变某些性能调优参数。
    • 改变是为了长期或持久的配置调整,修改全局变量通常是正确的做法。但如果需要对当前会话立即生效的改变,应该使用会话变量。

    总结

    以上是关于数据连接满了,通过修改最大连接数和超时时间等参数配置来应对连接满的情况问题。

    相关推荐

    ubuntu单机安装open-falcon极度详细操作

    备注:以下操作均由本人实际操作并得到验证,喜欢的同学可尝试操作安装。步骤一1.1环境准备(使用系统:ubuntu18.04)1.1.1安装redisubuntu下安装(参考借鉴:https://...

    Linux搭建promtail、loki、grafana轻量日志监控系统

    一:简介日志监控告警系统,较为主流的是ELK(Elasticsearch、Logstash和Kibana核心套件构成),虽然优点是功能丰富,允许复杂的操作。但是,这些方案往往规模复杂,资源占用高,...

    一文搞懂,WAF阻止恶意攻击的8种方法

    WAF(Web应用程序防火墙)是应用程序和互联网流量之间的第一道防线,它监视和过滤Internet流量以阻止不良流量和恶意请求,WAF是确保Web服务的可用性和完整性的重要安全解决方案。它...

    14配置appvolume(ios14.6配置文件)

    使用AppVolumes应用程序功能,您可以管理应用程序的整个生命周期,包括打包、更新和停用应用程序。您还可以自定义应用程序分配,以向最终用户提供应用程序的特定版本14.1安装appvolume...

    目前流行的缺陷管理工具(缺陷管理方式存在的优缺点)

    摘自:https://blog.csdn.net/jasonteststudy/article/details/7090127?utm_medium=distribute.pc_relevant.no...

    开源数字货币交易所开发学习笔记(2)——SpringCloud

    前言码云(Gitee)上开源数字货币交易所源码CoinExchange的整体架构用了SpringCloud,对于经验丰富的Java程序员来说,可能很简单,但是对于我这种入门级程序员,还是有学习的必要的...

    开发JAX-RPC Web Services for WebSphere(下)

    在开发JAX-RPCWebServicesforWebSphere(上)一文中,小编为大家介绍了如何创建一个Web服务项目、如何创建一个服务类和Web服务,以及部署项目等内容。接下来小编将为大...

    CXF学习笔记1(cxf client)

    webservice是发布服务的简单并实用的一种技术了,个人学习了CXF这个框架,也比较简单,发布了一些笔记,希望对笔友收藏并有些作用哦1.什么是webServicewebService让一个程序可...

    分布式RPC最全详解(图文全面总结)

    分布式通信RPC是非常重要的分布式系统组件,大厂经常考察的Dubbo等RPC框架,下面我就全面来详解分布式通信RPC@mikechen本篇已收于mikechen原创超30万字《阿里架构师进阶专题合集》...

    Oracle WebLogic远程命令执行0day漏洞(CVE-2019-2725补丁绕过)预警

    概述近日,奇安信天眼与安服团队通过数据监控发现,野外出现OracleWebLogic远程命令执行漏洞最新利用代码,此攻击利用绕过了厂商今年4月底所发布的最新安全补丁(CVE-2019-2725)。由...

    Spring IoC Container 原理解析(spring中ioc三种实现原理)

    IoC、DI基础概念关于IoC和DI大家都不陌生,我们直接上martinfowler的原文,里面已经有DI的例子和spring的使用示例《InversionofControlContainer...

    Arthas线上服务器问题排查(arthas部署)

    1Arthas(阿尔萨斯)能为你做什么?这个类从哪个jar包加载的?为什么会报各种类相关的Exception?我改的代码为什么没有执行到?难道是我没commit?分支搞错了?遇到问题无法在...

    工具篇之IDEA功能插件HTTP_CLENT(idea2021插件)

    工具描述:Java开发人员通用的开发者工具IDEA集成了HTTPClient功能,之后可以无需单独安装使用PostMan用来模拟http请求。创建方式:1)简易模式Tools->HTTPCl...

    RPC、Web Service等几种远程监控通信方式对比

    几种远程监控通信方式的介绍一.RPCRPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.meth...

    《github精选系列》——SpringBoot 全家桶

    1简单总结1SpringBoot全家桶简介2项目简介3子项目列表4环境5运行6后续计划7问题反馈gitee地址:https://gitee.com/yidao620/springbo...

    取消回复欢迎 发表评论: