Eu uso a conta raiz criou a conta 'a'@'%'
. Mas não posso usar a conta para conectar-me 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 isso. 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 ~]#
mysql
authentication
Apenas um aprendiz
fonte
fonte
'a'@'%'
. então, o primeiro registro foi'a'@'%'
e o segundo é'a'@'localhost'
.Respostas:
Aqui está um método rápido e sujo para verificar como o MySQL executa uma autenticação bem-sucedida.
Por favor, execute esta consulta:
USER () relata como você tentou se autenticar no mysqld
CURRENT_USER () relata como você foi autorizado a se autenticar pelo mysqld
Às vezes,
USER()
eCURRENT_USER()
são diferentes. Isso ocorre porque a autenticação mysql segue um protocolo específico.De acordo com o Guia de Estudo de Certificação do MySQL 5.0
as páginas 486.487 afirmam o seguinte no algoritmo de autenticação do mysql:
Nesta descrição, você não precisa se preocupar com a ordem das tabelas mysql.user, pois há uma cópia em memória das tabelas de concessão, que é classificada como mencionado anteriormente.
No que diz respeito à forma como você fez login, apenas
mysql -u a
funcionou. Volte e faça o login novamente e execute estes comandosCertifique-se de que
Isso é apenas um palpite, mas suspeito
mysql -u a
de conectar-se via localhost porque, quando o protocolo de conexão não é especificado, o padrão é conectar-se através do arquivo de soquete. Pode existir uma entradamysql.user
que permita a conexão localhost anônima.Execute esta consulta:
Se você voltar uma linha sem senha, isso explica completamente por que
mysq -u a
funciona.UPDATE 2012-01-19 11:12 EDT
Craig Efrein levantou uma questão interessante: se existem dois nomes de usuário idênticos 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 alerta sobre a autenticação do usuário MySQL.
Por favor note que a chave primária do mysql.user é host, usuário. 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' efetue login localmente (dbuser @ localhost) usando nenhuma senha e o mesmo login de usuário de outro servidor em um determinado netblock (dbuser@'10.1.2.20 ') com uma senha como' pass1 'e que o usuário efetue login remotamente de qualquer lugar (dbuser @ '%') com uma senha remota como 'pass2'.
Dado o algoritmo de autenticação usado pelo MySQL, 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 no Parágrafo 610 em seus marcadores que mostra como limpar o processo de autenticação:
fonte
O curinga do host '%' não corresponde ao 'localhost'. Por padrão, o cliente mysql tentará conectar-se 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 sobre a pilha TCP como:
fonte
my.cnf
para não precisar mais desse parâmetro?Você verificou se o MySQL está realmente ouvindo o 3306? Execute um netstat -tlpn e forneça os resultados. Se você não vê 3306, provavelmente não.
No my.cnf, você deve verificar se --skip-networking está comentado
fonte
Como o @atxdba descreveu, Para conectar o daemon mysql a partir do controle remoto que não se conecta via soquete, é necessário se conectar a partir do controle remoto via TCP.
Para isso, você deve especificar o
--protocol=TCP
por cada conexão. Embora você possa configurá-lo nomy.cnf
servidor:fonte