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

 更新时间:2026年03月04日 09:25:01   作者:墨着染霜华  
在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的资料请关注脚本之家其它相关文章!

相关文章

最新评论