El host 'xxx.xx.xxx.xxx' no puede conectarse a este servidor MySQL

668

Esto debería ser muy simple, pero no puedo hacer que funcione para mi vida.
Solo estoy tratando de conectarme remotamente a mi servidor MySQL.

conectando como

mysql -u root -h localhost -p  

funciona bien, pero intentando

mysql -u root -h 'any ip address here' -p

falla con el error

ERROR 1130 (00000): Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL server

En la mysql.usertabla, hay exactamente la misma entrada para el usuario 'root' con el host 'localhost' que otra con el host '%'.

Estoy al final de mi ingenio y no tengo idea de cómo proceder. Cualquier idea es bienvenida.

concepto47
fuente
No se puede iniciar sesión como root en la mayoría de las circunstancias, debido a las precauciones de seguridad ..
AO_

Respuestas:

816

Posiblemente una precaución de seguridad. Puede intentar agregar una nueva cuenta de administrador:

mysql> CREATE USER 'monty'@'localhost' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'localhost'
    ->     WITH GRANT OPTION;
mysql> CREATE USER 'monty'@'%' IDENTIFIED BY 'some_pass';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'monty'@'%'
    ->     WITH GRANT OPTION;

Aunque, como Pascal y otros han señalado, no es una gran idea tener un usuario con este tipo de acceso abierto a cualquier IP. Si necesita un usuario administrativo, use root y déjelo en localhost. Para cualquier otra acción, especifique exactamente los privilegios que necesita y limite la accesibilidad del usuario como Pascal ha sugerido a continuación.

Editar:

De las preguntas frecuentes de MySQL:

Si no puede entender por qué se le niega el acceso, elimine de la tabla de usuario todas las entradas que tengan valores de Host que contengan comodines (entradas que contengan caracteres '%' o '_'). Un error muy común es insertar una nueva entrada con Host = '%' y User = 'some_user', pensando que esto le permite especificar localhost para conectarse desde la misma máquina. La razón por la que esto no funciona es que los privilegios predeterminados incluyen una entrada con Host = 'localhost' y User = ''. Debido a que esa entrada tiene un valor de Host 'localhost' que es más específico que '%', se usa con preferencia a la nueva entrada cuando se conecta desde localhost. El procedimiento correcto es insertar una segunda entrada con Host = 'localhost' y User = 'some_user', o para eliminar la entrada con Host = 'localhost' y Usuario = ''. Después de eliminar la entrada, recuerde emitir una instrucción FLUSH PRIVILEGES para volver a cargar las tablas de concesión. Consulte también la Sección 5.4.4, “Control de acceso, Etapa 1: Verificación de la conexión”.

Yannick Motton
fuente
17
Buena captura Yannick, sin embargo, no recomendaría que otorgue todos los privilegios a un usuario no root. Tal vez un conjunto reducido?
Corey Ballou el
3
Bueno, esto no sería una buena idea, pero permitir que 'root' se conecte desde todos los hosts es exactamente el mismo, ya que está en el mismo nivel de privilegio.
Yannick Motton el
2
Creo que extrañas mi punto Pascal. El punto es que el usuario 'root' ya tiene esos derechos y quiere permitir que cualquier IP se autentique como ese usuario. Entonces, si esto es realmente lo que quiere, el ejemplo predeterminado de crear un nuevo usuario administrador (que tiene exactamente los mismos derechos) es una alternativa a lo que está intentando.
Yannick Motton el
2
Así es Yannick, leí rápido y eliminaré mi comentario. Sin embargo, AFAIK, los permisos están funcionando bien en MySQL así que: 1. tal vez el OP modificó las tablas de concesión manualmente y luego necesita eliminar los privilegios. 2. tal vez no utilizó la sintaxis de concesión adecuada para root. Agregar otro usuario administrativo podría ser una solución, pero no resolverá el problema real en mi humilde opinión.
Pascal Thivent
1
Sentí que proporcionar acceso desde todos los hosts a la raíz no era una solución adecuada. En su lugar, creé un nuevo usuario y le concedí un conjunto reducido de privilegios, el conjunto que utilicé se describe como 'DBManager' en MySQL Workbench. También solo permití el acceso de cierto grupo de hosts en mi red local, particularmente 192.168.0.%
Gustavo Guevara
272

Uno tiene que crear new MySQL Useray asignar privilegios como se muestra a continuación en Query promptphpMyAdmin o símbolo del sistema:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

Una vez hecho con las cuatro consultas, debería conectarse con username / password

Aditya P Bhatt
fuente
55
Tuve que reiniciar mysql después de completar los pasos anteriores para que esto funcione para mí.
cabina de peaje
¿Tienes que crear el nombre de usuario @ localhost? ¿No es suficiente si solo crea un nombre de usuario @%? Quiero decir, si solo creas nombre de usuario @%, ¿no podrás conectarte con ese usuario desde localhost?
Sorin Postelnicu
1
sí, crear una @localhosttendría sentido si los privilegios fueran diferentes de alguna manera, pero aquí son los mismos y probablemente será más confuso que cualquier otra cosa (como cambiar las contraseñas en una sin darse cuenta de que existe la otra y que su inicio de sesión podría estar afectando a esa )
Bratchley
como principiante realmente me ayudó
Muhammad Nayab
1
gracias resuelve mi "SQLSTATE [HY000] [1130] El host 'DESKTOP-xxx.xx' no tiene permiso para conectarse a este servidor MariaDB" en la aplicación de laravel en contenedor en Windows
Zulqarnain
117

Mi mensaje de error fue similar y decía 'El host XXX no puede conectarse a este servidor MySQL ' a pesar de que estaba usando root. Aquí se explica cómo asegurarse de que la raíz tenga los permisos correctos.

Mi configuración :

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

Solución

  1. Abra el archivo en 'etc / mysql / my.cnf'
  2. Comprobar:

    • puerto (por defecto es 'puerto = 3306')
    • bind-address (por defecto es 'bind-address = 127.0.0.1'; si desea abrir a todos, simplemente comente esta línea. Para mi ejemplo, diré que el servidor real está en 10.1.1.7)
  3. Ahora acceda a la base de datos MySQL en su servidor real (digamos que su dirección remota es 123.123.123.123 en el puerto 3306 como usuario 'root' y quiero cambiar los permisos en la 'entrada de datos' de la base de datos. Recuerde cambiar la dirección IP, el puerto y el nombre de la base de datos a su configuración)

    mysql -u root -p
    Enter password: <enter password>
    mysql>GRANT ALL ON *.* to root@'123.123.123.123' IDENTIFIED BY 'put-your-password';
    mysql>FLUSH PRIVILEGES;
    mysql>exit
  4. servicio de sudo reinicio mysqld

  5. Ahora debería poder conectarse de forma remota a su base de datos. Por ejemplo, estoy usando MySQL Workbench y pongo 'Hostname: 10.1.1.7', 'Port: 3306', 'Username: root'
Será
fuente
1
Puede omitir la use dataentrylínea (ya que la mayoría de las personas no tendrán esa base de datos creada).
Jedidja
3
pude hacer esto sin reiniciar el mysqlservicio al final
Ryan Tuck
55
FLUSH PRIVILEGESdebería permitirle no tener que reiniciar.
Adam B
Esto funcionó para mí para MySQL 5.5 en Windows 10 con FLUSH PRIVILEGES, sin reiniciar el servicio. En Windows, las propiedades del servicio deben identificar el archivo my.ini utilizado para la configuración (Propiedades | General | Ruta al ejecutable)
FreeText
Supuse que al especificar bind-address = "0.0.0.0" escucharía en todas las interfaces y las conexiones remotas funcionarían, pero estaba equivocado. Sí, netstat mostró que mysql estaba escuchando en 0.0.0.0 (todas las interfaces) pero recibía el error en el título de la pregunta. Una vez que eliminé completamente la línea de dirección de enlace, comenzó a funcionar. Extraño.
Henno
73

Debe otorgar acceso al usuario desde cualquier nombre de host.

Así es como agrega nuevos privilegios de phpmyadmin

Ir a privilegios> Agregar un nuevo usuario

ingrese la descripción de la imagen aquí

Seleccione cualquier host para el nombre de usuario deseado

ingrese la descripción de la imagen aquí

HimalayaCoder
fuente
Muy útil, gracias hermano
Anderson Laverde
65

Simplemente realice los siguientes pasos:

1a) Conéctese a mysql (a través de localhost)

mysql -uroot -p

1b) Si el servidor myslq se ejecuta en Kubernetes (K8s) y se accede a él a través de un NodePort

kubectl exec -it [pod-name] -- /bin/bash
mysql -uroot -p

2) Crear usuario

CREATE USER 'user'@'%' IDENTIFIED BY 'password';

3) Conceder permisos

 GRANT ALL PRIVILEGES ON *.* TO 'user'@'%' WITH GRANT OPTION;

4) privilegios de descarga

FLUSH PRIVILEGES;
minhas23
fuente
44
ERROR 1045 (28000): Acceso denegado para el usuario 'root' @ 'localhost' (usando passwoYES) Y
Gank
11
Debiera ser *.* ?
sgarg
26

El mensaje *Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL serveres una respuesta del servidor MySQL al cliente MySQL. Observe cómo devuelve la dirección IP y no el nombre de host.

Si está intentando conectarse mysql -h<hostname> -u<somebody> -py devuelve este mensaje con la dirección IP, entonces el servidor MySQL no puede realizar una búsqueda inversa en el cliente. Esto es crítico porque así es como se asigna el cliente MySQL a las subvenciones.

Asegúrese de que puede hacer un nslookup <mysqlclient>DESDE el servidor MySQL. Si eso no funciona, entonces no hay entrada en el servidor DNS. Alternativamente, puede poner una entrada en el archivo HOSTS del servidor MySQL ( <ipaddress> <fullyqualifiedhostname> <hostname><- El orden aquí puede ser importante).

Una entrada en el archivo host de mi servidor que permite una búsqueda inversa del cliente MySQL resolvió este problema.

Dennis McLaughlin
fuente
1
"es una respuesta del servidor MySQL al cliente MySQL". Gracias, me preguntaba de dónde venía el error, mi máquina o el servidor. Tengo el error "ERROR 1130 (HY000):" etc.
PJ Brunet
20

Manera simple:

Grant All Privileges ON *.* to 'USER_NAME'@'%' Identified By 'YOUR_PASSWORD'; 

entonces

FLUSH PRIVILEGES;

¡hecho!

usuario5510975
fuente
¿Qué significa el%?
vistas de datos el
1
Es como todo. Puede ser un ejemplo: WHERE CustomerName LIKE 'a%'- Encuentra los valores que comienzan con "a"
user5510975
16

Si modifica las tablas de concesión manualmente (mediante INSERT, UPDATE, etc.), debe ejecutar una FLUSH PRIVILEGESinstrucción para indicarle al servidor que vuelva a cargar las tablas de concesión.

PD: No recomendaría permitir que ningún host se conecte para ningún usuario (especialmente no el rootuso). Si está utilizando mysql para una aplicación cliente / servidor, prefiera una dirección de subred. Si está utilizando mysql con un servidor web o un servidor de aplicaciones, use direcciones IP específicas.

Pascal Thivent
fuente
4

Simplemente use la interfaz proporcionada por la herramienta GUI de MySql (SQLyog):

Haga clic en Administrador de usuarios: ingrese la descripción de la imagen aquí

Ahora, si desea otorgar acceso PARA CUALQUIER OTRA PC REMOTA, solo asegúrese de que, al igual que en la imagen debajo, el valor del campo Host sea% (que es el comodín)

ingrese la descripción de la imagen aquí

BabaNuevo
fuente
4

La mayoría de las respuestas aquí muestran cómo crear usuarios con dos valores de host: uno para localhosty otro para %.

Tenga en cuenta que, excepto para un usuario localhost incorporado como root, no necesita hacer esto. Si simplemente desea crear un nuevo usuario que pueda iniciar sesión desde cualquier lugar, puede usar

CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypassword';
GRANT <whatever privileges are appropriate> ON <relevant tables> TO myuser;

y funcionará bien (Como otros han mencionado, es una idea terrible otorgar privilegios administrativos a un usuario desde cualquier dominio).

Erica Kane
fuente
3

Una manera simple es iniciar sesión en phpmyadmin con la cuenta raíz, ir a la base de datos mysql y seleccionar la tabla de usuario, editar la cuenta raíz y agregar en el campo host% comodín. y luego a través de privilegios de descarga ssh

 FLUSH PRIVILEGES;
usuario889030
fuente
Esto me ayudó a combinarme con esto: OTORGAR TODOS LOS PRIVILEGIOS . TO 'root' @ '%' CON LA OPCIÓN DE SUBVENCIÓN;
Lanklaas
2

