Yo uso la cuenta raíz creó la cuenta 'a'@'%'
. Pero no puedo usar la cuenta para conectarme al servidor MySQL cuando especifico el parámetro del host. Puedo conectarme exitosamente sin el -h
parámetro. Por favor, vea la transcripción a continuación. Espero que alguien pueda ayudarme a explicarlo. Gracias.
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:
Sí, MySQL está escuchando en el puerto 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
Solo un alumno
fuente
fuente
'a'@'%'
. entonces, el primer registro fue'a'@'%'
, y el segundo es'a'@'localhost'
.Respuestas:
Aquí hay un método rápido y sucio para verificar cómo MySQL realiza una autenticación exitosa.
Por favor ejecute esta consulta:
USER () informa cómo intentó autenticarse en mysqld
CURRENT_USER () informa cómo mysqld le permitió autenticarse
A veces,
USER()
yCURRENT_USER()
son diferentes. Esto se debe a que la autenticación mysql sigue un protocolo específico.De acuerdo con la Guía de estudio de certificación MySQL 5.0
las páginas 486,487 establecen lo siguiente en el algoritmo de autenticación de mysql:
A partir de esta descripción, no necesita preocuparse por el orden de las tablas mysql.user ya que hay una copia en memoria de las tablas de concesión que está ordenada como se mencionó anteriormente.
Con respecto a cómo inició sesión, solo
mysql -u a
funcionó. Regrese e inicie sesión nuevamente y ejecute estos comandosAsegúrate de eso
Esto es solo una suposición, pero sospecho que se
mysql -u a
conecta a través de localhost porque cuando no se especifica el protocolo de conexión, el valor predeterminado es conectarse a través del archivo socket. Puede existir una entradamysql.user
que permita la conexión de host local anónimo.Ejecute esta consulta:
Si regresa una fila sin contraseña, eso explica completamente por qué
mysq -u a
funciona.ACTUALIZACIÓN 2012-01-19 11:12 EDT
Craig Efrein planteó una pregunta interesante: si existen dos nombres de usuario idénticos en la tabla mysql.user, uno con una contraseña y otro sin ella, ¿eso significa que MySQL niega la autenticación cuando no se usa una contraseña?
Esta pregunta es un excelente aviso sobre la autenticación de usuarios de MySQL.
Tenga en cuenta que la clave principal de mysql.user es host, user. No hay otros índices. Esto permite múltiples ocurrencias de un nombre de usuario. Cada aparición puede tener una contraseña diferente o no tener contraseña. Esto permite al usuario 'dbuser' iniciar sesión localmente (dbuser @ localhost) sin contraseña y el mismo usuario inicia sesión desde otro servidor dentro de un determinado bloque de red (dbuser@'10.1.2.20 ') con una contraseña como' pass1 'y ese usuario iniciar sesión remotamente desde cualquier lugar (dbuser @ '%') con una contraseña remota como 'pass2'.
Dado el algoritmo de autenticación que utiliza MySQL, no hay restricciones impuestas a los usuarios con la presencia o ausencia de una contraseña.
Esta es la razón por la cual la Guía de estudio de certificación de MySQL 5.0 dice en la página 498, el párrafo 6 en sus viñetas, muestra cómo limpiar el proceso de autenticación:
fuente
El comodín de host '%' no coincide con 'localhost'. Por defecto, el cliente mysql intentará conectarse a través de un socket en lugar de tcp (generalmente en algún lugar como /var/lib/mysql/mysql.sock).
Puede cambiar su concesión a 'a' @ 'localhost' o forzar al cliente a operar sobre la pila TCP como:
fuente
my.cnf
para no necesitar más este parámetro?¿Ha verificado para asegurarse de que MySQL realmente está escuchando en 3306? Ejecute un netstat -tlpn y proporcione los resultados. Si no ve 3306, entonces probablemente no lo sea.
En my.cnf debe verificar que --skip-networking esté comentado
fuente
Como lo describió @atxdba, para conectar el demonio mysql desde el control remoto que no se conecta a través del socket, por lo que debe conectarse desde el control remoto a través de TCP.
Para esto, debe especificar el
--protocol=TCP
por cada conexión. Aunque, puede configurarlo enmy.cnf
el servidor:fuente