在CentOS上运行MySQL报错Too many connections(连接数打满)的解决方案
作者:墨着染霜华
在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先处理完现有连接、刷盘后再退出(避免数据丢失),步骤如下:
- 查找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。 - 发送正常关闭信号(最安全,优先使用):
kill -TERM $MYSQL_PID说明:kill -TERM是正常关闭信号,MySQL会收到信号后,停止接收新连接、处理完现有连接、将内存中的数据刷到磁盘,然后安全退出,不会丢失数据。 - 确认进程已停止:
# 等待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配置文件,永久生效,同时配置闲置连接超时,自动释放无用连接。
- 查找MySQL配置文件(MySQL配置文件通常名为
my.cnf或my.ini,常见路径如下):# 全局查找配置文件,挨个验证find /etc /usr/local/mysql/ -name my.cnf -o -name my.ini常见结果:/etc/my.cnf、/usr/local/mysql/my.cnf,找到后记录路径(本文以/etc/my.cnf为例)。 - 编辑配置文件(使用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保存并退出。 - 重启MySQL,使配置生效(重复第一步和第二步的重启命令):
# 1. 停止MySQL(同第一步)MYSQL_PID=$(ps aux | grep '/usr/local/mysql/bin/mysqld' | grep -v grep | awk '{print $2}')kill -TERM $MYSQL_PIDsleep 5# 2. 重启MySQL(无需再加--max_connections,配置文件已生效)nohup /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/data/mysql.pid& - 验证配置是否生效:
# 登录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:检查 datadir 和 pid-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的资料请关注脚本之家其它相关文章!
