天天看點

MYSQL建立使用者後本地無法登入的原因

[root@mysql01 ~]# mysql -userver -p123456

本地登入失敗;

[root@mysql02 ~]# mysql -h192.168.47.166 -userver -p123456

Welcome to the MySQL monitor.  Commands end with ; or \g.

Your MySQL connection id is 7

Server version: 5.5.36-log Source distribution

遠端登入成功;

一、登入後檢視mysql.user表的情況

MYSQL建立使用者後本地無法登入的原因

可以看到,我的資料庫中有server使用者和匿名使用者localhost;

server使用者的密碼是'server' 匿名使用者的密碼為空

二、在本機用server使用者登入,發現不用密碼可以登入;

[root@mysql01 ~]# mysql -userver -p

Enter password:

Your MySQL connection id is 3

Copyright (c) 2000, 2014, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its

affiliates. Other names may be trademarks of their respective

owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> SELECT USER(), CURRENT_USER();

+--------------------------+-----------------------+

| USER()                     | CURRENT_USER() |

+-------------------------+------------------------+

| server@localhost     | @localhost           |

+-------------------------+-------------------------+

1 row in set (0.00 sec)

登入成功了,使用USER()和CURRENT_USER()兩個函數檢視所使用的使用者。

USER()函數傳回你在用戶端登陸時指定的使用者名和主機名。 CURRENT_USER()函數傳回的是MySQL使用授權表中的哪個使用者來認證你的登入請求。

那麼MySQL是如何進行使用者身份認證呢?

一、當使用者從用戶端請求登陸時,MySQL将授權表中的條目與用戶端所提供的條目進行比較,包括使用者的使用者名,密碼和主機。授權表中的Host字段是可以使用通配符作為模式進行比對的,如test.example.com, %.example.com, %.com和%都可以比對test.example.com這個主機。授權表中的User字段不允許使用模式比對,但是可以有一個空字元的使用者名代表匿名使用者,并且空字元串可以比對所有的使用者名,就像通配符一樣。 當user表中的Host和User有多個值可以比對用戶端提供的主機和使用者名時,MySQL将user表讀入記憶體,并且按照一定規則排序,按照排序規則讀取到的第一個比對用戶端使用者名和主機名的條目對用戶端進行身份驗證。

二、排序規則:對于Host字段,按照比對的精确程度進行排序,越精确的排序越前,例如當比對test.example.com這個主機時, %.example.com比%.com更精确,而test.example.com比%.example.com更精确。對于User字段,非空的字元串使用者名比空字元串比對的使用者名排序更靠前。 User和Host字段都有多個比對值,MySQL使用主機名排序最前的條目,在主機名字段相同時再選取使用者名排序更前的條目。是以,如果User和Host字段都有多個比對值,主機名最精确比對的條目被使用者對使用者進行認證。

了解了這個認證流程,就知道為什麼server登入失敗了。

匿名使用者能夠比對的原因上面說過,空字元串可以比對所有的使用者名,就像通配符一樣。

根據MySQL認證時的排序規則,第一個條目的使用者名排序更前,第二個條目的主機名更精确,排序更前。

解決的方法:删除匿名使用者(僅僅為了安全也有這個必要)

為什麼root使用者不會受影響,而隻有普通使用者不能從本地登入?

+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

以上方法參考Google的搜尋結果,并經過實際的測試和驗證;