登陸到mysql,查看進程的資訊
複製代碼 代碼如下:show processlist;
發現大量的進程的狀態為 login
原來預設的時候mysql啟動時是不使用 skip-name-resolve選項的,這樣的話,從其它主機的串連會比較慢,因為mysql會對這個ip做dns反向查詢,導致大量的串連處於 login狀態....
.
解決這個問題有兩個辦法
一是加入 skip-name-resolve參數重啟mysql
二是在 /etc/hosts中加入一句 192.168.0.2 server2 其中 192.168.0.2是新加的伺服器的內網ip,server2是新伺服器的主機名稱
在mysql用戶端登陸mysql伺服器的登入速度太慢的解決方案一篇文章中,我介紹了如何通過在my.ini檔案(linux下是my.cnf檔案)中添加"SKIP-NAME-RESOLVE"的參數設定,使得用戶端在登入伺服器的時候不通過主機解析這一關,直接登陸的方法,以此來提高登入速度。
這裡要介紹一下這種方法的負面作用,以及不合理的時機使用這種方法會引發的不可發現的錯誤。
首先,回顧一下在my.ini檔案中添加"SKIP-NAME-RESOLVE"參數來提高訪問速度的原理:
在沒有設定該參數的時候,用戶端在登陸請求發出後,伺服器要解析要求者是誰,經過解析,發現登入者是從另外的電腦登入的,也就是說不是伺服器本機,那麼,伺服器會到mysql.user表中去尋找是否有這個使用者,假設伺服器IP是192.168.0.1,而客戶機的IP是192.168.0.2;那麼查詢的順序是先找'root'@'192.168.0.2'這個user是否存在,若存在,則匹配這個使用者登陸,並載入許可權列表。若沒有該使用者,則尋找'root'@'%'這個使用者是否存在,若存在,則載入許可權列表。否則,登入失敗。
在設定了SKIP-NAME-RESOLVE參數後,用戶端的登入請求的解析式同上面一樣的,但是在伺服器原生解析過程卻發生了改變:伺服器會把在本機登入的使用者自動解析為'root'@'127.0.0.1';而不是'root'@'localhost';這樣一來就壞了,因為我們在伺服器上登入是為了進行一些維護操作,但是顯然,'root'@'127.0.0.1'這個使用者是被預設為'root'@'%'這個使用者的,這個使用者還沒有足夠得許可權去執行一些超級管理員'root'@'localhost'才能執行的大作。因為未分配許可權。
所以結論是:加入你在伺服器本機上登入mysql伺服器的話,要麼先取消SKIP-NAME-RESOLVE的參數設定,重新啟動伺服器再登陸,設定完成後,再設定上該參數;要麼就給'root'@'127.0.0.1'分配超級管理員權限,但這麼做顯然是不明智的,因為任何人在任何機器上都可以用這個使用者執行管理員操作,前提是知道了密碼。
我有一次在mysql伺服器上執行資料庫建立指令碼,並同時建立表、觸發器、預存程序等。結果,總是失敗,經過了一上午的折騰,最後發現時這個參數造成我以'root'@'127.0.0.1'這個使用者登陸了伺服器,這個使用者沒有建立觸發器的許可權。後來,取消了SKIP-NAME-RESOLVE參數後,執行成功,再把該參數設定回去。重啟。OK。
所以,在設定這個參數的時候一定要注意時機:先用超級管理員將所有的使用者建立好,再將許可權分配好之後,才設定這個參數生效。