Habilitar conexión remota de MySQL: ERROR 1045 (28000): acceso denegado para el usuario

136

MySQL 5.1.31 ejecutándose en Windows XP.

Desde el servidor MySQL local (192.168.233.142) puedo conectarme como root de la siguiente manera:

>mysql --host=192.168.233.142 --user=root --password=redacted

Desde una máquina remota (192.168.233.163), puedo ver que el puerto mysql está abierto:

# telnet 192.168.233.142 3306
Trying 192.168.233.142...
Connected to 192.168.233.142 (192.168.233.142).

Pero cuando intento conectarme a mysql desde la máquina remota , recibo:

# mysql --host=192.168.233.142 --user=root --password=redacted
ERROR 1045 (28000): Access denied for user 'root'@'192.168.233.163' (using password: YES)

Solo tengo 2 entradas en mysql.user:

Host         User     Password
--------------------------------------
localhost    root     *blahblahblah
%            root     [same as above]

¿Qué más necesito hacer para habilitar el acceso remoto?

EDITAR

Como lo sugiere Paulo a continuación, intenté reemplazar la entrada mysql.user para% con una entrada específica de IP, por lo que mi tabla de usuario ahora se ve así:

Host             User     Password
------------------------------------------
localhost        root     *blahblahblah
192.168.233.163  root     [same as above]

Luego reinicié la máquina, pero el problema persiste.

Mike Chamberlain
fuente

Respuestas:

211

Tienes que poner esto como root:

GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD' with grant option;

;

donde IP es la IP a la que desea permitir el acceso, USERNAME es el usuario que utiliza para conectarse y PASSWORD es la contraseña relevante.

Si desea permitir el acceso desde cualquier IP, simplemente coloque en %lugar de su IP

y luego solo tienes que poner

FLUSH PRIVILEGES;

O reinicie el servidor mysql y listo.

Octavio
fuente
¿Hay alguna manera de hacer esto sin un cliente local de MySQL?
cmcginty
¿Cómo eliminar los privilegios de una IP específica?
Umair Ayub
44
stackoverflow.com/a/21151255/470749 también me ayudó porque creo que mi configuración de dirección de enlace necesitaba ser comentada. Conceder privilegios remotos no fue suficiente para que funcione.
Ryan
8
No se explica en la respuesta, pero reemplaza PASSWORDcon la contraseña de la cuenta. Intenté el cambio anterior solo USERNAMEy IPno funcionó para mí hasta que cambié PASSWORD.
Richard Parnaby-King
Después de hacer esto, siga también lo que se dice en la siguiente respuesta: stackoverflow.com/a/21151255/445438
budhajeewa
85

Recibí el mismo error después de otorgar acceso remoto hasta que hice esto:

De /etc/mysql/my.cnf

En versiones más recientes de mysql, la ubicación del archivo es /etc/mysql/mysql.conf.d/mysqld.cnf

# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.
#bind-address           = 127.0.0.1

(comentar esta línea: bind-address = 127.0.0.1)

Entonces corre service mysql restart.

chaparreras
fuente
66
O cámbielo a bind-address = 0.0.0.0
lolski
2
Solo comentar bind-addressno funcionó para mí. Ya sea bind-address = 0.0.0.0o bind-address = <server_ip>funciona.
chhantyal
58

Por defecto en el servidor MySQL, el acceso remoto está deshabilitado. El proceso para proporcionar un acceso remoto al usuario es.

  1. Ir a mi carpeta bin sql o agregarlo a PATH
  2. Inicie sesión en root por mysql -uroot -proot(o cualquiera que sea la contraseña de root).
  3. En el éxito obtendrá mysql>
  4. Proporcione acceso de concesión a todos para ese usuario.

GRANT ALL PRIVILEGES ON *.* TO 'username'@'IP' IDENTIFIED BY 'password';

Aquí IP es la dirección IP para la que desea permitir el acceso remoto, si ponemos %alguna dirección IP puede acceder de forma remota.

Ejemplo:

C:\Users\UserName> cd C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin

C:\Program Files (x86)\MySQL\MySQL Server 5.0\bin>mysql -uroot -proot

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root';
Query OK, 0 rows affected (0.27 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.25 sec)

Esto para otro usuario.

mysql> GRANT ALL PRIVILEGES ON *.* TO 'testUser'@'%' IDENTIFIED BY 'testUser';
Query OK, 0 rows affected (0.00 sec)

mysql> FLUSH PRIVILEGES;
Query OK, 0 rows affected (0.00 sec)

Espero que esto ayude

Ravi Kant
fuente
+1 para detalles excelentes, realmente me ayudó a ver que esa 0 rows affectedes la norma :) Además, service mysqld restartse recomienda al final. [a mysqldveces es solo mysql]
Nathan Dortman
#Nota: Para la versión 5.6+, use "grant all on ..." (sin los privilegios)
Nicke Manarin
21

La ayuda de Paulo me llevó a la solución. Fue una combinación de lo siguiente:

  • la contraseña contenía un signo de dólar
  • Estaba tratando de conectarme desde un shell de Linux

El shell bash trata el signo de dólar como un carácter especial para la expansión a una variable de entorno, por lo que debemos escapar con una barra diagonal inversa. Por cierto, no tenemos que hacer esto en el caso de que el signo de dólar sea el carácter final de la contraseña.

Como ejemplo, si su contraseña es "pas $ word", desde Linux bash debemos conectarnos de la siguiente manera:

