远程连接 MySQL Ubuntu。

103

因为某些原因,我无法远程连接到我的MySQL服务器。我已经尝试了一切,但仍然收到错误信息。

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)

现在,我已经尝试运行

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

还是什么都没有!我做错了什么?

编辑: my.cnf中的绑定IP已被注释掉。


你正在使用哪个版本的MySQL? - Steve
服务器版本:5.5.29-0ubuntu0.12.10.1(Ubuntu) - Cristian Eduardo Lehuede Lyon
这个命令返回什么?ubuntu~$ sudo lsof -i -P | grep :3306 - apesa
7个回答

359

要将MySQL暴露给除本地主机以外的任何设备,您需要执行以下步骤:

对于mysql版本5.6及以下

请在/etc/mysql/my.cnf中取消注释并将其分配给您计算机的IP地址而不是回环地址。

对于mysql版本5.7及以上

请在/etc/mysql/mysql.conf.d/mysqld.cnf中取消注释并将其分配给您计算机的IP地址而不是回环地址。

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

如果您不想指定IP地址,则可以添加bind-address = 0.0.0.0

然后使用新的my.cnf条目停止并重新启动MySQL。一旦运行,请转到终端并输入以下命令。

lsof -i -P | grep :3306

你应该会得到一个类似这样的结果,其中xxx部分是你的实际IP地址。

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

如果上述语句返回正确,则您将能够接受远程用户。但是,要使远程用户以正确的权限连接,您需要在localhost和“%”中创建该用户,如下所示。

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

那么,

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

最后,
FLUSH PRIVILEGES; 
EXIT;

如果您没有创建与上述用户相同的用户,则在本地登录时,您可能会继承基本的localhost特权并遇到访问问题。如果您想限制myuser的访问权限,则需要阅读GRANT语句此处的语法。如果您完成了所有操作仍然有问题,请发布一些其他错误输出和适当行的 my.cnf。

注意:如果 lsof 没有返回或未找到,可以根据您的Linux发行版此处安装它。您不需要 lsof 来使事情正常工作,但是当事情不像预期那样工作时,它非常方便。

更新:如果即使在更改my.cnf中的bind-address后仍无效,则请去原始声明位置进行更改:

/etc/mysql/mariadb.conf.d/50-server.cnf

1
谢谢,虽然我第一次就正确地按照这些步骤操作了,但是我还是按照你发布的重新做了一遍,结果非常顺利! - Cristian Eduardo Lehuede Lyon
15
对于其他人使用 lsof -i -P | grep :3306 仍然无法正常工作,但远程连接仍然可以正常工作而不需要确认,请忽略如果您没有看到正确的输出。 - Mike S
在输入 lsof -i -P | grep :3306 后,我只看到了 mysql-wor 3226 varick 15u IPv4 51066 0t0 TCP EDNAWS-2.local:49978->EDNAWS-2.local:3306 (CLOSE_WAIT),但没有关于我的 IP 的任何信息。这是个问题吗? - gamo
3
在许多系统上,如果您以非特权用户身份登录,则“sudo lsof -i -P”比“lsof -i -P”更有用。FWIW。 - Dan Passaro
2
lsof -i -P | grep :3306 没有返回任何内容! - Green
显示剩余10条评论

41

在apesa的优秀帖子上,补充一些要点:

1)您可以使用以下命令来检查MySQL服务器正在侦听的IP地址:

netstat -nlt | grep 3306

sample result:

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

2) 使用 FLUSH PRIVILEGES 命令来强制重新加载授权表,如果更改没有立即生效的话。

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 == 连接到mysql的用户名,例如root
passwd == 连接到mysql所使用的密码

3) 如果mysql服务器启用了netfilter防火墙 (sudo ufw enable),请执行以下操作以打开远程访问的端口3306:

sudo ufw allow 3306

使用以下方式检查状态

sudo ufw status

4) 远程连接建立后,可以使用命令在客户端或服务器机器上进行验证。

netstat -an | grep 3306
netstat -an | grep -i established

3
这救了我一整天!多谢 sudo ufw status 命令!! - Riddhiman Adib
netstat -nlt | grep 3306 返回空结果。 - João Pimentel Ferreira
@João Pimentel Ferreira请确保MySQL已经在运行,使用命令“/etc/init.d/mysql status”进行验证。 - Jonathan L
感谢使用 sudo ufw allow 3306 - KrmX

8

MySQL只监听本地主机,如果我们想启用远程访问,则需要在my.cnf文件中进行一些更改:

sudo nano /etc/mysql/my.cnf

我们需要注释掉bind-address和skip-external-locking两行:

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

在进行这些更改后,我们需要重新启动mysql服务:

sudo service mysql restart

1
请确保注释skip-external-locking - calebeaires
1
我没有注释掉skip-external-locking,但它仍然可以工作。 - Marcia Ong
我必须在 /etc/mysql/mysql.conf.d 中进行更改。 - Bartando
我的位置是:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf - Lester

2

你正在使用Ubuntu 12(相当老的版本)

首先,打开/etc/mysql/mysql.conf.d/mysqld.cnf文件(在Ubuntu 14.04及早期版本中为/etc/mysql/my.cnf)

在[mysqld]下找到以下行:

bind-address = 127.0.0.1

并将其更改为:

bind-address = 0.0.0.0

或注释掉它

然后,重新启动Ubuntu MysQL服务器

systemctl restart mysql.service

现在Ubuntu服务器将允许远程访问MySQL服务器,但是您仍然需要配置MySQL用户以允许从任何主机访问。

用户必须是'username'@'%',并拥有所有必需的授权

要确保MySQL服务器侦听所有接口,请运行以下netstat命令。

netstat -tulnp | grep mysql

希望这可以解决问题!


1
在我的情况下,我将"bind-address = 0.0.0.0"添加到配置文件中并重新启动了MySQL服务。 - javed

1

如果在Windows上进行测试,请不要忘记打开3306端口。


啊,你真是个天才。如果你正在使用Windows子系统来运行Linux,那么非常重要的一点是,你需要在Windows防火墙中打开3306端口以允许入站流量,而且上述检查MySQL是否在监听的方法都不适用于子系统。 - Brian Leishman

0
在我的案例中,我使用的是 MySql Server 版本:8.0.22。
我不得不添加。
bind-address        = 0.0.0.0

并将此行更改为

mysqlx-bind-address = 0.0.0.0

在文件路径 /etc/mysql/mysql.conf.d 中

然后通过运行以下命令重新启动 MySQL

sudo service mysql restart

0

当我尝试将Mysql连接到远程服务器时,我遇到了同样的问题。我发现我必须将bind-address更改为DB服务器的当前私有IP地址。

但是,当我尝试在my.cnf文件中添加bind-address =0.0.0.0行时,它无法理解该行,因此我无法创建数据库。

经过搜索,我找到了原始声明bind-address的位置。

实际声明在:/etc/mysql/mariadb.conf.d/50-server.cnf

因此,我直接在那里更改了bind-address,然后一切似乎都正常工作了。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接