Conexões remotas Mysql Ubuntu

95

Por algum motivo, não consigo me conectar remotamente ao meu servidor MySQL. Já tentei de tudo e ainda estou recebendo erros.

root@server1:/home/administrator# mysql -u monty -p -h www.ganganadores.cl
Enter password:
ERROR 1045 (28000): Access denied for user 'monty'@'server1.ganganadores.cl' (using password: YES)

Agora, eu tentei correr

 GRANT ALL ON *.* to monty@localhost IDENTIFIED BY 'XXXXX'; 
 GRANT ALL ON *.* to monty@'%' IDENTIFIED BY 'XXXXXX';` 

e ainda nada! O que estou fazendo de errado?

EDIT : my.cnfcomentou o ip do bind.

Cristian Eduardo Lehuede Lyon
fonte
qual versão do MySQL você está usando?
Steve
Versão do servidor: 5.5.29-0ubuntu0.12.10.1 (Ubuntu)
Cristian Eduardo Lehuede Lyon
o que esse comando retorna? ubuntu ~ $ sudo lsof -i -P | grep: 3306
apesa

Respostas:

345

Para expor o MySQL a qualquer coisa que não seja localhost você terá que ter a seguinte linha

Para mysql versão 5.6 e inferior

descomentado /etc/mysql/my.cnfe atribuído ao endereço IP do seu computador e não loopback

Para mysql versão 5.7 e superior

descomentado /etc/mysql/mysql.conf.d/mysqld.cnfe atribuído ao endereço IP do seu computador e não loopback

#Replace xxx with your IP Address 
bind-address        = xxx.xxx.xxx.xxx

Ou adicione um bind-address = 0.0.0.0se não quiser especificar o IP

Em seguida, pare e reinicie o MySQL com a nova entrada my.cnf. Depois de executar, vá para o terminal e digite o seguinte comando.

lsof -i -P | grep :3306

Isso deve retornar algo assim com o seu IP real no xxx's

mysqld  1046  mysql  10u  IPv4  5203  0t0  TCP  xxx.xxx.xxx.xxx:3306 (LISTEN)

Se a instrução acima retornar corretamente, você poderá aceitar usuários remotos. No entanto, para um usuário remoto se conectar com os privilégios corretos, você precisa ter esse usuário criado em localhost e em '%'.

CREATE USER 'myuser'@'localhost' IDENTIFIED BY 'mypass';
CREATE USER 'myuser'@'%' IDENTIFIED BY 'mypass';

então,

GRANT ALL ON *.* TO 'myuser'@'localhost';
GRANT ALL ON *.* TO 'myuser'@'%';

e finalmente,

FLUSH PRIVILEGES; 
EXIT;

Se você não tiver o mesmo usuário criado como acima, ao fazer logon localmente, você pode herdar os privilégios de localhost base e ter problemas de acesso. Se você quiser restringir o acesso que meu usuário tem, então você precisa ler a sintaxe da instrução GRANT AQUI. Se você passou por tudo isso e ainda tem problemas, poste alguma saída de erro adicional e as linhas apropriadas de my.cnf.

NOTA: Se lsof não retornar ou não for encontrado, você pode instalá-lo AQUI com base em sua distribuição Linux. Você não precisa do lsof para fazer as coisas funcionarem, mas é extremamente útil quando as coisas não estão funcionando como esperado.

apesa
fonte
1
Obrigado, embora eu tenha seguido essas etapas corretamente na primeira vez, eu as fiz novamente conforme você postou e funcionou como um encanto!
Cristian Eduardo Lehuede Lyon
14
Para qualquer outra pessoa que tenha problemas com lsof -i -P | grep :3306, isso não funcionou, mas a conexão remota ainda funciona bem sem essa confirmação, desconsidere se você não vir a saída adequada.
Mike S
@Mike Slutsky Obrigado pela nota, editei minha resposta. Você pode instalar o lsof se ainda não estiver instalado.
apesa
2
FWIW em muitos sistemas sudo lsof -i -Pserá muito mais útil do que lsof -i -P(assumindo que você esteja logado como um usuário sem privilégios).
Dan Passaro
2
lsof -i -P | grep :3306não retorna nada!
Verde
39

Adicione alguns pontos ao excelente post da apesa:

1) Você pode usar o comando abaixo para verificar o endereço IP do servidor mysql está escutando

netstat -nlt | grep 3306

sample result:

tcp 0  0  xxx.xxx.xxx.xxx:3306  0.0.0.0:*   LISTEN

2) Use FLUSH PRIVILEGESpara forçar o carregamento das tabelas de concessão se, por algum motivo, as alterações não tiverem efeito imediato

GRANT ALL ON *.* TO 'user'@'localhost' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
GRANT ALL ON *.* TO 'user'@'%' IDENTIFIED BY 'passwd' WITH GRANT OPTION;
FLUSH PRIVILEGES; 
EXIT;

user == o usuário que você usa para se conectar ao mysql ex.root
passwd == a senha que você usa para se conectar ao mysql com

3) Se o firewall netfilter estiver habilitado ( sudo ufw enable) na máquina do servidor mysql, faça o seguinte para abrir a porta 3306 para acesso remoto:

sudo ufw allow 3306

verificar o status usando

sudo ufw status

4) Uma vez que uma conexão remota é estabelecida, ela pode ser verificada em qualquer máquina cliente ou servidor usando comandos

netstat -an | grep 3306
netstat -an | grep -i established
Jonathan L
fonte
3
Isso salvou meu dia inteiro! Obrigado por sudo ufw status!!
Riddhiman Adib
netstat -nlt | grep 3306retorna vazio
João Pimentel Ferreira
@João Pimentel Ferreira certifique-se de que o mysql está rodando primeiro, use o comando "/etc/init.d/mysql status" para verificar
Jonathan L
8

O MySQL escuta apenas o localhost, se quisermos habilitar o acesso remoto a ele, precisamos fazer algumas alterações no arquivo my.cnf:

sudo nano /etc/mysql/my.cnf

Precisamos comentar as linhas bind-address e skip-external-locking:

#bind-address = 127.0.0.1
# skip-external-locking

Depois de fazer essas alterações, precisamos reiniciar o serviço mysql:

sudo service mysql restart
Vinh Lee
fonte
1
certifique-se de comentarskip-external-locking
calebeaires
1
Eu não comentei skip-external-locking e ainda funciona.
Marcia Ong
Tive que mudá-lo em /etc/mysql/mysql.conf.d
Bartando
o meu é este local:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Lester
1

Se estiver testando no Windows, não se esqueça de abrir a porta 3306.

Marw
fonte
Ah, você é um gênio, isso é SUPER importante se você estiver usando o subsistema do Windows para Linux, você precisa abrir a porta 3306 para o tráfego de entrada através do firewall do Windows e nenhuma das coisas acima para verificar se o MySQL está escutando funcionar o subsistema
Brian Leishman
1

Você está usando o Ubuntu 12 (bastante antigo)

Primeiro, abra o arquivo /etc/mysql/mysql.conf.d/mysqld.cnf ( /etc/mysql/my.cnf no Ubuntu 14.04 e versões anteriores

No [mysqld] Localize a linha, bind-address = 127.0.0.1 E mude para, bind-address = 0.0.0.0 ou comente-o

Em seguida, reinicie o Ubuntu MysQL Server systemctl restart mysql.service

Agora o Ubuntu Server permitirá acesso remoto ao MySQL Server, mas ainda assim você precisa configurar os usuários do MySQL para permitir o acesso de qualquer host.

O usuário deve estar 'username'@'%'com todas as concessões necessárias

Para ter certeza de que o servidor MySQL escuta em todas as interfaces, execute o comando netstat da seguinte maneira.

netstat -tulnp | grep mysql

Espero que funcione!

Gaurav Singh
fonte