3台主機web01,web02,web03,做主從,其中有一台怎麼都連不上master。
在主機web02的mysql資料庫中建一賬戶(rep),web01登入失敗,web03可以正常登入。
建立賬戶grant replication slave on *.* to rep@'192.168.190.%' identified by 'rep111';
a.在web03中登入成功
![](https://img.laitimes.com/img/_0nNw4CM6IyYiwiM6ICdiwiIn5GcuIDN0QjU6lFUPh1VCFUQRJ3Z2lWc20CemFDTvl2S39CX4UzLchDOvwFMw00LcJDMzZWe39CXvwVbvNmLvR3YxUjL0M3Lc9CX6MHc0RHaiojIsJye.png)
b.在web01中登入失敗
但是,在web01中不使用者密碼可以登入成功。
查閱文檔得知可以使用USER()和CURRENT_USER()兩個函數檢視所使用的使用者
USER()函數傳回你在用戶端登陸時指定的使用者名和主機名。
CURRENT_USER()函數傳回的是MySQL使用授權表中的哪個使用者來認證你的登入請求。
那就分别在web01和web03登入後檢視。
web01
web03
通過以上兩張圖可以知道。web01是通過空賬戶登入的,這也就解釋了為什麼不用密碼可以登入,但為什麼用了密碼反而不能登入呢??
二、這可能就要了解MySQL是如何進行使用者身份認證的。
a、當使用者從用戶端請求登陸時,MySQL将授權表中的條目與用戶端所提供的條目進行比較,包括使用者的使用者名,密碼和主機。授權表中的Host字段是可以使用通配符作為模式進行比對的,如test.example.com, %.example.com, %.com和%都可以比對test.example.com這個主機。授權表中的User字段不允許使用模式比對,但是可以有一個空字元的使用者名代表匿名使用者,并且空字元串可以比對所有的使用者名,就像通配符一樣。 當user表中的Host和User有多個值可以比對用戶端提供的主機和使用者名時,MySQL将user表讀入記憶體,并且按照一定規則排序,按照排序規則讀取到的第一個比對用戶端使用者名和主機名的條目對用戶端進行身份驗證。
b、排序規則:對于Host字段,按照比對的精确程度進行排序,越精确的排序越前,例如當比對test.example.com這個主機時, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。對于User字段,非空的字元串使用者名比空字元串比對的使用者名排序更靠前。 User和Host字段都有多個比對值,MySQL使用主機名排序最前的條目,在主機名字段相同時再選取使用者名排序更前的條目。是以,如果User和Host字段都有多個比對值,主機名最精确比對的條目被使用者對使用者進行認證。
那我們來看一下web02上面的主機,賬戶,資訊。
通過MySQL使用者身份認證的規則,我們得出,web01登入采用的是第1條規則,而不知道我們自認為的第2條。這也同樣解釋了為什麼不用密碼就可以登入成功的道理了。
三、解決的方法:删除匿名使用者
1、使用root權限登入
2、mysql> select host,user,password from mysql.user;
3、mysql> delete from mysql.user where user='';
4、mysql> flush privileges;