# mysql --host=192.168.233.142 --user=root --password=pas\$word
Mike Chamberlain
fuente
44
Además de lo anterior, consulte /etc/mysql/my.cnf y comente bind-address = 127.0.0.1
Buminda
2
Alternativamente, uno puede usar comillas simples para evitar la expansión de $: mysql --host=192.168.233.142 --user=root --password='pas$word' stackoverflow.com/a/6697781/500942
jalanb
'$' en la contraseña. No tiene precio. Gracias una tonelada !!
Nagendra Kakarla
Después de golpearme la cabeza contra el monitor por un rato me encontré con esto y funcionó. Tuve un ! y @ en mi contraseña. Contraseña modificada, privilegios vaciados y estoy de vuelta. ¡Gracias!
AJM
9

Tiene un firewall ? asegúrese de que el puerto 3306 esté abierto.

En Windows, de manera predeterminada, se crea una cuenta raíz mysql que solo tiene acceso desde localhost a menos que haya seleccionado la opción para habilitar el acceso desde máquinas remotas durante la instalación.

crear o actualizar el usuario deseado con '%' como nombre de host.

ejemplo:

CREATE USER 'krish'@'%' IDENTIFIED BY 'password';
Vamsi Krishna B
fuente
66
El servidor responde con "ERROR 1045 (28000): Acceso denegado para" ... si un bloque de firewall tendrá un tiempo de espera ...
Paulo H.
Solo quería publicar primero. my bad
Vamsi Krishna B
@Krish - Todo lo que sugirió ya está cubierto en la pregunta
Mike Chamberlain
5
  1. Intenta de flush privilegesnuevo.

  2. Intente reiniciar el servidor para recargar las concesiones.

  3. Intente crear un usuario con el host "192.168.233.163". "%" parece no permitir todo (es raro)

Paulo H.
fuente
Gracias, lo intenté pero fue en vano. Actualicé la pregunta con sus sugerencias.
Mike Chamberlain
44
Intenta crear otro usuario y no olvides establecer todas las subvenciones:CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass'; GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%' WITH GRANT OPTION;
Paulo H.
4

En mi caso, estaba tratando de conectarme a un servidor mysql remoto en un sistema operativo cent. Después de pasar por muchas soluciones (otorgar todos los privilegios, eliminar enlaces de IP, habilitar redes), el problema aún no se resolvió.

Al final resultó que, mientras buscaba en varias soluciones, me encontré con iptables, lo que me hizo darme cuenta de que el puerto mysql 3306 no aceptaba conexiones.

Aquí hay una pequeña nota sobre cómo verifiqué y resolví este problema.

  • Comprobando si el puerto está aceptando conexiones:

    telnet (ip del servidor mysql) [portNo]

  • Agregar regla de tabla ip para permitir conexiones en el puerto:

    iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT

  • No recomendaría esto para el entorno de producción, pero si sus iptables no están configuradas correctamente, agregar las reglas podría no resolver el problema. En ese caso, se debe hacer lo siguiente:

    servicio iptables stop

Espero que esto ayude.

Kushal
fuente
3

si está utilizando una IP dinámica, simplemente otorgue acceso a 192.168.2.%, así que ahora no tiene que preocuparse por otorgar acceso a su dirección IP cada vez.

Nitin Jaiman
fuente
1

Estaba luchando con el inicio de sesión remoto en MYSQL para mi instancia de Amazon EC2 Linux. Encontré que la solución era asegurarme de que mi grupo de seguridad incluyera una regla de entrada para el puerto 3306 de MySQL para incluir mi dirección IP (o 0.0.0.0/0 para cualquier lugar). Inmediatamente pude conectarme de forma remota tan pronto como agregué esta regla.

Brendan Moore
fuente
1

La nueva ubicación para el archivo de configuración mysql es

/etc/mysql/mysql.conf.d/mysqld.cnf
stackMonk
fuente
0

MySQL ODBC 3.51 Driver es que no se manejan caracteres especiales en la contraseña.

"Advertencia: es posible que tenga un dolor de cabeza grave con MySQL ODBC 3.51 si la contraseña en su comando GRANT contiene caracteres especiales, como! @ # $% ^?. MySQL ODBC 3.51 ODBC Driver no admite estos caracteres especiales en el cuadro de contraseña. El único mensaje de error que recibiría es "Acceso denegado" (usando la contraseña: SÍ) "- de http://www.plaintutorials.com/install-and-create-mysql-odbc-connector-on-windows-7/

PiperKeith
fuente
0

La combinación usuario / host puede haberse creado sin contraseña.

Supuse que al agregar un nuevo host para un usuario existente (usando una aplicación GUI), la contraseña existente también se usaría para la nueva combinación de usuario / host.

Podría iniciar sesión con

mysql -u username -p PASSWORD

localmente, pero no desde IPADDRESS con

mysql -u --host=HOST -p PASSWORD

(Realmente podría iniciar sesión desde IPADDRESS sin usar una contraseña)

mysql -u --host=HOST

Configuración de la contraseña de acceso permitido:

set password for '<USER>'@'<IPADDRESS>' = '<PASSWORD>';
andkrup
fuente
1
Gracias, pasé mucho tiempo intentando conectarme de forma remota a mi servidor Mysql y esta línea me ayudó mucho. Al configurar la contraseña del usuario, recibí el error ERROR 1372 (HY000): Password hash should be a 41-digit hexadecimal numberque me llevó a este artículo: knowmysql.blogspot.com/2013/09/… Después de seguir esos pasos, finalmente pude conectarme al servidor.
Andy Forceno