昨天一臺服務(wù)器上出現(xiàn)了一個奇怪的問題,正常訪問的時候MySQL出現(xiàn) "error 1040, too many connection" 錯誤提示,造成這個原因通常是max_connections設(shè)置的太小或者wait_timeout的值設(shè)置的太長造成連接超時時間太長,所以首先想到的是使用mysqladmin查看max_connections的值為多少.
產(chǎn)生這種問題的原因是:
連接數(shù)超過了 MySQL 設(shè)置的值,與 max_connections 和 wait_timeout 都有關(guān)系,wait_timeout 的值越大,連接的空閑等待就越長,這樣就會造成當(dāng)前連接數(shù)越大.
解決方法:
1.[root@localhost bin]$ ./mysqladmin -uroot -p variables | grep "max_conn"
輸入數(shù)據(jù)庫的密碼之后就可以看到max_connections的值,如果太小的話(默認(rèn)為100)需要將該值設(shè)置的大一些,如果MySQL不允許中斷的話可以登錄MySQL之后,然后設(shè)置當(dāng)前max_connections的值,代碼如下:
[root@localhost bin]$ ./mysql -uroot -p //Vevb.com
mysql> set GLOBAL max_connections=1024;
這里還需要注意的是Linux下如果系統(tǒng)的max user processes低于max_connections的值會出現(xiàn)“Can't create a new thread (errno 11); ”錯誤,解決方法可以參考MySQL出現(xiàn)Can't create a new thread (errno 11); 的解決辦法,上面的設(shè)置只是在當(dāng)前運(yùn)行的狀態(tài)下有效,如果mysql重啟之后設(shè)置失效了,所以終極的方法是修改mysql的配置文件my.cnf,然后在[mysqld]下面設(shè)置max_connections的值.
但是奇怪的是這樣設(shè)置之后還是依然出現(xiàn)那個錯誤,于是登錄mysql之后使用 show processlist; 命令查看連接,然后使用kill命令刪除了一些Sleep狀態(tài)的連接,但是過一會兒又會出現(xiàn)too many connection的錯誤提示,另外我還注意到一個現(xiàn)象,就是MySQL啟動或重啟的時候時間特別長,數(shù)據(jù)庫大概有2G左右的數(shù)據(jù),但是也不至于啟動這么慢吧?后來想到是不是數(shù)據(jù)庫文件有問題,于是又使用了修復(fù)命令對每個表進(jìn)行了修復(fù),但是過一兩個小時之后還是會出現(xiàn)上面的錯誤.
新聞熱點
疑難解答
圖片精選