Access denied for user 'root'@'localhost' (using password: NO)

能否通過進入數據庫的DOS界面,或者能操作mysql數據庫(數據庫名是mysql).
如果能,那就在mysql庫下中的user表中插入一條權限記錄。

mysql>SELECT host, user, password FROM user WHERE user != 'root';
+-----------+---------+-------------------------------------------+
| HOST      | USER    | PASSWORD                                  |
+-----------+---------+-------------------------------------------+
| localhost |         | *A4B6157319038724E3560894F7F932C8886EBFCF |
| %         | crawler | *00A51F3F48415C7D4E8908980D443C29C69B60C9|
+-----------+---------+-------------------------------------------+

1,HOST字段中通配符'%'匹配所有主機,如果HOST字段爲空,等價於'%'
2,USER字段不支持通配符,但空白的USER字段匹配所有用戶
3,服務器在user表中讀取權限時,優先匹配最能確定具體主機的紀錄,由於'%'匹配所有主機,所以localhost優先於'%'
4,有相同HOST值的記錄,優先匹配具體user值的記錄。

在上面的示例中,mysql未使用-h選項時,連接本地UNIX套接字(使用-h選項時,連接的是TCP/IP套接字,也就是IP加端口),HOST匹配localhost:
由於用戶crawler在user表中,沒有host值爲localhost的記錄,所以優先匹配記錄爲"所有從localhost登錄的用戶"在本例中
AnyUser@localhost優先級高於crawler@%,故使用crawler@%的密碼在本機無法登錄。

當使用'mysql -u crawler -pXXX DBNAME -h 10.10.10.11'時,匹配crawler@%,密碼有效。

細心的兄弟可能已經注意到了:

127.0.0.1和localhost是同一臺機器,爲什麼'mysql -u crawler -pXXX DBNAME -h 127.0.0.1'卻可以成功登錄呢?

更細心的兄弟可能已經猜到答案了:

我啓動mysqld時使用了'--skip-name-resolve'參數,此種情況下由於不做域名解析,127.0.0.1和localhost對mysql數據庫來講,是不同的主機,與AnyUser@localhost並不匹配。(所以一般使用'--skip-name-resolve'參數啓動mysql數據庫時,HOST字段一般使用IP地址)

問題的原因已經找到,要解決這個問題,下面三種方法選一種即可:
1、將AnyUser@localhost記錄刪除
2、添加一條crawler@localhost記錄
3、使用時-h選項指定主機
發佈了4 篇原創文章 · 獲贊 6 · 訪問量 6萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章