如何允许远程连接到MySQL


362

我已经在本地计算机上安装了MySQL Community Edition 5.5,并且希望允许远程连接,以便可以从外部源进行连接。

我怎样才能做到这一点?



1
如果您碰巧使用DigitalOcean,则可以尝试使用sudo mysql_secure_installation。仅供参考。
艾伦·董

不要对非代码文本使用代码格式。题外话。
洛恩侯爵,

@EJP为什么?好奇诚实的问题了
勒内·罗斯

Answers:


776

MySQL默认情况下允许这样做。

默认情况下禁用的是远程root访问。如果要启用它,请在本地运行此SQL命令:

 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password' WITH GRANT OPTION;
 FLUSH PRIVILEGES;

然后找到以下行并将其注释my.cnf文件中,该文件通常/etc/mysql/my.cnf位于Unix / OSX系统上。在某些情况下,文件的位置是/etc/mysql/mysql.conf.d/mysqld.cnf。

如果是Windows系统,则可以在MySQL安装目录中找到它,通常类似C:\Program Files\MySQL\MySQL Server 5.5\ ,文件名将为my.ini

换线

 bind-address = 127.0.0.1

 #bind-address = 127.0.0.1

然后重新启动MySQL服务器(Unix / OSXWindows),以使更改生效。


4
好吧,所以我在文件末尾添加了binnd-address = 127.0.0.1,并尝试使用navicat从外部主机进行连接,并且出现10060错误
Leo

7
嗯,您不需要添加它。就像我的回答所说,您需要将其注释掉,而不是添加它。默认情况下,其中有一个,因此您需要找到它,并在其前面加上#来注释掉它
mjuarez 2013年

7
嗯,在\ MYsql Server 5.5 \中,只有1个ini文件叫做my-default.ini,唯一没有#的行是这样的:sql_mode = NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES
Leo

2
这个答案很完美。thnx @mjuarez-授予所有特权使用格兰特选项以'密码'标识为'root'@'%';
yadavr

66
对于那些正在寻找my.cnf文件但未bind-address在其中找到指令的人,请注意,在我的情况下(Ubuntu 16.04.2上的MySQL版本14.14),文件的位置为/etc/mysql/mysql.conf.d/mysqld.cnf
Ash Menon

49

完成上述所有操作后,我仍然无法以root远程身份登录,但是远程登录到端口3306确认MySQL正在接受连接。

我开始查看MySQL中的用户,发现有多个root用户使用不同的密码。

select user, host, password from mysql.user;

因此,MySQL我再次为root设置了所有密码,最终我可以以远程登录root

use mysql;
update user set password=PASSWORD('NEWPASSWORD') where User='root';
flush privileges;

4
这是对的。遵循其他答案中的步骤时,似乎创建了具有空密码的用户帐户。因此,您需要为其添加密码。
chantyal '16

1
我需要将接受的答案与此答案结合起来,然后一切正常。
詹姆斯

8
适用于5.7及更高版本的SQLupdate user set authentication_string=password('YOUR_PASSWORD') where user='root';
DalSoft

接受的答案将设置密码并为我工作。
MikeKulls

1
谢谢,就像@James一样,我不得不将此与可接受的答案结合起来进行修复。
本·埃弗拉德

39

仅根据我的经验,您可以在此路径下找到配置文件/etc/mysql/mysql.conf.d/mysqld.cnf

(我花了一段时间寻找这条路)


1
这在很大程度上取决于您使用的发行版。最好的方法就是搜索:sudo find /etc -iname 'mysql*.cnf'
Martin Konecny,

我感谢“查找”命令。我是命令行的新手,因此非常有帮助。谢谢!
Heres2u

我费了好几个小时编辑/etc/mysq/conf.d/mysql.cnf,直到发现这个问题。
Gayan Kavirathne

26

就我而言,我试图连接到cent OS上的远程mysql服务器。经过许多解决方案(授予所有特权,删除ip绑定,启用网络连接)之后,问题仍然没有得到解决。

事实证明,在研究各种解决方案时,我遇到了iptables,这使我意识到mysql端口3306不接受连接。

这是有关我如何检查和解决此问题的小注释。

  • 检查端口是否接受连接:
telnet(mysql服务器ip)[portNo]
  • 添加ip表规则以允许端口上的连接:
iptables -A输入-i eth0 -p tcp -m tcp --dport 3306 -j接受
  • 不建议在生产环境中使用此功能,但是如果您的iptables配置不正确,则添加规则可能仍无法解决问题。在这种情况下,应执行以下操作:
服务iptables停止

希望这可以帮助。


17

请按照以下提到的步骤设置MySQL用户的通配符远程访问。

(1)打开cmd。

(2)导航到路径C:\ Program Files \ MySQL \ MySQL Server 5.X \ bin并运行此命令。

mysql -u root -p

(3)输入root密码。

(4)执行以下命令以提供许可。

*。*将所有特权授予“用户名” @“ IP”(由“密码”标识);

USERNAME:您希望连接到MySQL服务器的用户名。