Si se trata de una instalación reciente de mysql, antes de cambiar cualquier otra cosa, simplemente intente ejecutar este comando y luego intente nuevamente:

flush privileges;

Esto solo soluciona el problema para mí en Ubuntu 16.04, mysql 5.7.20. YMMV.

Alex R
fuente
2

Simplemente encuentre una mejor manera de hacerlo desde su panel de control de hosting (estoy usando DirectAdmin aquí)

simplemente vaya a la base de datos del servidor de destino en su panel de control, en mi caso: administración de MySQL -> seleccione su base de datos -> encontrará: "Access Hosts", simplemente agregue su host remoto aquí y ¡está funcionando ahora! ingrese la descripción de la imagen aquí

Supongo que hay una opción similar en otros paneles C. como plesk, etc.

Espero que también te haya sido útil.

Eran Levi
fuente
2

Bueno, nada de la respuesta anterior funcionó para mí. Después de mucha investigación, encontré una solución. Aunque puedo llegar tarde, esto puede ayudar a otros en el futuro.

Inicie sesión en su servidor SQL desde una terminal

 mysql -u root -p
 -- root password
GRANT ALL ON *.* to root@'XX.XXX.XXX.XX' IDENTIFIED BY 'password';

Esto debería resolver el problema del permiso.

Antes de resolver el error

Después de resolver el problema

Feliz codificación !!

Pratap Sharma
fuente
1

Bueno, lo que puedes hacer es abrir el archivo mysql.cfg y debes cambiar la dirección de enlace a esto

dirección-enlace = 127.0.0.1

y luego reinicie mysql y podrá conectar ese servidor a esto.

Mira esto, puedes tener una idea de eso.

esto es un verdadero sol

Kishan Bheemajiyani
fuente
3
Esto está relacionado, pero no es el mismo problema. El error recibido originalmente indica que el cliente se está conectando con éxito al servidor MySQL, pero luego falla la autenticación. Si la dirección de enlace se estableció en 127.0.0.1, en su lugar obtendría un error de conexión rechazada.
axon
Pero esta es la dirección que permitirá que todo el Host se conecte al servidor na?
Kishan Bheemajiyani
Pero otorgar todos los permisos al usuario no será una buena opción para ese bcoz si tiene un usuario cliente y no se le permite crear un usuario con todo el permiso, ¿cuál sería la solución?
Kishan Bheemajiyani
1

Si te estás ejecutando en Windows; Una solución simple es ejecutar el asistente de configuración de la instancia del servidor MySQL. Está en su grupo MYSQL en el menú de inicio. En la segunda desde la última pantalla, haga clic en el cuadro que dice "permitir acceso raíz desde máquinas remotas".

ene
fuente
1

Si tiene WAMP Server + Windows 10 y lo está utilizando para el desarrollo, haga clic con el botón derecho en Wamp Icon => Wamp Settings=>Check Allow Virtual Hosts other than 127* ingrese la descripción de la imagen aquí

Adrian
fuente
0

También estaba enfrentando el mismo problema. Lo resolví en 2 minutos para mí, solo lista blanca ip a través de cpanel

Suponga que está intentando conectar la base de datos del servidor B desde el servidor A. Vaya al Servidor B Cpanel-> Remote MySQL-> ingrese la Dirección IP del Servidor A y listo.

usuario3437729
fuente
0

Esta respuesta podría ayudar a alguien ...

Todas estas respuestas no ayudaron, luego me di cuenta de que olvidé verificar una cosa crucial ... El puerto :)

Tengo mysql ejecutándose en un contenedor docker que se ejecuta en un puerto diferente. Estaba apuntando a mi máquina host en el puerto 3306, en el que tengo un servidor mysql ejecutándose. Mi contenedor expone el servidor en el puerto 33060. ¡Así que todo este tiempo, estaba buscando el servidor equivocado! doh!

Srini
fuente
0
CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
FLUSH PRIVILEGES;

este error porque no hay contraseña para la raíz, y esto puede ocurrir cuando intentas conectarte desde el exterior.

Abd Abughazaleh
fuente
0

Solución CPANEL

Vaya a Cpanel, busque Remote MySQL. Agregue la IP en el campo de entrada:

Host (% comodín está permitido)

Comenta para recordar qué IP es esa. Eso fue todo por mí.

