O host 'xxx.xx.xxx.xxx' não tem permissão para se conectar a este servidor MySQL

668

Isso deve ser muito simples, mas não posso fazer com que funcione pela minha vida.
Eu só estou tentando conectar remotamente ao meu servidor MySQL.

conectando como

mysql -u root -h localhost -p  

funciona bem, mas tentando

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

falha com o erro

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

Na mysql.usertabela, existe exatamente a mesma entrada para o usuário 'root' com o host 'localhost' como outra com o host '%'.

Estou no limite do meu juízo e não tenho ideia de como proceder. Todas as idéias são bem-vindas.

concept47
fonte
Não pode entrar como root na maioria das circunstâncias devido a precaução de segurança ..
AO_

Respostas:

816

Possivelmente uma precaução de segurança. Você pode tentar adicionar uma nova conta 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;

Embora, como Pascal e outros tenham observado, não seja uma boa idéia ter um usuário com esse tipo de acesso aberto a qualquer IP. Se você precisar de um usuário administrativo, use o root e deixe-o no host local. Para qualquer outra ação, especifique exatamente os privilégios necessários e limite a acessibilidade do usuário, como Pascal sugeriu abaixo.

Editar:

Do FAQ do MySQL:

Se você não conseguir descobrir por que o acesso é negado, remova da tabela de usuários todas as entradas que possuam valores de host contendo caracteres curinga (entradas que contêm caracteres '%' ou '_'). Um erro muito comum é inserir uma nova entrada com Host = '%' e Usuário = 'some_user', pensando que isso permite especificar host local para conectar-se a partir da mesma máquina. O motivo disso não funcionar é que os privilégios padrão incluem uma entrada com Host = 'localhost' e Usuário = ''. Como essa entrada possui um valor de host 'localhost' mais específico que '%', é usada preferencialmente à nova entrada ao se conectar a partir do localhost! O procedimento correto é inserir uma segunda entrada com Host = 'localhost' e Usuário = 'some_user', ou para excluir a entrada com Host = 'localhost' e Usuário = ''. Após excluir a entrada, lembre-se de emitir uma instrução FLUSH PRIVILEGES para recarregar as tabelas de concessão. Consulte também a Seção 5.4.4, “Controle de Acesso, Estágio 1: Verificação de Conexão”.

Yannick Motton
fonte
17
Boa captura Yannick, no entanto, eu não recomendaria que ele concedesse todos os privilégios a um usuário não root. Talvez um conjunto reduzido?
Corey Ballou
3
Bem, isso realmente não seria uma boa ideia, mas permitir que o 'root' se conecte a partir de todos os hosts é exatamente o mesmo, pois está no mesmo nível de privilégio.
Yannick Motton
2
Eu acho que você perdeu o meu ponto Pascal. O ponto é que o usuário 'root' já possui esses direitos e deseja permitir que qualquer ip seja autenticado como esse usuário. Portanto, se é realmente isso que ele deseja, o exemplo padrão de criação de um novo usuário administrador (que possui exatamente os mesmos direitos) é uma alternativa ao que ele está tentando.
Yannick Motton
2
É isso mesmo Yannick, li rápido e removerei meu comentário. No entanto, no AFAIK, as permissões estão funcionando bem no MySQL, portanto: 1. talvez o OP modifique as tabelas de concessão manualmente e, em seguida, precise liberar privilégios. 2. talvez ele não tenha usado a sintaxe de concessão adequada para o root. Adicionar outro usuário administrativo pode ser uma solução alternativa, mas não resolverá o problema real do IMHO.
286 Pascal Thivent
1
Eu senti que fornecer acesso de todos os hosts ao root não era uma solução adequada. Em vez disso, criei um novo usuário e concedi um conjunto reduzido de privilégios, o conjunto que usei é descrito como 'DBManager' no MySQL Workbench. Eu também só é permitido o acesso de um determinado grupo de anfitriões na minha rede local, particularmente 192.168.0%.
Gustavo Guevara
272

É necessário criar new MySQL Usere atribuir privilégios, como abaixo, Query promptvia phpMyAdmin ou prompt de comando:

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;

Depois de concluir todas as quatro consultas, ele deve se conectar com username / password

