今天我的MySQL遇到一個不算太陌生的錯誤“Too many connections”。平常碰到這個問題,我基本上是修改/etc/my.cnf的
成都創(chuàng)新互聯(lián)是一家專注于網(wǎng)站建設(shè)、成都網(wǎng)站設(shè)計與策劃設(shè)計,銅鼓網(wǎng)站建設(shè)哪家好?成都創(chuàng)新互聯(lián)做網(wǎng)站,專注于網(wǎng)站建設(shè)十載,網(wǎng)設(shè)計領(lǐng)域的專業(yè)建站公司;建站業(yè)務(wù)涵蓋:銅鼓等地區(qū)。銅鼓做網(wǎng)站價格咨詢:18982081108
max_connections參數(shù),然后重啟數(shù)據(jù)庫。但
是生產(chǎn)服務(wù)器上數(shù)據(jù)庫又不能隨便重啟。
沒辦法,只好想辦法手動去釋放一些沒用的連接。
登陸到MySQL的提示符下,數(shù)據(jù)show processlist這個命令,可以得到所以連接到這個服務(wù)器上的MySQL連接:
mysql> show processlist; +---------+------+---------------------+---------+---------+------+-------+-------------------+-------------------------+ | Id | User | Host | db | Command | Time | State | Info | +---------+------+---------------------+---------+---------+------+-------+-------------------+-------------------------+ | 1180421 | ur |202.103.96.68:49754 | test1 |Sleep | 1 | | NULL | | 1180427 | ur |202.103.96.68:55079 | test2 |Sleep | 1 | | NULL | | 1180429 | ur |202.103.96.68:55187 | testdba | Sleep | 0 | | NULL | | 1180431 | ur |202.103.96.68:55704 | testdba | Sleep | 0 | | NULL | | 1180437 | ur |202.103.96.68:32825 | test1 |Sleep | 1 | | NULL | | 1180469 | ur |202.103.96.68:58073 | testdba | Sleep | 0 | | NULL | | 1180472 | ur |83.136.93.131:47613 | test2 |Sleep | 8 | | NULL | | 1180475 | root | localhost | NULL | Query | 0| NULL | show PROCESSLIST | +---------+------+---------------------+---------+---------+------+-------+-------------------+---------------------------+ 8 rows in set (0.00 sec) mysql>
然后,你可以看到像上面這樣的MySQL數(shù)據(jù)連接列表,而且每一個都會有一個進(jìn)程ID號(在上表的第一列)。我們只要輸入這樣的命令:
mysql> kill 1180421; Query OK, 0 rows affected (0.00 sec) mysql>
其中1180421為你在進(jìn)程列表里找到并且要殺掉的進(jìn)程號。
產(chǎn)生這種問題的原因是:
連接數(shù)超過了MySQL設(shè)置的值,與max_connections和wait_timeout都有關(guān)系。Wait_timeout的值越大,連接的空閑等待就越長,這樣就會造成當(dāng)前連接數(shù)越大。
解決方法:
修改MySQL參數(shù)文件my.cnf,設(shè)置成max_connections=1000,wait_timeout=5,如果沒有此項可以自行添加,修改會重啟MySQL服務(wù)即可,要不經(jīng)常性報此錯誤,則要對服務(wù)器做整體性能優(yōu)化
注:
為了防止發(fā)生too many connections時候無法登錄的問題,mysql manual有如下的說明:
mysqld actually allowsmax_connections+1
clients to connect. The extra connection isreserved for use by accounts that have theSUPER
privilege. By granting theSUPER
privilege to administrators and not tonormal users (who should not need it), an administrator can connect to theserver and useSHOW PROCESSLIST
to diagnose problems even if the maximum number ofunprivileged clients are connected.
因此,必須只賦予root用戶的SUPER權(quán)限,同時所有數(shù)據(jù)庫連接的帳戶不能賦予SUPER權(quán)限。前面說到的報錯后無法登錄就是由于我們的應(yīng)用程序直接配置的root用戶
總結(jié),解決問題的最終方法:
1.修改參數(shù)文件my.cnf,調(diào)整連接參數(shù)
2.檢查程序代碼,對于沒有關(guān)閉的鏈接及時進(jìn)行關(guān)閉