IP:您希望允许访问MySQL服务器的公共IP地址。

密码:使用的用户名的密码。

IP可以替换为%,以允许用户从任何IP地址进行连接。

(5)按照以下命令清除特权并退出。

冲洗特权;

出口; \ q

在此处输入图片说明


3
完成后,我的根仍然拒绝访问。我错过了什么?
teapeng

您可以在第四步中尝试使用本地系统IP地址而不是%。它应该工作。%表示任何IP地址。
Hiren Parghi

6

如果您的MySQL服务器进程仅在127.0.0.1或:: 1上侦听,则您将无法远程连接。如果您有此bind-address设置,/etc/my.cnf则可能是问题的根源。

您还必须为非localhost用户添加特权。


很奇怪,您的服务器又如何“监听”另一个IP 127.0.0.1
Pacerier,2015年

2
@Pacerier 127.0.0.1仅绑定到回送接口。外部连接不起作用。一个系统通常会有多个网络接口,每个网络接口都需要专门绑定,或者您可以使用全部绑定0.0.0.0地址。
tadman

6

如果您从中安装MySQL,brew则默认情况下实际上仅在本地接口上进行监听。要解决此问题,您需要编辑/usr/local/etc/my.cnf并将其bind-address从更改127.0.0.1*

然后运行brew services restart mysql


1
对于我的ubuntu 16.04.4服务器,绑定地址设置位于/etc/mysql/mysql.conf.d/mysqld.cnf中
Frank

这不仅是使用brew,任何MySQL都将具有此默认设置,仅允许本地连接。
nivs1978 '19

6

远程登录的所有过程。默认情况下,远程登录是关闭的。您需要手动打开所有ip ..才能访问所有ip

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';

特定IP

GRANT ALL PRIVILEGES ON *.* TO 'root'@'your_desire_ip' IDENTIFIED BY 'password';

然后

flush privileges;

您可以检查您的用户主机和密码

SELECT host,user,authentication_string FROM mysql.user;

现在你的职责是改变这个

bind-address = 127.0.0.1

你可以在找到

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

如果在那儿找不到这个,那就试试看

sudo nano /etc/mysql/my.cnf

在此发表评论

#bind-address = 127.0.0.1

然后重启Mysql

sudo service mysql restart

现在享受远程登录


3

仅供参考,我花了好几个小时解决这个问题。.最后,我致电托管服务提供商,发现在我的情况下,使用云服务器,该云服务器在1and1的控制面板中有一个辅助防火墙,您必须克隆并添加端口3306.一旦添加,我就直接进入..


这听起来很符合您的情况。我并不是网络知识的无穷来源,但是您确定此解决方案可以很好地解决此问题吗?
桑迪·吉福德

2
我也有这个问题。与云托管服务器相同,
马修·洛克

2

如果防火墙服务正在运行,请向谁需要它,请检查防火墙端口3306是否也已打开。



1

对于OS X人士,请注意,bind-address参数通常在启动的plist中设置,而不是在my.ini文件中设置。因此,就我而言,我从中删除<string>--bind-address=127.0.0.1</string>/Library/LaunchDaemons/homebrew.mxcl.mariadb.plist


plist文件的备用位置:~/Library/LaunchAgents
Dylan Nissley

1

如果mysqld绑定地址设置为回送/本地地址(例如127.0.0.1),则无法从远程主机访问服务器,因为无法从任何远程主机访问回送接口。

将此选项设置为0.0.0.0::对于IPv4 + 6),以接受来自任何主机的连接,或者如果只想允许一个接口上的连接,则接受到另一个外部可访问的地址。

资源


0

有时需要在Windows上使用PC的名称

第一步)放入mysql的配置文件:

mysqld.cnf SET绑定地址= 0.0.0.0

(以通过TCP / IP接收接收连接)

第二步)使用户在mysql中,表用户,在Windows属性上具有pc名称,而 不是ip

在此处输入图片说明


0

启用远程根访问可能很危险。如果您要设置具有更多限制性权限的用户帐户,那将是更好的选择。下面的三个步骤应该做到这一点。

  1. 确保bind-address ...以my.ini或my.cnf文件开头的行至少被注释掉。如果不存在,请继续。您可以C:\ProgramData\MySQL\MySQL Server 8.0在Windows上找到该文件。

  2. 然后,localhost在“主机匹配限制”字段中检查与您建立连接的用户帐户是否没有。虽然不建议这样做,但您可以将其%放在该字段中以进行测试。您可以通过使用MySQL Workbench打开与服务器的本地连接,然后从菜单栏中转到“服务器”>“用户和特权”并找到您要连接的用户帐户来执行此操作。

“限制主机匹配”字段是不允许您进行非本地连接的字段。即,它将接受的连接限制为IP地址的模式。理想情况下,您应该从静态IP地址或子网访问MySQL服务器,以便尽可能地限制自己。

  1. 显然,您的防火墙应允许MySQL Server应用程序通过所需的端口进行通信。您和服务器之间的物理网络设备应允许您要连接的端口上的通信。(通常是端口3306)
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.