Eu uso a conta root criada na conta 'a'@'%'
. Mas não consigo usar a conta para conectar ao servidor MySQL quando especifico o parâmetro host. Eu posso conectar com sucesso sem o -h
parâmetro. Por favor, veja a transcrição abaixo. Espero que alguém possa me ajudar a explicar. Obrigado.
mysql> grant all on *.* to 'a'@'%' identified by a;
ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'a' at line 1
mysql> grant all on *.* to 'a'@'%' identified by 'a';
Query OK, 0 rows affected (0.00 sec)
mysql> show grants for 'a'@'%';
+-----------------------------------------------------------------------------------------------------------+
| Grants for a@% |
+-----------------------------------------------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'a'@'%' IDENTIFIED BY PASSWORD '*667F407DE7C6AD07358FA38DAED7828A72014B4E' |
+-----------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> exit
Bye
[root@localhost ~]# mysql -h localhost -u a -p
Enter password:
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -h 127.0.0.1 -u a -p
Enter password:
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a -p
Enter password:
ERROR 1045 (28000): Access denied for user 'a'@'localhost' (using password: YES)
[root@localhost ~]# mysql -u a
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 5.5.17 MySQL Community Server (GPL)
Copyright (c) 2000, 2011, Oracle and/or its affiliates. All rights reserved.
Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.
Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.
mysql>
mysql> status
--------------
mysql Ver 14.14 Distrib 5.5.17, for Linux (x86_64) using readline 5.1
Connection id: 20
Current database:
Current user: a@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.5.17 MySQL Community Server (GPL)
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /var/lib/mysql/mysql.sock
Uptime: 15 days 15 hours 20 min 18 sec
Threads: 1 Questions: 40 Slow queries: 0 Opens: 41 Flush tables: 1 Open tables: 4 Queries per second avg: 0.000
--------------
mysql>
Editar:
Sim, o MySQL está escutando na porta 3306.
[root@localhost ~]# nmap localhost
Starting Nmap 4.11 ( http://www.insecure.org/nmap/ ) at 2012-01-18 07:35 CST
Interesting ports on localhost.localdomain (127.0.0.1):
Not shown: 1674 closed ports
PORT STATE SERVICE
22/tcp open ssh
25/tcp open smtp
111/tcp open rpcbind
631/tcp open ipp
840/tcp open unknown
3306/tcp open mysql
Nmap finished: 1 IP address (1 host up) scanned in 0.064 seconds
[root@localhost ~]#
Aqui está um método rápido e sujo para verificar como o MySQL executa uma autenticação bem-sucedida.
Execute esta consulta:
USER() relata como você tentou autenticar no mysqld
CURRENT_USER() relata como você teve permissão para autenticar pelo mysqld
Às vezes,
USER()
eCURRENT_USER()
são diferentes. Isso porque a autenticação mysql segue um protocolo específico.De acordo com o Guia de Estudo de Certificação MySQL 5.0
as páginas 486.487 informam o seguinte sobre o algoritmo de autenticação do mysql:
A partir desta descrição, você não precisa se preocupar com a ordem das tabelas mysql.user, pois há uma cópia na memória das tabelas de concessões que são classificadas conforme mencionado anteriormente.
Com relação a como você fez login, só
mysql -u a
funcionou. Volte e faça login novamente e execute esses comandosCertifique-se de que
Isso é apenas um palpite, mas suspeito
mysql -u a
de conectar via localhost porque quando o protocolo de conexão não é especificado, o padrão é conectar através do arquivo de soquete. Pode existir uma entradamysql.user
que permite conexão anônima de host local.Execute esta consulta:
Se você voltar uma linha sem senha, isso explica totalmente por que
mysq -u a
funciona.ATUALIZAÇÃO 2012-01-19 11:12 EDT
Craig Efrein levantou uma questão interessante: se dois nomes de usuário idênticos existirem na tabela mysql.user, um com senha e outro sem, isso significa que o MySQL nega autenticação quando não está usando uma senha?
Esta pergunta é um excelente aviso sobre a autenticação do usuário do MySQL.
Por favor, note que a chave primária de mysql.user é host,user. Não há outros índices. Isso permite várias ocorrências de um nome de usuário. Cada ocorrência pode ter uma senha diferente ou nenhuma senha. Isso permite que o usuário 'dbuser' faça login localmente (dbuser@localhost) usando nenhuma senha e o mesmo login de usuário de outro servidor dentro de um determinado netblock (dbuser@'10.1.2.20') com uma senha como 'pass1' e esse usuário faça login remotamente de qualquer lugar (dbuser@'%') com uma senha remota como 'pass2'.
Dado o algoritmo de autenticação que o MySQL usa, não há restrições impostas aos usuários com a presença ou ausência de uma senha.
É por isso que o Guia de Estudo de Certificação do MySQL 5.0 diz na página 498 Parágrafo 6 em seus marcadores que mostra como limpar o processo de autenticação:
O curinga do host '%' não corresponde a 'localhost'. Por padrão, o cliente mysql tentará se conectar através de um soquete em vez de tcp (geralmente em algum lugar como /var/lib/mysql/mysql.sock).
Você pode alterar sua concessão para 'a'@'localhost' ou forçar o cliente a operar na pilha TCP como:
Você verificou se o MySQL está realmente ouvindo em 3306? Execute um netstat -tlpn e forneça os resultados. Se você não vir 3306, provavelmente não.
Em my.cnf você deve verificar se --skip-networking está comentado
Como o @atxdba descreveu, para conectar o daemon mysql do remoto que não se conecta via soquete, então você precisa se conectar remotamente via TCP.
Para isso, você deve especificar as
--protocol=TCP
conexões por cada. Embora, você possa configurá-lo nomy.cnf
servidor: