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. Resolve esse problema da seguinte forma: (...)
- Quando um cliente tenta se conectar, o servidor examina as linhas [da tabela mysql.user] na ordem classificada.
- O servidor usa a primeira linha que corresponde ao nome do host e ao nome do usuário do cliente.
(...) O servidor usa regras de classificação que ordenam linhas com os valores de host mais específicos primeiro . Nomes de host literais [como 'localhost'] e endereços IP são os mais específicos.
Portanto, esse usuário anônimo "mascararia" qualquer outro usuário '[any_username]'@'%'
ao se conectar localhost
.
'bill'@'localhost'
corresponde 'bill'@'%'
, mas corresponderia (por exemplo) de ''@'localhost'
antemão.
A solução recomendada é descartar esse usuário anônimo (isso geralmente é uma boa coisa a se fazer).
As edições abaixo são principalmente irrelevantes para a questão principal. Estes destinam-se apenas a responder a algumas questões levantadas em outros comentários neste tópico.
Editar 1
Autenticando como 'bill'@'%'
através de um soquete.
Você pode usar o seguinte comando: root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass --socket = / tmp / mysql-5.5.sock
Bem-vindo ao monitor MySQL (...)
mysql> SELECT usuário, host FROM mysql.user;
+ ------ + ----------- +
| usuário | host |
+ ------ + ----------- +
| fatura | % |
| raiz | 127.0.0.1
| raiz | :: 1 |
| raiz | localhost |
+ ------ + ----------- +
4 linhas em conjunto (0,00 s)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| USUÁRIO () | CURRENT_USER () |
+ ---------------- + ---------------- +
| bill @ localhost | fatura @% |
+ ---------------- + ---------------- +
1 linha no conjunto (0,02 s)
mysql> MOSTRA VARIÁVEIS COMO 'skip_networking';
+ ----------------- + ------- +
| Nome da variável | Valor
+ ----------------- + ------- +
| skip_networking | ON |
+ ----------------- + ------- +
1 linha no conjunto (0,00 s)
Editar 2
Exatamente a mesma configuração, exceto que eu reativei a rede e agora crio um usuário anônimo ''@'localhost'
.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql
Bem-vindo ao monitor MySQL (...)
mysql> CREATE USER '' @ 'localhost' IDENTIFICADO POR 'anotherpass';
Consulta OK, 0 linhas afetadas (0,00 s)
mysql> Tchau
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
--socket = / tmp / mysql-5.5.sock
ERRO 1045 (28000): acesso negado para o usuário 'bill' @ 'localhost' (usando a senha: YES)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-h127.0.0.1 --protocol = TCP
ERRO 1045 (28000): acesso negado para o usuário 'bill' @ 'localhost' (usando a senha: YES)
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -ppass \
-hlocalhost --protocol = TCP
ERRO 1045 (28000): acesso negado para o usuário 'bill' @ 'localhost' (usando a senha: YES)
Editar 3
A mesma situação da edição 2, agora fornecendo a senha do usuário anônimo.
root @ myhost: /home/mysql-5.5.16-linux2.6-x86_64# ./mysql -ubill -panotherpass -hlocalhost
Bem-vindo ao monitor MySQL (...)
mysql> SELECT USER (), CURRENT_USER ();
+ ---------------- + ---------------- +
| USUÁRIO () | CURRENT_USER () |
+ ---------------- + ---------------- +
| bill @ localhost | @localhost |
+ ---------------- + ---------------- +
1 linha no conjunto (0,01 s)
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 através de TCP ou através de um soquete não tem impacto no processo de autenticação (exceto que um não pode se conectar como qualquer outra pessoa, mas '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 devido às "regras de classificação" recomendadas acima. Observe que na maioria das instalações padrão, existe um usuário anônimo sem senha (e deve ser protegido / removido).
FLUSH PRIVILEGES
?