Aditya P Bhatt
fonte
5
Tive que reiniciar o mysql depois de concluir as etapas acima para que isso funcionasse para mim.
tollbooth
Você precisa criar o nome de usuário @ localhost? Não basta apenas criar o nome de usuário @%? Quero dizer, se você acabou de criar o nome de usuário @%, não poderá se conectar com esse usuário a partir do host local?
Sorin Postelnicu
1
sim, criar um @localhostfaria sentido se os privilégios fossem diferentes de alguma forma, mas aqui eles são os mesmos e provavelmente será mais confuso do que qualquer coisa (como alterar senhas em uma que não percebe que a outra existe e que seu login pode estar atingindo essa) )
Bratchley 4/17/17
como um novato que realmente me ajudou
Muhammad Nayab
1
graças a ele resolve meu "SQLSTATE [HY000] [1130] Host 'DESKTOP-xxx.xx' não é permitido se conectar a este servidor MariaDB" na aplicação laravel contentorizada no Windows
Zulqarnain
117

Minha mensagem de erro era semelhante e dizia ' Host XXX não tem permissão para se conectar a este servidor MySQL ', mesmo que eu estivesse usando raiz. Veja como garantir que o root tenha as permissões corretas.

Minha configuração :

  • Ubuntu 14.04 LTS
  • MySQL v5.5.37

Solução

  1. Abra o arquivo em 'etc / mysql / my.cnf'
  2. Verificar se há:

    • port (por padrão, é 'port = 3306')
    • endereço de ligação (por padrão, este é 'endereço de ligação = 127.0.0.1'; se você deseja abrir para todos, basta comentar esta linha. No meu exemplo, direi que o servidor atual está em 10.1.1.7)
  3. Agora acesse o banco de dados MySQL no seu servidor real (digamos que seu endereço remoto seja 123.123.123.123 na porta 3306 como usuário 'root' e desejo alterar as permissões no banco de dados 'dataentry'. Lembre-se de alterar o endereço IP, a porta e o nome do banco de dados às suas configurações)

    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. serviço sudo mysqld restart

  5. Agora você deve conseguir conectar-se remotamente ao seu banco de dados. Por exemplo, estou usando o MySQL Workbench e colocando 'Hostname: 10.1.1.7', 'Port: 3306', 'Username: root'
Vai
fonte
1
Você pode pular a use dataentrylinha (já que a maioria das pessoas não terá esse banco de dados criado).
Jedidja
3
eu era capaz de fazer isso sem reiniciar o mysqlserviço no final
Ryan Tuck
5
FLUSH PRIVILEGESdeve permitir que você não precise reiniciar.
Adam B #
Isso funcionou para mim no MySQL 5.5 no Windows 10 com FLUSH PRIVILEGES, sem reiniciar o serviço. No Windows, as propriedades do serviço devem identificar o arquivo my.ini usado para configuração (Propriedades | Geral | Caminho para o executável)
FreeText
Presumi que, especificando o endereço de ligação = "0.0.0.0", ele ouviria todas as interfaces e as conexões remotas funcionariam, mas eu estava errado. Sim, o netstat mostrou que o mysql estava escutando no 0.0.0.0 (todas as interfaces), mas eu estava recebendo o erro no título da pergunta. Depois que removi completamente a linha de endereço de ligação, ela começou a funcionar. Esquisito.
Henno 11/01
73

Você precisa conceder acesso ao usuário a partir de qualquer nome de host.

É assim que você adiciona novos privilégios do phpmyadmin

Saltar Privilégios> Adicionar um novo usuário

insira a descrição da imagem aqui

Selecione Qualquer host para o nome de usuário desejado

insira a descrição da imagem aqui

HimalayanCoder
fonte
Muito útil, obrigado mano
Anderson Laverde
65

Basta executar as seguintes etapas:

1a) Conecte-se ao mysql (via localhost)

mysql -uroot -p

1b) Se o servidor myslq estiver executando no Kubernetes (K8s) e sendo acessado através de um NodePort

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

2) Criar usuário

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

3) Conceder permissões

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

4) Privilégios de descarga

FLUSH PRIVILEGES;
minhas23
fonte
4
ERRO 1045 (28000): acesso negado para o usuário 'root' @ 'localhost' (usando passwoYES) Y
Gank
11
Deveria estar *.* ?
sgarg
26

A mensagem *Host ''xxx.xx.xxx.xxx'' is not allowed to connect to this MySQL serveré uma resposta do servidor MySQL para o cliente MySQL. Observe como está retornando o endereço IP e não o nome do host.

Se você estiver tentando se conectar mysql -h<hostname> -u<somebody> -pe ele retornar essa mensagem com o endereço IP, o servidor MySQL não poderá fazer uma pesquisa inversa no cliente. Isso é crítico porque é assim que ele mapeia o cliente MySQL para as concessões.

Certifique-se de poder executar um nslookup <mysqlclient>servidor FROM do MySQL. Se isso não funcionar, não há entrada no servidor DNS. Como alternativa, você pode colocar uma entrada no arquivo HOSTS do servidor MySQL ( <ipaddress> <fullyqualifiedhostname> <hostname><- A ordem aqui pode ser importante).

