Você provavelmente tem um usuário anônimo
''@'localhost'
ou ''@'127.0.0.1'
. Conforme o manual :
Quando várias correspondências são possíveis, o servidor deve determinar qual delas usar. Ele resolve esse problema da seguinte forma:(...)
- Quando um cliente tenta se conectar, o servidor examina as linhas [da tabela mysql.user] em ordem ordenada.
- O servidor usa a primeira linha que corresponde ao nome do host do cliente e ao nome do usuário.
(...) O servidor usa regras de classificação que ordenam as linhas com os valores de Host mais específicos primeiro .Nomes de host literais [como 'localhost'] e os endereços IP são os mais específicos.
Portanto, um usuário anônimo "mascararia" qualquer outro usuário como
'[any_username]'@'%'
ao conectar de localhost
. 'bill'@'localhost'
corresponde a 'bill'@'%'
, mas corresponderia (por exemplo) ''@'localhost'
de antemão. A solução recomendada é descartar esse usuário anônimo (isso geralmente é uma boa coisa a fazer de qualquer maneira).
As edições abaixo são irrelevantes para a pergunta principal. Eles servem apenas para responder a algumas perguntas levantadas em outros comentários neste tópico.
Editar 1
Autenticação como
'bill'@'%'
através de um soquete. [email protected]:/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() | +----------------+----------------+ | [email protected] | [email protected]% | +----------------+----------------+ 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)
Editar 2
Exatamente a mesma configuração, exceto que reativei a rede e agora crio um usuário anônimo
''@'localhost'
. [email protected]:/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 [email protected]:/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) [email protected]:/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) [email protected]:/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)
Editar 3
Mesma situação da edição 2, agora fornecendo a senha do usuário anônimo.
[email protected]:/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() | +----------------+----------------+ | [email protected] | @localhost | +----------------+----------------+ 1 row in set (0.01 sec)
Conclusão 1, da edição 1:Pode-se autenticar como
'bill'@'%'
através de um soquete. Conclusão 2, da edição 2:Se alguém se conecta por meio de TCP ou de um soquete não tem impacto no processo de autenticação (exceto que não se pode conectar como outra pessoa além de
'something'@'localhost'
através de um soquete, obviamente). Conclusão 3, da edição 3:Embora eu tenha especificado
-ubill
, recebi acesso como usuário anônimo. Isso ocorre por causa das "regras de classificação" aconselhadas acima. Observe que na maioria das instalações padrão, uma senha anônima usuário existe
(e deve ser protegido/removido).