標籤:mysql賬戶問題
3台主機web01,web02,web03,做主從,其中有一台怎麼都連不上master。
在主機web02的mysql資料庫中建一賬戶(rep),web01登入失敗,web03可以正常登入。
建立賬戶grant replication slave on *.* to [email protected]‘192.168.190.%‘ identified by ‘rep111‘;
a.在web03中登入成功
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M00/88/58/wKioL1fx-6qivgrQAABWXOPYzR4442.png" title="QQ20161003143238.png" alt="wKioL1fx-6qivgrQAABWXOPYzR4442.png" />
b.在web01中登入失敗
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M01/88/5B/wKiom1fx-_mxJF_GAAAjvuQJ32U168.png" title="QQ20161003143415.png" alt="wKiom1fx-_mxJF_GAAAjvuQJ32U168.png" />
但是,在web01中不使用者密碼可以登入成功。
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M02/88/5C/wKiom1fx_ISDMrrBAABM8bd_dPc862.png" title="QQ20161003143600.png" alt="wKiom1fx_ISDMrrBAABM8bd_dPc862.png" />
查閱文檔得知可以使用USER()和CURRENT_USER()兩個函數查看所使用的使用者
USER()函數返回你在用戶端登陸時指定的使用者名稱和主機名稱。
CURRENT_USER()函數返回的是MySQL使用授權表中的哪個使用者來認證你的登入請求。
那就分別在web01和web03登入後查看。
web01
650) this.width=650;" src="http://s1.51cto.com/wyfs02/M01/88/5C/wKiom1fx_sHiFIjkAAAXm3-_gB0885.png" title="QQ20161003144151.png" alt="wKiom1fx_sHiFIjkAAAXm3-_gB0885.png" />
web03
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/88/58/wKioL1fx_ougl5ZOAAAamKjifOA514.png" title="QQ20161003144306.png" alt="wKioL1fx_ougl5ZOAAAamKjifOA514.png" />
通過以上兩張圖可以知道。web01是通過空賬戶登入的,這也就解釋了為什麼不用密碼可以登入,但為什麼用了密碼反而不能登入呢??
二、這可能就要瞭解MySQL是如何進行使用者身份認證的。
a、當使用者從用戶端請求登陸時,MySQL將授權表中的條目與用戶端所提供的條目進行比較,包括使用者的使用者名稱,密碼和主機。授權表中的Host欄位是可以使用萬用字元作為模式進行匹配的,如test.example.com, %.example.com, %.com和%都可以匹配test.example.com這個主機。授權表中的User欄位不允許使用模式比對,但是可以有一個Null 字元的使用者名稱代表匿名使用者,並且Null 字元串可以匹配所有的使用者名稱,就像萬用字元一樣。 當user表中的Host和User有多個值可以匹配用戶端提供的主機和使用者名稱時,MySQL將user表讀入記憶體,並且按照一定規則排序,按照定序讀取到的第一個匹配用戶端使用者名稱和主機名稱的條目對用戶端進行身分識別驗證。
b、定序:對於Host欄位,按照匹配的精確程度進行排序,越精確的排序越前,例如當匹配test.example.com這個主機時, %.example.com比%.com更精確,而test.example.com比%.example.com更精確。對於User欄位,非空的字串使用者名稱比Null 字元串匹配的使用者名稱排序更靠前。 User和Host欄位都有多個匹配值,MySQL使用主機名稱排序最前的條目,在主機名稱欄位相同時再選取使用者名稱排序更前的條目。因此,如果User和Host欄位都有多個匹配值,主機名稱最精確匹配的條目被使用者對使用者進行認證。
那我們來看一下web02上面的主機,賬戶,資訊。
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M00/88/5C/wKiom1fyAiLzYLsaAAB3KFTKo6A715.png" title="QQ20161003145626.png" alt="wKiom1fyAiLzYLsaAAB3KFTKo6A715.png" />
通過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;
650) this.width=650;" src="http://s3.51cto.com/wyfs02/M02/88/58/wKioL1fyBaHA1yxvAABwdVmz2fE602.png" title="QQ20161003151528.png" alt="wKioL1fyBaHA1yxvAABwdVmz2fE602.png" />
有人可以要問為什麼root好像沒有這種情況,那是因為
因為mysql_install_db指令碼會在授權表中產生‘root‘@‘localhost‘這個賬戶。同樣的,使用root登入MySQL 時,‘root‘@‘localhost‘和‘‘@‘localhost‘都能匹配登入的賬戶,但是根據定序,主機名稱相同,而使用者名稱非Null 字元串優先,因此‘root‘@‘localhost‘這個條目的排序更靠前。使用root本地登入是不會被匿名使用者遮蓋。也許還有人要問你在web02中為什麼會有web01的匿名賬戶呢,後來仔細想了想,原來web02是由web01虛機機複製過來的。
本文出自 “59090939” 部落格,請務必保留此出處http://59090939.blog.51cto.com/6338052/1858567
Mysql賬戶問題