Uma entrada no arquivo host do meu servidor, permitindo uma pesquisa reversa do cliente MySQL, resolveu esse mesmo problema.

Dennis McLaughlin
fonte
1
"é uma resposta do servidor MySQL para o cliente MySQL." Obrigado, eu queria saber de onde veio o erro, minha máquina ou o servidor. Estou com o erro "ERRO 1130 (HY000):" etc.
PJ Brunet
20

Maneira simples:

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

então

FLUSH PRIVILEGES;

feito!

user5510975
fonte
o que o% significa?
DataViews
1
é como tudo. Você pode WHERE CustomerName LIKE 'a%'
pensar
16

Se você modificar as tabelas de concessão manualmente (usando INSERT, UPDATE etc.), deverá executar uma FLUSH PRIVILEGESinstrução para informar ao servidor para recarregar as tabelas de concessão.

PS: eu não recomendaria permitir que nenhum host se conectasse a nenhum usuário (especialmente o rootuso). Se você estiver usando o mysql para um aplicativo cliente / servidor, prefira um endereço de sub-rede. Se você estiver usando o mysql com um servidor web ou servidor de aplicativos, use IPs específicos.

Pascal Thivent
fonte
4

Basta usar a interface fornecida pela GUI Tool (SQLyog) do MySql:

Clique em Gerenciador de usuários: insira a descrição da imagem aqui

Agora, se você deseja conceder acesso PARA QUALQUER OUTRO PC REMOTO, verifique se, assim como na figura abaixo, o valor do campo Host é% (que é o curinga)

insira a descrição da imagem aqui

BabaNew
fonte
4

A maioria das respostas aqui mostra a criação de usuários com dois valores de host: um para localhoste outro para %.

Observe que, exceto por um usuário local do host incorporado como root, você não precisa fazer isso. Se você simplesmente deseja criar um novo usuário que possa fazer login de qualquer lugar, use

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

e vai funcionar muito bem. (Como outros já mencionaram, é uma péssima idéia conceder privilégios administrativos a um usuário de qualquer domínio.)

Erica Kane
fonte
3

A maneira mais simples é logar no phpmyadmin com a conta root, ir ao banco de dados mysql e selecionar a tabela do usuário, editar a conta root e no campo host adicionar% wild card. e, em seguida, através dos privilégios ssh flush

 FLUSH PRIVILEGES;
user889030
fonte
Isso me ajudou a combinar com isso: CONCEDE TODOS OS PRIVILÉGIOS . PARA 'root' @ '%' COM OPÇÃO DE CONCESSÃO;
Lanklaas
2

Se esta é uma instalação recente do mysql, antes de alterar qualquer outra coisa, tente simplesmente executar este comando e tente novamente:

flush privileges;

Isso por si só corrige o problema para mim no Ubuntu 16.04, mysql 5.7.20. YMMV.

Alex R
fonte
2

Basta encontrar uma maneira melhor de fazer isso no painel de controle da hospedagem (estou usando o DirectAdmin aqui)

basta ir ao banco de dados do servidor de destino no seu painel de controle, no meu caso: Gerenciamento MySQL -> selecione seu banco de dados -> você encontrará: "Access Hosts", basta adicionar seu host remoto aqui e ele está funcionando agora! insira a descrição da imagem aqui

Eu acho que existe uma opção semelhante em outros painéis C. como o plesk, etc.

Espero que tenha sido útil para você também.

Eran Levi
fonte
2

Bem, nada da resposta acima funcionou para mim. Depois de muita pesquisa, encontrei uma solução. Embora eu esteja atrasado, isso pode ajudar outras pessoas no futuro.

Faça logon no servidor SQL a partir de um terminal

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

Isso deve resolver o problema de permissão.

Antes de resolver o erro

Depois de resolver o problema

Feliz codificação !!

Pratap Sharma
fonte
1

Bem, o que você pode fazer é abrir o arquivo mysql.cfg e você deve alterar o endereço de ligação para este

endereço de ligação = 127.0.0.1

e reinicie o mysql e você poderá conectar esse servidor a isso.

Olhe isso, você pode ter uma idéia disso.

isso é sol real

Kishan Bheemajiyani
fonte
3
Isso está relacionado, mas não é o mesmo problema. O erro recebido originalmente indica que o cliente está se conectando ao servidor MySQL com êxito, mas falha na autenticação. Se o endereço de ligação fosse definido como 127.0.0.1, você obteria um erro de conexão recusada.
axon
Mas esse é o endereço que permitirá que todo o Host se conecte ao servidor na?
Kishan Bheemajiyani
Mas conceder toda a permissão ao usuário não será uma opção sensata para esse bcoz se você tiver um usuário cliente e não tiver permissão para criar usuário com toda a permissão, qual seria a solução.
Kishan Bheemajiyani
1

