数据库连接数优化指南:配置步骤与常见问题

当网站突然变慢、出现 Too many connections 错误时,很可能是数据库连接数达到了上限。
这篇教程会带你一步步完成数据库连接数优化,从查看当前状态到调整配置再到验证效果,零基础也能跟着做。

为什么数据库连接数会爆满

每个程序请求数据库时都会建立一个连接,如果同时发起的请求太多,而数据库允许的最大连接数(如 MySQL 的 max_connections)设置得过小,就会拒绝新连接。
常见场景:高峰期并发高、代码未释放连接、慢查询积压。
优化连接数不等于无脑改大,还需要结合服务器内存和业务情况。

第一步:查看当前的数据库连接数

登录到服务器终端(SSH),执行:

mysql -u root -p -e "SHOW VARIABLES LIKE 'max_connections';"

输入密码后你会看到类似 max_connections 151 的数值,这是当前允许的最大连接数。

接着查看实际连接数:

mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"

如果 Threads_connected 接近甚至等于 max_connections,说明连接数吃紧,需要优化。

如果想看更详细的状态(包含运行、等待、空闲的线程),可以用:

SHOW FULL PROCESSLIST;

注意:如果服务器无法直接连数据库,可以在宝塔面板的“数据库”菜单里,点击对应数据库的“管理”进入 phpMyAdmin,在 SQL 窗口执行上述命令。

第二步:调整最大连接数(两种方法)

方法一:临时修改(重启后失效)

登录 MySQL 后执行:

SET GLOBAL max_connections = 500;

这样立即生效,适合临时应对高峰。
但重启 MySQL 后会恢复原值,所以需要配合方法二持久化。

方法二:修改配置文件(推荐)

找到 MySQL 配置文件 my.cnfmy.ini,常见路径:

  • Linux:/etc/mysql/my.cnf/etc/my.cnf
  • 宝塔面板:在软件商店中找到 MySQL,点击“设置” -> “配置修改”

[mysqld] 段下添加或修改:

max_connections = 500

保存后重启 MySQL 服务:

systemctl restart mysql

注意:不要设置过大,一般每个连接占用约几 MB 内存,500 个连接约需要 1-2G 额外内存。
如果你的服务器内存只有 1G,建议谨慎增加到 200-300 即可。

第三步:避坑与优化建议

  • 别只改大 max_connections:如果代码不优雅(如长连接未关闭),改大只是延缓问题。建议先在 SHOW FULL PROCESSLIST 里检查是否有大量 Sleep 状态的空闲连接,有的话需要调整程序的连接池超时时间或使用连接池中间件。
  • 开启慢查询日志:排查是否有执行时间过长的 SQL 占用连接。在配置文件中加入:
  slow_query_log = 1
  long_query_time = 2
  slow_query_log_file = /var/log/mysql-slow.log
  • 使用 Web 工具优化:如果是宝塔用户,可以在“防火墙”中限制单 IP 连接数,或在 Nginx 层面限制并发请求数,防止恶意攻击打满数据库。
  • 检查 PHP-FPM 进程数:如果网站是 PHP 程序,pm.max_children 设置过大也会导致数据库连接过多。建议 pm.max_childrenmax_connections 保持一定比例(比如 1:2)。

第四步:验证优化效果

修改完重启后,再次执行查看连接数的命令:

mysql -u root -p -e "SHOW STATUS LIKE 'Threads_connected';"

看数值是否明显低于修改后的 max_connections

也可以用压力测试工具模拟访问:

ab -n 1000 -c 50 http://你的域名/

测试过程中留意 SHOW PROCESSLIST 是否出现太多 Waiting 状态,同时观察服务器负载(tophtop)。

如果 Threads_connected 持续上涨且不下降,说明代码没有正确释放连接,需要进一步排查。

高频问题解答(FAQ)

Q1:修改后提示权限不足?
A:SET GLOBAL 需要 SUPER 权限,登录时使用 root 账号就行。如果你用的是云数据库,需要在控制台参数组中修改。

Q2:连接数改成 1000 会出问题吗?
A:会消耗大量内存,甚至导致 OOM。建议每次增加 100-200,逐步压测观察后再提升。

Q3:用了连接池还需要改 max_connections 吗?
A:建议保留适当上限作为兜底,比如连接池最大 150,数据库设成 200,防止连接池异常泄露。

Q4:重启后连接数又变回原来
A:检查是否修改了正确配置文件的位置,部分系统(如 MariaDB)可能加载多个配置,可以用 mysqld --verbose --help | grep -A1 "Default options" 查看加载顺序。

如果你正在处理数据库连接数优化,建议先按本文步骤完整执行,再根据自己的环境做微调;
遇到异常时优先回看避坑和高频问题部分。

分享到:
上一篇
服务器跨域配置最简单方法:Nginx三步搞定前端接口报错
下一篇
PHP内存限制优化:PHP内存限制怎么调?新手零报错优化指南
1
系统公告

高考专属福利来袭|凭准考证免费领香港 CN2 云服务器

值高考落幕之际,泽御云开启考生专属回馈 + 产品限时特惠双重活动,助力学子暑期学习建站 高考 考生专属福利 全体应届高考生,凭高考准考证即可免费申领【香港 CN2 轻量云服务器,4 核 4G AMD 处理器】,免费使用周期 30 天,可用于搭建个人站点、编程实操、技术实训,祝各位考生金榜题名,前程似锦! 泽御云资质齐全合规自营机房,线路覆盖香港 CN2、国内 BGP、内蒙电信、美国精品线路,售后全天候技术支持。 官方网站:www.zeyuyun.com,活动限时有效,优惠逾期不再保留。
服务中心
客服
在线客服
24小时为您服务
咨询
联系我们
联系我们,为您的业务提供专属服务。
24/7 技术支持
如果您遇到寻求进一步的帮助,请过工单与我们进行联系。
24/7 即时支持
泽御云
售前客服
泽御云
泽御云
售后客服
泽御云
技术支持
评价
您对当前页面的整体感受是否满意?
😞
非常不满意
😕
不满意
😐
一般
🙂
满意
😊
非常满意