3 回答

TA貢獻1828條經驗 獲得超3個贊
您可能有一個匿名用戶''@'localhost'
或''@'127.0.0.1'
。
根據手冊:
當可能存在多個匹配項時,服務器必須確定要使用哪些匹配項。它解決了這個問題如下:(...)
當客戶端嘗試連接時,服務器按排序順序查看[表mysql.user]的行。
服務器使用與客戶端主機名和用戶名匹配的第一行。
(...)服務器使用排序規則,首先對具有最特定主機值的行進行排序。文字主機名[例如“localhost”]和IP地址是最具體的。
因此,這樣的匿名用戶將“屏蔽”任何其他用戶,就像'[any_username]'@'%'
連接時一樣localhost
。
'bill'@'localhost'
匹配'bill'@'%'
,但會匹配(例如)''@'localhost'
beforehands。
推薦的解決方案是刪除這個匿名用戶(這通常是一件好事)。
以下編輯主要與主要問題無關。這些僅用于回答本主題中其他評論中提出的一些問題。
編輯1
'bill'@'%'
通過套接字進行身份驗證。
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
歡迎使用MySQL監視器(...)
mysql> SELECT用戶,主機FROM mysql.user;
+ ------ + ----------- +
| 用戶| 主持人|
+ ------ + ----------- +
| 賬單| %|
| 根| 127.0.0.1 |
| 根| :: 1 |
| 根| localhost |
+ ------ + ----------- +
4行(0.00秒)
mysql> SELECT USER(),CURRENT_USER();
+ ---------------- + ---------------- +
| USER()| CURRENT_USER()|
+ ---------------- + ---------------- +
| bill @ localhost | 賬單@%|
+ ---------------- + ---------------- +
1排(0.02秒)
mysql> SHOW VARIABLES LIKE'skip_networking';
+ ----------------- + ------- +
| Variable_name | 價值|
+ ----------------- + ------- +
| skip_networking | ON |
+ ----------------- + ------- +
1排(0.00秒)
編輯2
完全相同的設置,除了我重新激活網絡,我現在創建一個匿名用戶''@'localhost'。
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
歡迎使用MySQL監視器(...)
mysql> CREATE USER''@'localhost'通過'anotherpass'識別;
查詢正常,0行受影響(0.00秒)
mysql>再見
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket = / TMP / MySQL的-5.5.sock
ERROR 1045(28000):用戶'賬單'@'localhost'拒絕訪問(使用密碼:YES)
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol = TCP
ERROR 1045(28000):用戶'賬單'@'localhost'拒絕訪問(使用密碼:YES)
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol = TCP
ERROR 1045(28000):用戶'賬單'@'localhost'拒絕訪問(使用密碼:YES)
編輯3
與編輯2中的情況相同,現在提供匿名用戶的密碼。
root @ myhost:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
歡迎使用MySQL監視器(...)
mysql> SELECT USER(),CURRENT_USER();
+ ---------------- + ---------------- +
| USER()| CURRENT_USER()|
+ ---------------- + ---------------- +
| bill @ localhost | @localhost |
+ ---------------- + ---------------- +
1排(0.01秒)
結論1,來自編輯1:可以'bill'@'%'通過套接字進行身份驗證。
結論2,從編輯2:無論是通過TCP連接還是通過套接字連接都不會對身份驗證過程產生影響(除了一個人不能像其他人一樣連接,但'something'@'localhost'
通過套接字,顯然)。
結論3,來自編輯3:雖然我指定了-ubill
,但我被授予了匿名用戶的訪問權限。這是因為上面提到的“排序規則”。請注意,在大多數默認安裝中,存在無密碼的匿名用戶(應該保護/刪除)。

TA貢獻1876條經驗 獲得超6個贊
嘗試:
~$ mysql -u root -p Enter Password:mysql> grant all privileges on *.* to bill@localhost identified by 'pass' with grant option;
添加回答
舉報