Pravděpodobně máte anonymního uživatele ''@'localhost' nebo ''@'127.0.0.1' .
Podle příručky :
Je-li možné více shod, musí server určit, kterou z nich použít. Tento problém řeší následovně:(...)
- Když se klient pokusí připojit, server prohlédne řádky [tabulky mysql.user] v seřazeném pořadí.
- Server používá první řádek, který odpovídá názvu hostitele klienta a uživatelskému jménu.
(...)Server používá pravidla řazení, která řadí řádky nejprve podle nejkonkrétnějších hodnot hostitele .Doslovné názvy hostitelů [jako 'localhost'] a IP adresy jsou nejkonkrétnější.
Takový anonymní uživatel by tedy „zamaskoval“ jakéhokoli jiného uživatele, jako je '[any_username]'@'%' při připojování z localhost .
'bill'@'localhost' odpovídá 'bill'@'%' , ale odpovídal by (např.) ''@'localhost' předem.
Doporučeným řešením je zahodit tohoto anonymního uživatele (to je obvykle dobré udělat tak jako tak).
Níže uvedené úpravy se většinou netýkají hlavní otázky. Tyto jsou určeny pouze k zodpovězení některých otázek vznesených v jiných komentářích v tomto vláknu.
Úprava 1
Ověřování jako 'bill'@'%' prostřednictvím zásuvky.
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)
Úprava 2
Úplně stejné nastavení, až na to, že jsem znovu aktivoval síť a nyní vytvářím anonymního uživatele ''@'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)
Úprava 3
Stejná situace jako v úpravě 2, nyní poskytujeme heslo anonymního uživatele.
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)
Závěr 1 z úpravy 1:Lze se ověřit jako 'bill'@'%' prostřednictvím zásuvky.
Závěr 2 z úpravy 2:To, zda se člověk připojuje přes TCP nebo přes soket, nemá žádný vliv na proces ověřování (kromě toho, že se nelze připojit jako kdokoli jiný než 'something'@'localhost' přes zásuvku, samozřejmě).
Závěr 3 z úpravy 3:Ačkoli jsem zadal -ubill , byl mi udělen přístup jako anonymní uživatel. Důvodem jsou výše uvedená „pravidla řazení“. Všimněte si, že ve většině výchozích instalací bez hesla, anonymní uživatel existuje
(a měl by být zajištěn/odebrán).