MySQL: 如何允许远程连接到mysql

441

我在本地机器上安装了MySQL Community Edition 5.5,并想允许远程连接,以便我可以从外部源连接。

我该如何做到这一点?


2
可能是启用远程MySQL连接的重复问题。 - user
1
如果你正在使用DigitalOcean,可以尝试使用sudo mysql_secure_installation。供参考。 - Alan Dong
不要对非代码文本使用代码格式。离题了。 - user207421
@EJP 为什么?这是出于好奇的诚实问题。 - René Roth
19个回答

880

MySQL 默认允许这样做。

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

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

在Unix/OSX系统上,通常可以在/etc/mysql/my.cnf上找到以下行,并将其注释掉。在某些情况下,文件的位置为/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
10
好的,我会尽力进行翻译。根据您提供的内容,您似乎想知道如何在代码中注释掉一行代码。根据我的理解,您应该找到默认存在的那一行,并在其前面加上#号来注释掉它,而不是添加新的内容。 - mjuarez
7
嗯,在 \MYsql Server 5.5\ 中只有一个名为 my-default.ini 的 ini 文件,唯一没有 # 的行是:sql_mode=NO_ENGINE_SUBSTITUTION,STRICT_TRANS_TABLES。 - Leo
80
对于那些正在寻找 my.cnf 文件却未在其中找到 bind-address 指令的人,请注意,在我的情况下(MySQL 版本 14.14,Ubuntu 16.04.2),该文件的位置为 /etc/mysql/mysql.conf.d/mysqld.cnf - Ash Menon
15
жҲ‘и·ҹзқҖиҝҗиЎҢдәҶдёҖдёӘе‘Ҫд»ӨпјҢдҪҶMySQLиҝ”еӣһдәҶYou have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY '*****' WITH GRANT OPTION' at line 1гҖӮжҲ‘иҜҘжҖҺд№ҲеҠһпјҹ е»әи®®жЈҖжҹҘSQLиҜӯжі•жҳҜеҗҰжӯЈзЎ®пјҢзү№еҲ«жҳҜеңЁдёҺзүҲжң¬зӣёе…ізҡ„жүӢеҶҢдёӯжҹҘзңӢдҪҝз”ЁжӯЈзЎ®зҡ„иҜӯжі•гҖӮ - Hà Link
显示剩余25条评论

57

在做了以上所有操作后,我仍然无法远程以root身份登录,但通过Telnet到端口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
没问题。在按照其他答案的步骤进行操作时,会创建一个空密码的用户帐户。因此,您需要为这些帐户设置密码。 - chhantyal
1
我需要将已接受的答案与这个答案结合起来,然后一切都正常了。 - James
8
针对5.7及以上版本的SQL语句:update user set authentication_string=password('YOUR_PASSWORD') where user='root';,意思是将名为“root”的用户的身份验证字符串更改为指定的密码,“YOUR_PASSWORD”应替换为所需的密码。 - DalSoft
被接受的答案设置了密码并且对我有效。 - MikeKulls
1
谢谢,就像@James一样,我不得不将这个答案与被接受的答案结合起来修复。 - Ben Everard

48

根据我的经验,你可以在这个路径下找到配置文件:/etc/mysql/mysql.conf.d/mysqld.cnf

(我曾苦苦寻找这个路径)


3
这高度依赖于你使用的发行版。最好的方法是直接搜索:sudo find /etc -iname 'mysql*.cnf' - Martin Konecny
我很欣赏“find”命令。我是命令行新手,所以它非常有帮助。谢谢! - Heres2u
我花了几个小时来编辑/etc/mysq/conf.d/mysql.cnf,直到我找到了这个答案。 - Gayan Kavirathne
1
在Centos 7上:查找 /etc 目录下名称为 'my*.cnf' 的文件。 - Jacques Koorts
这很有帮助!在其他地方找不到它。 - Allen Gingrich
似乎远程无法访问根目录。尽管将“localhost”更改为%。 - Vahid Alvandi

33

在我的情况下,我正在尝试连接到CentOS上的远程MySQL服务器。经过尝试很多解决方案(授予所有权限,删除IP绑定,启用网络),问题仍未得到解决。

事实证明,在研究了各种解决方案后,我发现iptables让我意识到mysql端口3306没有接受连接。

以下是关于如何检查和解决此问题的简短说明。

  • 检查端口是否接受连接:
telnet (mysql服务器ip) [端口号]
  • 添加iptables规则以允许通过该端口进行连接:
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
  • 不建议在生产环境中这样做,但如果您的iptables未正确配置,则添加规则可能仍然无法解决问题。在这种情况下,应执行以下操作:
service iptables stop

希望这会有所帮助。


29

远程登录的所有过程。远程登录默认关闭。您需要手动打开它以便为所有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

现在可以享受远程登录的便利


19

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

(1) 打开命令提示符。

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

mysql -u root -p

(3) 输入root密码。

(4) 执行以下命令以提供权限。

GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'IP' IDENTIFIED BY 'PASSWORD';

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

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

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

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

(5) 通过以下命令刷新权限并退出。

FLUSH PRIVILEGES;

exit;\q

输入图像描述


4
做完后,我的根目录仍然被拒绝访问。我错过了什么? - TPG
在第四步中,您可以尝试使用本地系统IP地址代替%。它应该可以工作。%表示任何IP地址。 - Hiren Parghi

10

在使用 MySQL 作为数据库的 Java 项目 开发中,我曾经遇到过这个挑战。

以下是我是如何解决的:

首先,请确认你的 MySQL 服务器配置允许远程连接。使用你偏爱的文本编辑器打开 MySQL 服务器配置文件:

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

向下滚动到bind-address行,并确保其要么被注释掉,要么被替换为0.0.0.0(允许所有远程连接),或者被替换为您想从远程连接的IP地址

一旦您进行必要的更改,保存并退出配置文件。通过重新启动MySQL服务应用对MySQL配置文件所做的更改:

sudo systemctl restart mysql

接下来,在安装了MySQL的服务器上,登录到MySQL服务器控制台:

mysql -u root -p

输入您的 mysql用户密码

检查用户已经能够访问的 hosts。在我的情况下,用户是root:

SELECT host FROM mysql.user WHERE user = "root";

这是我的输出结果:
+-----------+
| host      |
+-----------+
| localhost |
+-----------+

接下来,我运行了以下命令,以授予root用户对名为my_database的数据库的远程访问权限:

USE my_database;
GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'my-password';

注意: % 允许用户从网络上的所有主机进行远程访问。您可以使用命令指定要授予用户访问权限的单个主机的 IP 地址- GRANT ALL PRIVILEGES ON *.* TO 'root'@'Ip-Address' IDENTIFIED BY 'my-password';

之后,我检查了用户现在可以访问的主机。在我的情况下,该用户是 root

SELECT host FROM mysql.user WHERE user = "root";

这是我的输出结果:
+-----------+
| host      |
+-----------+
| %         |
| localhost |
+-----------+

最后,您可以使用以下命令尝试从另一个服务器连接到MySQL服务器:

mysql -u username -h mysql-server-ip-address -p

其中,u代表用户,h代表MySQL服务器IP地址,而p则代表密码。因此,在我的情况下,它是:

mysql -u root -h 34.69.261.158 -p

请输入您的MySQL用户密码

根据您的MySQL服务器版本,您应该会得到此输出:

Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 4
Server version: 5.7.31 MySQL Community Server (GPL)

Copyright (c) 2000, 2020, Oracle and/or its affiliates. All rights reserved.

Oracle is a registered trademark of Oracle Corporation and/or its
affiliates. Other names may be trademarks of their respective
owners.

Type 'help;' or '\h' for help. Type '\c' to clear the current input statement.

mysql> 

资源: 如何允许远程连接到MySQL

就这些。

希望这能帮助到你。


9
关闭/etc/mysql/mysql.conf.d/mysqld.cnf或者/etc/mysql/my.cnf中的链接注释:
bind-address = 127.0.0.1  =>>  #bind-address = 127.0.0.1

更改主机名以便所有设备都能访问它,本地运行此SQL命令:

UPDATE mysql.user SET Host='%' WHERE Host='localhost' AND User='root';
FLUSH PRIVILEGES;

重启服务:

sudo service mysql restart

打开MySQL端口:

sudo ufw allow 3306

7

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

您还需要为非localhost用户添加权限。


奇怪,你的服务器怎么可能在除了 127.0.0.1 以外的另一个 IP 上“监听”? - Pacerier
2
@Pacerier 127.0.0.1 只绑定到回环接口。外部连接将无法工作。一个系统通常会有多个网络接口,每个接口都需要具体绑定,或者您可以使用绑定所有的 0.0.0.0 地址。 - tadman

7
如果您使用brew安装了MySQL,则默认情况下它只会监听本地接口。要解决这个问题,您需要编辑/usr/local/etc/my.cnf文件,并将bind-address127.0.0.1更改为*
然后运行brew services restart mysql

2
对于我的Ubuntu 16.04.4服务器,bind-address设置位于/etc/mysql/mysql.conf.d/mysqld.cnf文件中。 - Frank
这不仅仅是使用brew,任何MySQL都会有这个默认设置,只允许本地连接。 - nivs1978

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