如何巧妙解决 Too many connections 报错?
1. 背景
在日常的 MySQL 运维中,难免会出现参数设置不合理,导致 MySQL 在使用过程中出现各种各样的问题。
今天,我们就来讲解一下 MySQL 运维中一种常见的问题:最大连接数设置不合理,一旦到了业务高峰期就会出现连接数打满的问题。
报错信息
ERROR 1040 (HY000): Too many connections
报错原因
这个问题,无非就是并发过高,导致最大连接数被用完引起的。
解决办法
重新设置最大连接数 max_connections
的值。
处理痛点
- 出现了
Too many connections
的报错信息,无法用 mysql 客户端连接进行动态修改。 - 修改配置参数后重启,确实可以让
max_connections
的值重新生效,但是生产环境有业务访问,肯定是不能随便重启的。
2. GDB 工具
基于以上种种问题和主要痛点,那么我们就来试试 gdb 工具吧,让我们在不重启的状态下,照样可以修改 MySQL 的参数 !!!
gdb 工具的介绍在这里就不做过多赘述了,其实大多数场景下,都是把它当做调试工具来用。今天我们更多的是用到 gdb 在线修改配置参数的功能。
3. 处理过程
下面,我们就通过一个实验场景,来模拟 mysql
连接数打满,出现 Too many connections
的问题,通过 gdb 工具的解决步骤。
- 准备一个数据库实例,数据库版本为 MySQL 5.7.40。
- 创建一个空库
jiangshifeng
。
mysql> create database jiangshifeng; Query OK, 1 row affected (0.00 sec) mysql> show databases; +--------------------+ | Database | +--------------------+ | information_schema | | jiangshifeng | | mysql | | performance_schema | | sys | +--------------------+ 5 rows in set (0.00 sec) mysql> use jiangshifeng; Database changed mysql> show tables; Empty set (0.00 sec)
- 设置该实例的最大连接数为 10。
mysql> set global max_connections=10; Query OK, 0 rows affected (0.01 sec) mysql> show variables like '%max_conn%'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | max_connect_errors | 100 | | max_connections | 10 | +--------------------+-------+ 2 rows in set (0.00 sec)
- 安装 gdb 工具。
yum install -y gdb
安装完成验证
[root@node1 ~]# gdb GNU gdb (GDB) Red Hat Enterprise Linux 7.6.1-120.el7 Copyright (C) 2013 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http: gnu.org licenses gpl.html> This is free software: you are free to change and redistribute it. There is NO WARRANTY, to the extent permitted by law. Type "show copying" and "show warranty" for details. This GDB was configured as "x86_64-redhat-linux-gnu". For bug reporting instructions, please see: <http: www.gnu.org software gdb bugs />. (gdb) (gdb) q [root@node1 ~]#
- 使用 sysbench 进行压测,模拟在
jiangshifeng
这个空库创建 11 张表,每个表的数据量为 20000000 条,连接线程数为 15。
sysbench /usr/share/sysbench/oltp_common.lua --mysql-host=127.0.0.1 --mysql-port=3306 --mysql-user=root --mysql-password=123456 --mysql-db=jiangshifeng --db-driver=mysql --tables=11 --table-size=20000000 --report-interval=15 --threads=15 prepare
- 此时,我们再次用客户端工具连接 mysql,就会报错(
Too many connections
)。
[root@node1 ~]# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. ERROR 1040 (HY000): Too many connections [root@node1 ~]#
- 通过 gdb 工具设置
max_connections
参数。
方法一
gdb -p $(pidof mysqld) -ex "set max_connections=50" -batch
方法二
[root@node1 ~]# ps -ef | grep mysql root 1320 1 0 Mar17 ? 00:00:00 /bin/sh /usr/local/mysql/bin/mysqld_safe --datadir=/DB/mysql --pid-file=/DB/mysql/node1.pid mysql 1582 1320 9 Mar17 ? 03:33:44 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/DB/mysql --plugin-dir=/usr/local/mysql/lib/plugin --user=mysql --log-error=node1.err --pid-file=/DB/mysql/node1.pid --socket=/tmp/mysql.sock --port=3306 [root@node1 ~]# gdb -p 1582 ... (gdb) p max_connections $1 = 10 (gdb) (gdb) set max_connections=50 (gdb) p max_connections $4 = 50 (gdb) $5 = 50 (gdb) q A debugging session is active. Inferior 1 [process 1582] will be detached. Quit anyway? (y or n) y Detaching from program: /usr/local/mysql/bin/mysqld, process 1582 [Inferior 1 (process 1582) detached] [root@node1 sysbench]#
- 再次登录验证。
[root@node1 ~]# mysql -uroot -p123456 mysql: [Warning] Using a password on the command line interface can be insecure. Welcome to the MySQL monitor. Commands end with ; or \g. Your MySQL connection id is 146 Server version: 5.7.40-log MySQL Community Server (GPL) Copyright (c) 2000, 2022, Oracle and/or its affiliates. Oracle is a registered trademark of Oracle Corporation and/or its affiliates. Other names may be trademarks of their respective owners. Type 'help;' or '\h' for help. Type '\c' to clear the current input statement. mysql> mysql> show variables like '%max_conn%'; +--------------------+-------+ | Variable_name | Value | +--------------------+-------+ | max_connect_errors | 100 | | max_connections | 50 | +--------------------+-------+ 2 rows in set (0.10 sec)
此时,MySQL 最大连接数 max_connections
已经成功修改。并且,前面的 sysbench 压测数据还正常运行,可以理解为基本上不影响业务。
4. 总结
- 本次虽然只介绍了通过不重启的方式,用 gdb 修改
max_connections
参数。但是其他参数的修改也类似,可以使用同样的方式。 - 尽管在实验中看到了修改参数成功了,但是操作始终有未知风险的,不能总是觉得有了这些工具,一定能够万无一失。
- 一定要严格遵守开发规范,数据库的问题,往往是人在使用时的不当操作导致的。例如这个最大连接数,我们要评估好业务最大的并发的峰值,设置成比业务峰值大很多,就能尽量避免出现连接数打满的问题了。
- 另外,该参数也不是设置得越大越好,需要评估物理资源并配合压测情况得出一个合适的值,否则程序异常死锁导致不断申请新连接产生的连接数异常打满时,可能直接把数据库搞挂了。
更多技术文章,请访问:https://opensource.actionsky.com/
关于 SQLE
SQLE 是一款全方位的 SQL 质量管理平台,覆盖开发至生产环境的 SQL 审核和管理。支持主流的开源、商业、国产数据库,为开发和运维提供流程自动化能力,提升上线效率,提高数据质量。
✨ Github:https://github.com/actiontech/sqle
📚 文档:https://actiontech.github.io/sqle-docs/
💻 官网:https://opensource.actionsky.com/sqle/
👥 微信群:请添加小助手加入 ActionOpenSource
🔗 商业支持:https://www.actionsky.com/sqle</http:>

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
抢跑 AI 时代,焕新开源技能!LFOSSA 技能焕新季 85 折限时福利活动开启!
在 AI 大模型加速落地的时代,开源技术已成为企业转型与个人突围的核心竞争力。为响应广大开发者与企业对技能提升的迫切需求,Linux Foundation开源软件学园(LFOSSA) 于 5月7日至5月16日 正式启动LFOSSA 技能焕新季限时福利活动,全场 LF 官方认证考试及课程 85折起,限时开启! 技能焕新季 · LF认证限时福利详情 活动时间:5月7日 - 5月16日 适用产品:LF官方认证考试及课程 面向个人专属福利: 部分机构热门课程低至7折,添加 LFOSSA 官方微信,限时领取认证培训首节课程免费试听资格 面向企业专属福利(阶梯折扣): 1. 采购 5-20 个认证:享85折优惠 2. 采购 21-50 个认证:享8折优惠 3. 采购 50 个以上认证:联系官方客服,获取定制专属方案 参与方式 1.访问 LFOSSA 官网:打开https://training.linuxfoundation.cn/ 2.选择学习产品:浏览并挑选适合您的认证考试或课程产品。 3.享受折扣:进入结账页面,系统将自动为订单应用折扣价格 4.完成支付:开启您的开源学习与认证之旅! 技能...
- 下一篇
MCP 规范新版本特性全景解析与落地实践
作者:梧同 更新 MCP Specification【1】 在 2025-03-26 发布了最新的版本,本文对主要的改动进行详细介绍和解释 2025-03-26 版本与 2024-11-05 版本的主要更新对比表格: 关键差异总结: 安全性 OAuth 2.1 强制 PKCE 和 HTTPS,消除隐式流风险,更适应 AI 工具的高权限场景。 通信效率 Streamable HTTP 单端点设计简化架构,JSON-RPC 批处理减少网络开销。 工具可控性 Tool Annotations 显式标记风险行为(如删除操作),支持自动化权限管理和前端适配。 多模态扩展 新增音频流支持,补全语音交互能力,完善多模态生态。 开发友好性 参数补全(completions)和进度消息(message)提升开发者效率与用户体验。 更安全的 OAuth 2.1 1.1 从 OAuth 2.0 到 2.1 的本质跨越 1.1.1 核心安全缺陷的根治 旧版 OAuth 2.0 长期存在三大致命隐患: 在 AI 工具场景中,这些漏洞可能造成灾难性后果。例如通过截获未加密的授权码,攻击者可伪造"数据库清理工具"的...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS7编译安装Gcc9.2.0,解决mysql等软件编译问题
- Docker安装Oracle12C,快速搭建Oracle学习环境
- SpringBoot2全家桶,快速入门学习开发网站教程
- SpringBoot2配置默认Tomcat设置,开启更多高级功能
- CentOS关闭SELinux安全模块
- Eclipse初始化配置,告别卡顿、闪退、编译时间过长
- CentOS6,CentOS7官方镜像安装Oracle11G
- SpringBoot2整合MyBatis,连接MySql数据库做增删改查操作
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Hadoop3单机部署,实现最简伪集群