Se você estiver executando no Windows; Uma solução simples é executar o assistente de configuração da instância do servidor MySQL. Está no seu grupo MYSQL no menu Iniciar. Na segunda da última tela, clique na caixa que diz "permitir acesso root a partir de máquinas remotas".

Jan
fonte
1

Se você possui o WAMP Server + Windows 10 e está usando-o para desenvolvimento, clique com o botão direito no ícone Wamp => Wamp Settings=>Check Allow Virtual Hosts other than 127* insira a descrição da imagem aqui

Adrian
fonte
0

Eu também estava enfrentando o mesmo problema. Eu resolvi em 2 minutos para mim eu apenas lista branca ip através do cpanel

Suponha que você esteja tentando conectar o banco de dados do servidor B do servidor A. Vá para o Servidor B Cpanel-> MySQL Remoto-> digite o Endereço IP do Servidor A e pronto.

user3437729
fonte
0

Esta resposta pode ajudar alguém ...

Todas essas respostas não ajudaram, então eu percebi que esqueci de verificar uma coisa crucial .. A porta :)

Eu tenho o mysql rodando em um container docker rodando em uma porta diferente. Eu estava apontando para minha máquina host na porta 3306, na qual eu tenho um servidor mysql em execução. Meu contêiner expõe o servidor na porta 33060. Então, durante todo esse tempo, eu estava olhando para o servidor errado! doh!

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

este erro porque nenhuma senha para a raiz e isso talvez tenha ocorrido com você ao tentar se conectar de fora.

Abd Abughazaleh
fonte
0

Solução CPANEL

Vá para Cpanel, procure o MySQL Remoto. Adicione o IP no campo de entrada:

Host (% curinga é permitido)

Comente para lembrar qual é o IP. para mim, chega.

user2060451
fonte
0

Isso funciona para qualquer futura conexão mysql remota!

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

Navegue até a linha que começa com a diretiva de endereço de ligação. Deve ficar assim:

    bind-address            = 0.0.0.0

Entre no seu mysql como terminal raiz

    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, conceda permissão exclusiva à máquina para conectar-se ao banco de dados remotamente com o seguinte comando.

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

Com a chance de alguém que esteja enfrentando esse problema o esteja enfrentando no SQLyog, isso aconteceu:

Eu havia me conectado ao banco de dados remoto (de dentro do SQLyog) e trabalhado por algumas horas. Depois, deixei o sistema por alguns minutos e voltei para continuar meu trabalho - ERRO 1130 ! Nada do que tentei funcionou; Reiniciar o SQLyog não foi corrigido. Depois reiniciei o sistema - ele ainda não funcionava.

Então, eu tentei conectar a partir do terminal - funcionou. Em seguida, tentei novamente no SQLyog ... e funcionou. Não posso explicar isso além de "peculiaridade aleatória do computador", mas acho que pode ajudar alguém.

Emmanuel
fonte
-1

Se você estiver tentando executar uma consulta mysql sem definir a cadeia de conexão, receberá este erro.

Provavelmente você perdoa definir a cadeia de conexão antes da execução. você já viu isso? (desculpe pelo inglês ruim)

Ali CAKIL
fonte
-1

Problema: o root @ localhost não consegue se conectar a uma nova instalação do mysql-community-server no openSUSE 42.2-1.150.x86_64. O Mysql recusa conexões - ponto final.

Solução:

$ 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

O arquivo user.MYD tem 0 tamanho (realmente?!). Copiei todos os 3 arquivos de outro sistema em funcionamento.

$ /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

Consegui fazer login. Depois, era apenas uma questão de reaplicar todos os privilégios de esquema. Além disso, se você desativou o IPv6, reative-o temporariamente para que a conta root @ :: 1 também possa funcionar.

Alex D
fonte
-1

Este trabalho para o DirectAdmin ;

  1. Vá para o seu DirectAdmin.
  2. Vá para o seu MySQL Management.
  3. Selecione seu database.
  4. Sob sua Accesse Hostguia, há um campo. Você deve preencher este campo até xxx.xx.xxx.xx.
  5. Clique em Add Host.

Acabado. Agora você pode acessar esse banco de dados pelo seu your_database_username& your_database_password.
Tão simples!

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

Todas as respostas aqui não funcionaram no meu caso, portanto, como convidado, isso pode ajudar outros usuários no futuro. Isso também pode ser um problema em nosso código, não apenas no MySQL.

Se você estiver usando VB.NET

Em vez deste 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()

Você precisa seguir MysqlConn = New MySqlConnection()na primeira linha. Então seria assim

 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
fonte