usuario2060451
fuente
0

¡Esto funciona para cualquier futura conexión mysql remota!

    sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

Navegue a la línea que comienza con la directiva bind-address. Debe tener un aspecto como este:

    bind-address            = 0.0.0.0

Inicie sesión en su mysql como terminal raíz

    mysql -u root -p
    -- root password

    CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

    CREATE USER 'username'@'%' IDENTIFIED BY 'password';

    GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

    FLUSH PRIVILEGES;

    EXIT;

finalmente Otorgue a esa máquina permiso exclusivo para conectarse a la base de datos de forma remota con el siguiente comando.

    sudo ufw allow from remote_IP_address to any port 3306
soufiane ELAMMARI
fuente
-1

En el caso de que alguien que enfrenta este problema lo esté experimentando desde SQLyog, esto sucedió:

Me había conectado a la base de datos remota (desde SQLyog) y trabajé durante algunas horas. Después dejé el sistema por unos minutos, luego regresé para continuar mi trabajo: ¡ ERROR 1130 ! Nada de lo que probé funcionó; Reiniciar SQLyog no lo solucionó. Luego reinicié el sistema, todavía no funcionaba.

Así que intenté conectarme desde la terminal, funcionó. Luego lo volví a intentar en SQLyog ... y funcionó. No puedo explicarlo más que 'peculiaridad aleatoria de la computadora', pero creo que podría ayudar a alguien.

Emmanuel
fuente
-1

si está intentando ejecutar la consulta mysql sin definir la cadena de conexión, obtendrá este error.

Probablemente olvidó definir la cadena de conexión antes de la ejecución. has visto esto? (perdón por mal inglés)

Ali CAKIL
fuente
-1

Problema: root @ localhost no puede conectarse a una nueva instalación de mysql-community-server en openSUSE 42.2-1.150.x86_64. Mysql rechaza las conexiones - punto.

Solución:

$ ls -l /var/lib/mysql/mysql/user.*
-rw-rw---- 1 mysql mysql     0 Apr 29 19:44 /var/lib/mysql/mysql/user.MYD
-rw-rw---- 1 mysql mysql  1024 Apr 29 19:44 /var/lib/mysql/mysql/user.MYI
-rw-rw---- 1 mysql mysql 10684 Apr 29 19:44 /var/lib/mysql/mysql/user.frm

El archivo user.MYD tiene un tamaño de 0 (¿realmente?!). Copié los 3 archivos de otro sistema de trabajo.

$ /usr/sbin/rcmysql stop
$ cd /var/lib/mysql/mysql/
$ scp root@othersytem:/var/lib/mysql/mysql/user.* ./
$ /usr/sbin/rcmysql start
$ cd -
$ mysql -u root -p

Pude iniciar sesión. Entonces, fue solo una cuestión de volver a aplicar todos los privilegios de esquema. Además, si deshabilitó IPv6, vuelva a habilitarlo temporalmente para que la cuenta root @ :: 1 también pueda funcionar.

Alex D
fuente
-1

Esto funciona para DirectAdmin ;

  1. Ve a tu DirectAdmin.
  2. Ve a tu MySQL Management.
  3. Selecciona tu database.
  4. Debajo de su Accesse Hostpestaña, hay un campo. Debe completar este campo por xxx.xx.xxx.xx.
  5. Haga clic en Add Host.

Terminado. Ahora puede acceder a esta base de datos con su your_database_username& your_database_password.
¡Tan sencillo!

اسماعیل زارع
fuente
-3

Todas las respuestas aquí no funcionaron en mi caso, así que invito a que esto pueda ayudar a otros usuarios en el futuro. Esto también puede ser un problema en nuestro código, no solo en MySQL solo.

Si estas usando VB.NET

En lugar de este código:

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database

 MysqlConn = New MySqlConnection()

Necesitas moverte MysqlConn = New MySqlConnection()en la primera línea. Entonces sería así

 MysqlConn = New MySqlConnection()

 Dim server As String = My.Settings.DB_Server
 Dim username As String = My.Settings.DB_Username
 Dim password As String = My.Settings.DB_Password
 Dim database As String = My.Settings.DB_Database

 MysqlConn.ConnectionString = "server=" & server & ";" _
 & "user id=" & username & ";" _
 & "password=" & password & ";" _
 & "database=" & database
Cary Bondoc
fuente