远程连接Mysql Ubuntu


95

由于某种原因,我无法远程连接到我的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?
2013年

服务器版本:5.5.29-0ubuntu0.12.10.1(Ubuntu)
Cristian Eduardo Lehuede Lyon 2013年

该命令返回什么?ubuntu〜$ sudo lsof -i -P | grep:3306
apesa

Answers:


345

要将MySQL暴露给localhost以外的任何东西,您将必须具有以下行

对于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

bind-address = 0.0.0.0如果不想指定IP,则添加一个

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

lsof -i -P | grep :3306

您应该在xxx的实际IP中返回类似的内容

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

如果以上语句正确返回,则可以接受远程用户。但是,要使远程用户连接正确的特权,您需要在本地主机和“%”中都创建该用户,如下所示。

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就能使事情正常运行,但是当事情没有按预期进行时,这非常方便。


1
谢谢,尽管我第一次正确地遵循了此步骤,但是当您发布并像魅力一样工作时,我还是再次做了它们!
Cristian Eduardo Lehuede Lyon

14
对于其他与苦苦挣扎的人来说lsof -i -P | grep :3306,这没有用,但是如果没有该确认,远程连接仍然可以正常工作,如果看不到正确的输出,请忽略。
Mike S

@Mike Slutsky感谢您的来信,我编辑了答案。如果尚未安装lsof,则可以安装。
apesa 2015年

2
在许多系统上,FWIW sudo lsof -i -Plsof -i -P(假设您以非特权用户身份登录)有用得多。
Dan Passaro

2
lsof -i -P | grep :3306不返回任何东西!
格林

39

在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;

用户==您用来连接mysql的用户ex.root
passwd ==您用来连接mysql 的密码

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

sudo ufw allow 3306

使用检查状态

sudo ufw status

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

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

3
这节省了我一整天!谢谢sudo ufw status!!
Riddhiman Adib's

netstat -nlt | grep 3306返回空
若昂·皮门特尔·费雷拉

@JoãoPimentel Ferreira确保mysql首先运行,使用命令“ /etc/init.d/mysql status”进行验证
Jonathan L

8

MySQL仅侦听localhost,如果要启用对它的远程访问,则需要在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 18-4-24

1
我没有注释掉skip-external-locking,它仍然有效。
Marcia Ong

我必须在
/etc/mysql/mysql.conf.d中

我的位置是这样的:sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf
Lester

1

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


啊,您是个天才,如果您使用Windows子系统用于Linux,这非常重要,那么您需要打开端口3306来通过Windows防火墙进行入站通信,并且上述所有内容都无法检查MySQL是否正在侦听子系统
Brian Leishman,

1

您正在使用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 Server将允许远程访问MySQL Server,但是仍然需要配置MySQL用户以允许从任何主机进行访问。

用户必须'username'@'%'拥有所有必需的赠款

为了确保MySQL服务器侦听所有接口,请按以下方式运行netstat命令。

netstat -tulnp | grep mysql

希望这有效!

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.