關於Mysql權限表的使用小結
前幾天遇到一個問題。
我的msql權限表(mysql.user)的內容是這樣的:
www.2cto.com
Localhsot User Password
% root *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
bogon root *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
localhost xxw
::1 root *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
localhost
bogon
然後,我從localhost登陸這個服務器
> mysql -u root -p
密碼輸入正確,但是提示:
www.2cto.com
ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES).
經過查詢官方文檔,原來和權限表的存儲規則和排序規則有關系:
存儲規則:如果User字段不為空,必須嚴格匹配;如果User字段存儲的值為空值,匹配所有用戶。同時,連接信息中,如果沒有指定user,或者-u後面是空值,系統會認為是某一用戶不提供用戶名來訪問,所以可以匹配所有用戶名;
排序規則:權限表被讀入內存的時候,按照限制的范圍大小來排序,限制越詳細的排在前面。首先按照Host字段排序,如果Host相同,就按照User字段排序。所以,如果有連接信息輸入的時候,是按照讀入內存的順序匹配的,而不是按照數據庫裡的規則匹配。
回頭看上面的例子,讀入內存後,權限表排序如下:
localhost xxw
localhost www.2cto.com
bogon root *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
bogon
::1 root *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
% root *81F5E21E35407D884A6CD4A731AEBFB6AF209E1B
按照以上規則,匹配到了第二條。本條規則的密碼為空,但是我輸入了最後一條存儲的密碼,所以登錄失敗。
但是Mysql的提示確實有誤導性,使用戶認為是匹配到了最後一條.