在CentOS上運(yùn)行MySQL報(bào)錯(cuò)Too many connections(連接數(shù)打滿)的解決方案
在CentOS服務(wù)器上運(yùn)維MySQL時(shí),經(jīng)常會(huì)遇到 Too many connections 報(bào)錯(cuò),尤其是通過(guò) mysqld_safe 腳本啟動(dòng)、而非系統(tǒng) systemctl 管理的MySQL實(shí)例(如本文實(shí)戰(zhàn)場(chǎng)景),報(bào)錯(cuò)后常規(guī)關(guān)閉、重啟命令會(huì)失效,甚至讓人誤以為MySQL服務(wù)異常。本文結(jié)合實(shí)際運(yùn)維場(chǎng)景,詳細(xì)講解該報(bào)錯(cuò)的原因、應(yīng)急解決步驟、永久優(yōu)化方案,全程可直接復(fù)制命令執(zhí)行,新手也能快速上手。
一、問(wèn)題場(chǎng)景復(fù)現(xiàn)(真實(shí)實(shí)戰(zhàn)案例)
服務(wù)器環(huán)境:CentOS 7,MySQL通過(guò) /usr/local/mysql/bin/mysqld_safe 腳本啟動(dòng)(非系統(tǒng)默認(rèn) mysqld/mariadb 服務(wù)),正常運(yùn)行一段時(shí)間后,執(zhí)行關(guān)閉命令時(shí)報(bào)錯(cuò):
[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'
同時(shí),用 systemctl status mysqld查看服務(wù)狀態(tài),顯示 inactive (dead),但通過(guò)ps aux | grep mysql 能看到MySQL進(jìn)程正常運(yùn)行——核心原因是:MySQL連接數(shù)打滿,導(dǎo)致無(wú)法建立新的管理連接,且MySQL未通過(guò)系統(tǒng)服務(wù)管理,常規(guī)命令失效。
二、核心原因分析
1. 直接原因:MySQL默認(rèn)連接數(shù)(max_connections)默認(rèn)值較低(通常為151),當(dāng)客戶端連接數(shù)超過(guò)該閾值,就會(huì)拒絕新連接,報(bào) Too many connections;
2. 間接原因:本次場(chǎng)景中,MySQL通過(guò) mysqld_safe 腳本啟動(dòng),而非系統(tǒng) systemd服務(wù),導(dǎo)致 systemctl 無(wú)法識(shí)別和管理MySQL進(jìn)程,常規(guī)的 systemctl restart mysqld 無(wú)效;
3. 潛在原因:未配置閑置連接超時(shí),導(dǎo)致大量閑置連接占用連接數(shù),長(zhǎng)期積累后打滿閾值。
三、分步解決方案(應(yīng)急+永久,全程實(shí)戰(zhàn))
核心思路:先安全停止打滿連接的MySQL進(jìn)程 → 臨時(shí)調(diào)高連接數(shù)重啟 → 修改配置文件永久優(yōu)化,全程保證數(shù)據(jù)不丟失。
第一步:應(yīng)急處理——安全停止MySQL進(jìn)程(解決連接數(shù)打滿)
由于連接數(shù)打滿,mysqladmin 無(wú)法登錄執(zhí)行關(guān)閉命令,此時(shí)需通過(guò) kill 命令發(fā)送正常關(guān)閉信號(hào),確保MySQL先處理完現(xiàn)有連接、刷盤(pán)后再退出(避免數(shù)據(jù)丟失),步驟如下:
- 查找MySQL主進(jìn)程PID(關(guān)鍵,對(duì)應(yīng)
mysqld進(jìn)程,而非mysqld_safe):# 自動(dòng)查找MySQL主進(jìn)程PID,無(wú)需手動(dòng)輸入MYSQL_PID=$(ps aux | grep '/usr/local/mysql/bin/mysqld' | grep -v grep | awk '{print $2}')# 查看找到的PID(確認(rèn)是否正確)echo $MYSQL_PID說(shuō)明:執(zhí)行后會(huì)輸出一串?dāng)?shù)字(如本文案例中的 26693),即為MySQL主進(jìn)程PID。 - 發(fā)送正常關(guān)閉信號(hào)(最安全,優(yōu)先使用):
kill -TERM $MYSQL_PID說(shuō)明:kill -TERM是正常關(guān)閉信號(hào),MySQL會(huì)收到信號(hào)后,停止接收新連接、處理完現(xiàn)有連接、將內(nèi)存中的數(shù)據(jù)刷到磁盤(pán),然后安全退出,不會(huì)丟失數(shù)據(jù)。 - 確認(rèn)進(jìn)程已停止:
# 等待5秒,讓MySQL完成刷盤(pán)和退出sleep 5# 查看MySQL進(jìn)程,確認(rèn)是否停止ps aux | grep mysql若輸出結(jié)果中,只有grep --color=auto mysql這一行,說(shuō)明MySQL已成功停止;若仍有mysqld進(jìn)程,執(zhí)行應(yīng)急強(qiáng)制關(guān)閉(僅兜底使用,盡量少用):kill -9 $MYSQL_PID注意:kill -9會(huì)強(qiáng)制終止進(jìn)程,可能導(dǎo)致未刷盤(pán)的數(shù)據(jù)丟失,僅在kill -TERM無(wú)效時(shí)使用。
第二步:重啟MySQL(臨時(shí)調(diào)高連接數(shù),恢復(fù)服務(wù))
重啟時(shí),需沿用原有的 mysqld_safe 啟動(dòng)參數(shù),同時(shí)臨時(shí)調(diào)高連接數(shù),避免重啟后再次快速打滿,命令如下:
# 后臺(tái)重啟MySQL,保持原有datadir和pid-file參數(shù),臨時(shí)調(diào)高連接數(shù)到1000 nohup /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/data/mysql.pid --max_connections=1000
參數(shù)說(shuō)明:
--datadir=/data/mysql/data:MySQL數(shù)據(jù)存儲(chǔ)目錄(需和你服務(wù)器上的實(shí)際路徑一致,可通過(guò)ps aux | grep mysql查看);--pid-file=/data/mysql/data/mysql.pid:MySQL進(jìn)程PID文件路徑(同上,保持和原有啟動(dòng)參數(shù)一致);--max_connections=1000:臨時(shí)將最大連接數(shù)調(diào)到1000(可根據(jù)服務(wù)器配置調(diào)整,如2核4G服務(wù)器建議1000-2000);nohup ...&:后臺(tái)啟動(dòng),避免關(guān)閉終端后MySQL進(jìn)程退出。
重啟后驗(yàn)證是否成功:
# 1. 查看MySQL進(jìn)程是否正常啟動(dòng)(應(yīng)有mysqld_safe和mysqld兩個(gè)進(jìn)程) ps aux | grep mysql # 2. 登錄MySQL驗(yàn)證(使用實(shí)際的socket文件和端口) /usr/local/mysql/bin/mysql -uroot -p -S /tmp/mysql.sock -P 5757
若能正常登錄MySQL,說(shuō)明重啟成功,服務(wù)已恢復(fù)正常。
第三步:永久優(yōu)化——修改配置文件,徹底解決連接數(shù)打滿
第二步中臨時(shí)調(diào)高的 max_connections,會(huì)在MySQL重啟后失效,需修改MySQL配置文件,永久生效,同時(shí)配置閑置連接超時(shí),自動(dòng)釋放無(wú)用連接。
- 查找MySQL配置文件(MySQL配置文件通常名為
my.cnf或my.ini,常見(jiàn)路徑如下):# 全局查找配置文件,挨個(gè)驗(yàn)證find /etc /usr/local/mysql/ -name my.cnf -o -name my.ini常見(jiàn)結(jié)果:/etc/my.cnf、/usr/local/mysql/my.cnf,找到后記錄路徑(本文以/etc/my.cnf為例)。 - 編輯配置文件(使用vi編輯器,新手可直接復(fù)制命令):
vi /etc/my.cnf進(jìn)入編輯模式后,找到[mysqld]段落(若沒(méi)有,在文件頂部添加),添加/修改以下兩行:[mysqld]# 永久設(shè)置最大連接數(shù)(根據(jù)服務(wù)器配置調(diào)整,2核4G建議1000-2000,8核16G建議2000-3000)max_connections = 1000# 閑置連接超時(shí)時(shí)間(單位:秒),600秒=10分鐘,超時(shí)后自動(dòng)釋放連接wait_timeout = 600編輯完成后,按Esc鍵,輸入:wq保存并退出。 - 重啟MySQL,使配置生效(重復(fù)第一步和第二步的重啟命令):
# 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(無(wú)需再加--max_connections,配置文件已生效)nohup /usr/local/mysql/bin/mysqld_safe --datadir=/data/mysql/data --pid-file=/data/mysql/data/mysql.pid& - 驗(yàn)證配置是否生效:
# 登錄MySQL/usr/local/mysql/bin/mysql -uroot -p -S /tmp/mysql.sock -P 5757# 查看當(dāng)前最大連接數(shù)和閑置超時(shí)時(shí)間show variables like 'max_connections';show variables like 'wait_timeout';若輸出結(jié)果中,max_connections為1000、wait_timeout為600,說(shuō)明配置已永久生效。
四、補(bǔ)充說(shuō)明(避坑關(guān)鍵)
1. 關(guān)于MySQL服務(wù)管理方式的補(bǔ)充
本文場(chǎng)景中,MySQL通過(guò) mysqld_safe 啟動(dòng),導(dǎo)致 systemctl status mysqld 顯示 dead,這是正?,F(xiàn)象——systemctl只能管理通過(guò)系統(tǒng)服務(wù)注冊(cè)的進(jìn)程,而 mysqld_safe 是手動(dòng)啟動(dòng)的腳本,不屬于系統(tǒng)服務(wù)。
若想后續(xù)用 systemctl 方便管理(如 systemctl restart mysql),可手動(dòng)創(chuàng)建 systemd 服務(wù)文件,具體步驟可參考文末拓展。
2. 連接數(shù)調(diào)整建議(避免過(guò)度調(diào)高)
max_connections 并非越高越好,需根據(jù)服務(wù)器配置調(diào)整:
- 2核4G服務(wù)器:建議1000-2000;
- 4核8G服務(wù)器:建議2000-3000;
- 8核16G及以上:建議3000-5000;
- 若服務(wù)器內(nèi)存較?。ㄈ?核2G),建議500-1000,避免連接數(shù)過(guò)高導(dǎo)致內(nèi)存耗盡。
3. 常見(jiàn)報(bào)錯(cuò)排查
(1)重啟后無(wú)法登錄MySQL:檢查 datadir 和 pid-file 路徑是否正確,確保和啟動(dòng)參數(shù)一致;
(2)kill 進(jìn)程后仍無(wú)法重啟:檢查是否有殘留進(jìn)程,執(zhí)行 ps aux | grep mysql 找到殘留PID,用 kill -9 強(qiáng)制終止后再重啟;
(3)配置文件修改后不生效:確認(rèn)配置文件路徑正確,且修改后重啟了MySQL,同時(shí)檢查 [mysqld] 段落是否正確(配置必須在該段落下才會(huì)生效)。
五、拓展:將MySQL注冊(cè)為系統(tǒng)服務(wù)(可選,方便管理)
若想后續(xù)用 systemctl 管理MySQL(如啟動(dòng)、停止、開(kāi)機(jī)自啟),可創(chuàng)建 systemd 服務(wù)文件,步驟如下:
# 1. 創(chuàng)建服務(wù)文件 vi /etc/systemd/system/mysql.service # 2. 寫(xiě)入以下內(nèi)容(需修改路徑為你服務(wù)器上的實(shí)際路徑) [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. 重新加載系統(tǒng)服務(wù) systemctl daemon-reload # 4. 啟動(dòng)并設(shè)置開(kāi)機(jī)自啟 systemctl start mysql systemctl enable mysql # 5. 查看服務(wù)狀態(tài) systemctl status mysql
說(shuō)明:將 ExecStop 中的 密碼 替換為你的MySQL root密碼,后續(xù)即可用 systemctl restart mysql 直接重啟,無(wú)需再手動(dòng)執(zhí)行 mysqld_safe 腳本。
六、總結(jié)
MySQL報(bào)錯(cuò) Too many connections 的核心是連接數(shù)閾值不足,結(jié)合本文實(shí)戰(zhàn)場(chǎng)景(mysqld_safe 啟動(dòng)的MySQL),解決流程可總結(jié)為:
應(yīng)急停止(kill -TERM 安全關(guān)閉)→ 臨時(shí)重啟(調(diào)高連接數(shù))→ 永久優(yōu)化(修改配置文件+閑置超時(shí)),全程無(wú)需復(fù)雜操作,命令可直接復(fù)制執(zhí)行。
另外,建議定期查看MySQL連接數(shù)狀態(tài)(show global status like 'Threads_connected';),及時(shí)調(diào)整 max_connections 閾值,避免再次出現(xiàn)連接數(shù)打滿的問(wèn)題。
以上就是在CentOS上運(yùn)行MySQL報(bào)錯(cuò)Too many connections(連接數(shù)打滿)的解決方案的詳細(xì)內(nèi)容,更多關(guān)于MySQL報(bào)錯(cuò)Too many connections的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
MySQL FIND_IN_SET 函數(shù)實(shí)戰(zhàn)實(shí)例
FIND_IN_SET是MySQL處理分隔字符串的函數(shù),用于判斷字符串是否存在于列表中,返回位置或0,適用于標(biāo)簽、分類等多值場(chǎng)景,但無(wú)法使用索引,性能較差,建議結(jié)合替代方案或優(yōu)化設(shè)計(jì),注意大小寫(xiě)敏感和空值處理問(wèn)題,對(duì)mysql find_in_set函數(shù)感興趣的朋友一起看看吧2025-07-07
了解MySQL之Adaptive Hash Index的使用
InnoDB的自適應(yīng)哈希索引(AHI)是內(nèi)存結(jié)構(gòu),自動(dòng)優(yōu)化等值查詢,不支持排序,通過(guò)緩存熱點(diǎn)數(shù)據(jù)提升效率,參數(shù)可調(diào)整,適用于特定場(chǎng)景2025-08-08
Mysql之索引的數(shù)據(jù)結(jié)構(gòu)詳解
索引是存儲(chǔ)引擎用于快速找到數(shù)據(jù)記錄的一種數(shù)據(jù)結(jié)構(gòu),類似于教科書(shū)的目錄部分,在MySQL中,索引可以加速數(shù)據(jù)查找,減少磁盤(pán)I/O的次數(shù),提高查詢速率,但是,創(chuàng)建和維護(hù)索引需要耗費(fèi)時(shí)間,并且索引需要占磁盤(pán)空間,在InnoDB中,索引的實(shí)現(xiàn)基于B+樹(shù)結(jié)構(gòu)2024-12-12
mysql執(zhí)行sql文件報(bào)錯(cuò)Error: Unknown storage engine‘InnoDB’的解決方法
最近在執(zhí)行一個(gè)innoDB類型sql文件的時(shí)候,發(fā)現(xiàn)系統(tǒng)報(bào)錯(cuò)了,通過(guò)查找相關(guān)的資料終于解決了,所以下面這篇文章主要給大家介紹了關(guān)于mysql執(zhí)行sql文件時(shí)報(bào)錯(cuò)Error: Unknown storage engine 'InnoDB'的解決方法,需要的朋友可以參考借鑒,下面來(lái)一起看看吧。2017-07-07
MySQL的索引系統(tǒng)采用B+樹(shù)的原因解析
索引是為了加速對(duì)表中數(shù)據(jù)行的檢索而創(chuàng)建的一種分散的存儲(chǔ)結(jié)構(gòu),這篇文章主要介紹了MySQL的索引系統(tǒng)采用B+樹(shù)的原因解析,需要的朋友可以參考下2021-09-09

