当前位置: 代码网 > it编程>数据库>Mysql > 在CentOS上运行MySQL报错Too many connections(连接数打满)的解决方案

在CentOS上运行MySQL报错Too many connections(连接数打满)的解决方案

2026年03月04日 Mysql 我要评论
在centos服务器上运维mysql时,经常会遇到 too many connections 报错,尤其是通过 mysqld_safe 脚本启动、而非系统 systemctl 管理的mysql实例(如

在centos服务器上运维mysql时,经常会遇到 too many connections 报错,尤其是通过 mysqld_safe 脚本启动、而非系统 systemctl 管理的mysql实例(如本文实战场景),报错后常规关闭、重启命令会失效,甚至让人误以为mysql服务异常。本文结合实际运维场景,详细讲解该报错的原因、应急解决步骤、永久优化方案,全程可直接复制命令执行,新手也能快速上手。

一、问题场景复现(真实实战案例)

服务器环境:centos 7,mysql通过 /usr/local/mysql/bin/mysqld_safe 脚本启动(非系统默认 mysqld/mariadb 服务),正常运行一段时间后,执行关闭命令时报错:

[root@vm-0-16-centos ~]# /usr/local/mysql/bin/mysqladmin -uroot -p -s /tmp/mysql.sock shutdown
enter password: 
mysqladmin: connect to server at 'localhost' failed
error: 'too many connections'

同时,用 systemctl status mysqld查看服务状态,显示 inactive (dead),但通过ps aux | grep mysql 能看到mysql进程正常运行——核心原因是:mysql连接数打满,导致无法建立新的管理连接,且mysql未通过系统服务管理,常规命令失效。

二、核心原因分析

1. 直接原因:mysql默认连接数(max_connections)默认值较低(通常为151),当客户端连接数超过该阈值,就会拒绝新连接,报 too many connections

2. 间接原因:本次场景中,mysql通过 mysqld_safe 脚本启动,而非系统 systemd服务,导致 systemctl 无法识别和管理mysql进程,常规的 systemctl restart mysqld 无效;

3. 潜在原因:未配置闲置连接超时,导致大量闲置连接占用连接数,长期积累后打满阈值。

三、分步解决方案(应急+永久,全程实战)

核心思路:先安全停止打满连接的mysql进程 → 临时调高连接数重启 → 修改配置文件永久优化,全程保证数据不丢失。

第一步:应急处理——安全停止mysql进程(解决连接数打满)

由于连接数打满,mysqladmin 无法登录执行关闭命令,此时需通过 kill 命令发送正常关闭信号,确保mysql先处理完现有连接、刷盘后再退出(避免数据丢失),步骤如下:

  1. 查找mysql主进程pid(关键,对应 mysqld 进程,而非 mysqld_safe): # 自动查找mysql主进程pid,无需手动输入 mysql_pid=$(ps aux | grep '/usr/local/mysql/bin/mysqld' | grep -v grep | awk '{print $2}') # 查看找到的pid(确认是否正确) echo $mysql_pid说明:执行后会输出一串数字(如本文案例中的 26693),即为mysql主进程pid。
  2. 发送正常关闭信号(最安全,优先使用):kill -term $mysql_pid说明:kill -term 是正常关闭信号,mysql会收到信号后,停止接收新连接、处理完现有连接、将内存中的数据刷到磁盘,然后安全退出,不会丢失数据。
  3. 确认进程已停止:# 等待5秒,让mysql完成刷盘和退出 sleep 5 # 查看mysql进程,确认是否停止 ps aux | grep mysql若输出结果中,只有 grep --color=auto mysql 这一行,说明mysql已成功停止;若仍有 mysqld 进程,执行应急强制关闭(仅兜底使用,尽量少用): kill -9 $mysql_pid注意:kill -9 会强制终止进程,可能导致未刷盘的数据丢失,仅在 kill -term 无效时使用。

第二步:重启mysql(临时调高连接数,恢复服务)

重启时,需沿用原有的 mysqld_safe 启动参数,同时临时调高连接数,避免重启后再次快速打满,命令如下:

# 后台重启mysql,保持原有datadir和pid-file参数,临时调高连接数到1000
nohup /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/data/mysql.pid --max_connections=1000 

参数说明:

  • --datadir=/data/mysql/data:mysql数据存储目录(需和你服务器上的实际路径一致,可通过 ps aux | grep mysql 查看);
  • --pid-file=/data/mysql/data/mysql.pid:mysql进程pid文件路径(同上,保持和原有启动参数一致);
  • --max_connections=1000:临时将最大连接数调到1000(可根据服务器配置调整,如2核4g服务器建议1000-2000);
  • nohup ... &:后台启动,避免关闭终端后mysql进程退出。

重启后验证是否成功:

# 1. 查看mysql进程是否正常启动(应有mysqld_safe和mysqld两个进程)
ps aux | grep mysql

# 2. 登录mysql验证(使用实际的socket文件和端口)
/usr/local/mysql/bin/mysql -uroot -p -s /tmp/mysql.sock -p 5757

若能正常登录mysql,说明重启成功,服务已恢复正常。

第三步:永久优化——修改配置文件,彻底解决连接数打满

第二步中临时调高的 max_connections,会在mysql重启后失效,需修改mysql配置文件,永久生效,同时配置闲置连接超时,自动释放无用连接。

  1. 查找mysql配置文件(mysql配置文件通常名为 my.cnfmy.ini,常见路径如下): # 全局查找配置文件,挨个验证 find /etc /usr/local/mysql/ -name my.cnf -o -name my.ini常见结果:/etc/my.cnf/usr/local/mysql/my.cnf,找到后记录路径(本文以 /etc/my.cnf 为例)。
  2. 编辑配置文件(使用vi编辑器,新手可直接复制命令): vi /etc/my.cnf进入编辑模式后,找到 [mysqld] 段落(若没有,在文件顶部添加),添加/修改以下两行:[mysqld] # 永久设置最大连接数(根据服务器配置调整,2核4g建议1000-2000,8核16g建议2000-3000) max_connections = 1000 # 闲置连接超时时间(单位:秒),600秒=10分钟,超时后自动释放连接 wait_timeout = 600编辑完成后,按 esc 键,输入 :wq 保存并退出。
  3. 重启mysql,使配置生效(重复第一步和第二步的重启命令): # 1. 停止mysql(同第一步) mysql_pid=$(ps aux | grep '/usr/local/mysql/bin/mysqld' | grep -v grep | awk '{print $2}') kill -term $mysql_pid sleep 5 # 2. 重启mysql(无需再加--max_connections,配置文件已生效) nohup /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/data/mysql.pid &
  4. 验证配置是否生效: # 登录mysql /usr/local/mysql/bin/mysql -uroot -p -s /tmp/mysql.sock -p 5757 # 查看当前最大连接数和闲置超时时间 show variables like 'max_connections'; show variables like 'wait_timeout';若输出结果中,max_connections 为1000、wait_timeout 为600,说明配置已永久生效。

四、补充说明(避坑关键)

1. 关于mysql服务管理方式的补充

本文场景中,mysql通过 mysqld_safe 启动,导致 systemctl status mysqld 显示 dead,这是正常现象——systemctl只能管理通过系统服务注册的进程,而 mysqld_safe 是手动启动的脚本,不属于系统服务。

若想后续用 systemctl 方便管理(如 systemctl restart mysql),可手动创建 systemd 服务文件,具体步骤可参考文末拓展。

2. 连接数调整建议(避免过度调高)

max_connections 并非越高越好,需根据服务器配置调整:

  • 2核4g服务器:建议1000-2000;
  • 4核8g服务器:建议2000-3000;
  • 8核16g及以上:建议3000-5000;
  • 若服务器内存较小(如1核2g),建议500-1000,避免连接数过高导致内存耗尽。

3. 常见报错排查

(1)重启后无法登录mysql:检查 datadirpid-file 路径是否正确,确保和启动参数一致;

(2)kill 进程后仍无法重启:检查是否有残留进程,执行 ps aux | grep mysql 找到残留pid,用 kill -9 强制终止后再重启;

(3)配置文件修改后不生效:确认配置文件路径正确,且修改后重启了mysql,同时检查 [mysqld] 段落是否正确(配置必须在该段落下才会生效)。

五、拓展:将mysql注册为系统服务(可选,方便管理)

若想后续用 systemctl 管理mysql(如启动、停止、开机自启),可创建 systemd 服务文件,步骤如下:

# 1. 创建服务文件
vi /etc/systemd/system/mysql.service

# 2. 写入以下内容(需修改路径为你服务器上的实际路径)
[unit]
description=mysql server
after=network.target

[service]
user=mysql
group=mysql
execstart=/usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/data/mysql.pid
execstop=/usr/local/mysql/bin/mysqladmin -uroot -p密码 -s /tmp/mysql.sock shutdown
restart=on-failure

[install]
wantedby=multi-user.target

# 3. 重新加载系统服务
systemctl daemon-reload

# 4. 启动并设置开机自启
systemctl start mysql
systemctl enable mysql

# 5. 查看服务状态
systemctl status mysql

说明:将 execstop 中的 密码 替换为你的mysql root密码,后续即可用 systemctl restart mysql 直接重启,无需再手动执行 mysqld_safe 脚本。

六、总结

mysql报错 too many connections 的核心是连接数阈值不足,结合本文实战场景(mysqld_safe 启动的mysql),解决流程可总结为:

应急停止(kill -term 安全关闭)→ 临时重启(调高连接数)→ 永久优化(修改配置文件+闲置超时),全程无需复杂操作,命令可直接复制执行。

另外,建议定期查看mysql连接数状态(show global status like 'threads_connected';),及时调整 max_connections 阈值,避免再次出现连接数打满的问题。

以上就是在centos上运行mysql报错too many connections(连接数打满)的解决方案的详细内容,更多关于mysql报错too many connections的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2026  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com