在服務器上命令行登錄,mysql -uroot -upassword,把密碼寫到命令行裡,不用每次再輸入,按ctrl+p 然後回車,嘗試N次,終於登錄進去了;連接數過多,終究還是可以找到空子進去的。趕快查看並保留運行狀態的重要參數:
代碼如下 復制代碼show variables;
show status;
show processlist;
好家伙,這麼多連接:
| 10520 | unauthenticated user | 192.168.0.109:41063 | NULL | Connect | NULL | login | NULL |
| 10521 | unauthenticated user | 192.168.0.109:41065 | NULL | Connect | NULL | login | NULL |
| 10522 | unauthenticated user | 192.168.0.109:41067 | NULL | Connect | NULL | login | NULL |
| 10523 | unauthenticated user | 192.168.0.109:41068 | NULL | Connect | NULL | login | NULL |
| 10524 | unauthenticated user | 192.168.0.109:41069 | NULL | Connect | NULL | login | NULL |
| 10525 | unauthenticated user | 192.168.0.109:41070 | NULL | Connect | NULL | login | NULL |
| 10526 | unauthenticated user | 192.168.0.109:41071 | NULL | Connect | NULL | login | NULL |
如些上千行。先不管,這裡肯定是問題突破口。
set global max_connections=4000;
增加允許的最大連接數,先讓前台網站可以正常工作。
回過頭google :mysql unauthenticated user
果然,遇到此類問題的人很多,問題在於mysql的反向ip地址解析,配置參數裡加上skip-name-resolve就可以。
補充
一、查看進程運行情況(會話1)
二、構造表被鎖現象
1)鎖住表(會話1)
2)執行dml操作(會話2)
代碼如下 復制代碼 mysql>delete from chf.disc02 limit 1;–會話處於卡死狀態3)查詢進程運行情況(會話1)
代碼如下 復制代碼 mysql> select id,user,host,db,command,time,state from processlist a;4 rows in set (0.01 sec)
說明:發現進程id為41的進程狀態為Locked
三、解鎖操作
1)刪掉被鎖進程(會話1)
出現現象(會話2)
ERROR 2013 (HY000): Lost connection to MySQL server during query
2)查看進程(會話1)
四、批量解鎖
代碼如下 復制代碼 mysql> select concat(‘kill ‘,id,’;') kill_process from processlist a where a.state=’Locked’;Note:
1)可以使用show processlist查看當前用戶連接
如果是root帳號,你能看到所有用戶的當前連接。如果是其它普通帳號,只能看到自己占用的連接。show processlist;只列出前100條,如果想全列出請使用show full processlist;
2)在構造鎖的會話中,使用unlock tables;也可以解鎖
總結一下原因,大概如下:
因為mysql默認會根據客戶端的ip地址反向解析,用於用戶登錄授權之用。不過正常情況下,很少會有人這樣用。ip地址反向解析是很慢的,尤其是高負荷的mysql,每秒種幾百次甚至更高的請求,這個請求壓到本地的dns服務器上,dns服務器說不定會懷疑你在惡意請求,然後不理你了,然後這些登錄請求就掛在那裡,後面的連接還持續,然後越積越多,然後就達到mysql的最大連接數據限制了,然後新的連接就直接被拒,得到連接數過多的消息。
因為mysql配置文件使用的之前的配置文件,當時跟web同服務器,所以不存在這個問題。
這也正好解釋了為什麼phpMyAdmin裡看mysqld狀態時,有很多失敗的連接,它們應該就是因反解析失敗而被拒的。