Prawdopodobnie masz anonimowego użytkownika ''@'localhost' lub ''@'127.0.0.1' .
Zgodnie z instrukcją :
Gdy możliwe jest wiele dopasowań, serwer musi określić, którego z nich użyć. Rozwiązuje ten problem w następujący sposób:(...)
- Kiedy klient próbuje się połączyć, serwer przegląda wiersze [tabeli mysql.user] w posortowanej kolejności.
- Serwer używa pierwszego wiersza, który odpowiada nazwie hosta klienta i nazwie użytkownika.
(...)Serwer używa reguł sortowania, które porządkują wiersze z najbardziej szczegółowymi wartościami hosta na początku .Dosłowne nazwy hostów [takie jak „localhost”] a adresy IP są najbardziej szczegółowe.
Dlatego taki anonimowy użytkownik „zamaskowałby” każdego innego użytkownika, takiego jak '[any_username]'@'%' podczas łączenia z localhost .
'bill'@'localhost' pasuje do 'bill'@'%' , ale pasowałby (np.) ''@'localhost' wcześniej.
Zalecanym rozwiązaniem jest usunięcie tego anonimowego użytkownika (i tak zwykle jest to dobre rozwiązanie).
Poniższe zmiany są w większości nieistotne dla głównego pytania. Mają one na celu tylko udzielenie odpowiedzi na niektóre pytania zadane w innych komentarzach w tym wątku.
Edytuj 1
Uwierzytelnianie jako 'bill'@'%' przez gniazdo.
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket=/tmp/mysql-5.5.sock
Welcome to the MySQL monitor (...)
mysql> SELECT user, host FROM mysql.user;
+------+-----------+
| user | host |
+------+-----------+
| bill | % |
| root | 127.0.0.1 |
| root | ::1 |
| root | localhost |
+------+-----------+
4 rows in set (0.00 sec)
mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| example@sqldat.com | example@sqldat.com% |
+----------------+----------------+
1 row in set (0.02 sec)
mysql> SHOW VARIABLES LIKE 'skip_networking';
+-----------------+-------+
| Variable_name | Value |
+-----------------+-------+
| skip_networking | ON |
+-----------------+-------+
1 row in set (0.00 sec)
Edytuj 2
Dokładnie taka sama konfiguracja, z wyjątkiem tego, że ponownie aktywowałem sieć i teraz tworzę anonimowego użytkownika ''@'localhost' .
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Welcome to the MySQL monitor (...)
mysql> CREATE USER ''@'localhost' IDENTIFIED BY 'anotherpass';
Query OK, 0 rows affected (0.00 sec)
mysql> Bye
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket=/tmp/mysql-5.5.sock
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol=TCP
ERROR 1045 (28000): Access denied for user 'bill'@'localhost' (using password: YES)
Edytuj 3
Taka sama sytuacja jak w edycji 2, teraz z podaniem hasła anonimowego użytkownika.
example@sqldat.com:/home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Welcome to the MySQL monitor (...)
mysql> SELECT USER(), CURRENT_USER();
+----------------+----------------+
| USER() | CURRENT_USER() |
+----------------+----------------+
| example@sqldat.com | @localhost |
+----------------+----------------+
1 row in set (0.01 sec)
Wniosek 1, z edycji 1:Można uwierzytelnić się jako 'bill'@'%' przez gniazdo.
Wniosek 2, z edycji 2:To, czy ktoś łączy się przez TCP, czy przez gniazdo, nie ma wpływu na proces uwierzytelniania (poza tym, że nie można połączyć się jako ktokolwiek inny niż 'something'@'localhost' oczywiście przez gniazdo).
Wniosek 3, z edycji 3:Chociaż podałem -ubill , przyznano mi dostęp jako anonimowy użytkownik. Wynika to z zalecanych powyżej „reguł sortowania”. Zauważ, że w większości domyślnych instalacji bez hasła, anonimowe użytkownik istnieje
(i powinny być zabezpieczone/usunięte).