如何允许远程连接MySQL

我已经在我的本地机器上安装了MySQL Community Edition 5.5,我想允许远程连接,这样我就可以从外部源连接。

我该怎么做呢?

1048959 次浏览

如果您的MySQL服务器进程正在监听127.0.0.1或::1,那么您将无法远程连接。如果你在/etc/my.cnf中有一个bind-address设置,这可能是问题的根源。

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

这在MySQL上是默认允许的。

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

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

然后在你的my.cnf文件中找到下面的行和注释掉,它通常存在于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 / OSX窗户)以使更改生效。

在我的情况下,我试图连接到一个远程mysql服务器在cent操作系统。在经历了许多解决方案(授予所有特权,删除ip绑定,启用网络)后,问题仍然没有得到解决。

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

下面是关于我如何检查和解决这个问题的一个小说明。

  • 检查端口是否接受连接:
telnet (mysql server ip) [portNo]
  • Adding ip table rule to allow connections on the port:
iptables -A INPUT -i eth0 -p tcp -m tcp --dport 3306 -j ACCEPT
  • 不建议在生产环境中这样做,但如果您的iptables没有正确配置,添加规则可能仍然不能解决问题。在这种情况下,应该做以下工作:
service iptables stop

Hope this helps.

在完成以上所有操作后,我仍然无法远程登录为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;

对于需要它的人,检查防火墙端口3306是否也打开了,如果您的防火墙服务正在运行。

< p > F.Y.I 我为这个问题苦恼了好几个小时。最后,我打电话给我的主机提供商,发现在我使用云服务器的情况下,在1and1的控制面板中,他们有一个二级防火墙,你必须克隆并添加端口3306。一加进去我就直接进去了。< / p >

对于OS X用户,请注意bind-address参数通常是在launchd plist中设置的,而不是在my.ini文件中。因此,在我的例子中,我从/Library/LaunchDaemons/homebrew.mxcl.mariadb.plist中删除了<string>--bind-address=127.0.0.1</string>

如果你从brew安装MySQL,默认情况下它只监听本地接口。要解决这个问题,你需要编辑/usr/local/etc/my.cnf并将bind-address127.0.0.1更改为*

然后运行brew services restart mysql

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

(我挣扎了一段时间才找到这条路)

这个博客如何在局域网中安装MySQL服务器将有助于从头开始设置MySQL

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

(1)打开cmd。

(2)导航到路径C:\Program Files\MySQL\MySQL服务器5。X \ bin和

.使用实例

Mysql -u root -p

(3)输入root用户密码。

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

GRANT ON *上的所有特权。*到“用户名”@“ip” “密码”,< /强> < / p >

USERNAME:用于连接MySQL服务器的用户名。

IP:允许访问MySQL的公共IP地址 服务器。< / p >

PASSWORD:用户名密码。

IP可以替换为%,允许用户从任何IP连接 地址。< / p >

(5)按照命令刷新特权并退出。

冲洗特权;

< >强劲出口;\问 < / p >

enter image description here

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

将此选项设置为0.0.0.0(对于IPv4+6,设置为::)以接受来自任何主机的连接,如果您希望只允许在一个接口上连接,则设置为另一个外部可达地址。

Source .

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

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

mysqld.cnf SET bind-address= 0.0.0.0

(让recbe连接tcp/ip)

第二步)在mysql中创建用户,表用户,具有Windows上PC的名称属性,没有知识产权

enter image description here

启用远程根访问可能是危险的。如果您要设置具有更严格权限的用户帐户,则更可取。以下三个步骤可以做到这一点。

  1. 确保在my.ini或my.cnf文件中以bind-address ...开头的行至少被注释掉了。如果它不存在,那就继续前进。 你可以在Windows的C:\ProgramData\MySQL\MySQL Server 8.0中找到这个文件

  2. 然后,检查您正在建立连接的用户帐户在限制主机匹配字段中没有localhost。虽然不建议这样做,但您可以将%放在该字段中进行测试。您可以使用MySQL Workbench打开到服务器的本地连接,然后从菜单栏转到server >Users and Privileges,并找到您想要连接的用户帐户。

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

  1. 显然,您的防火墙应该允许MySQL服务器应用程序通过您想要的端口进行通信。您和服务器之间的物理网络设备应该允许在您想要连接的端口上进行通信。(通常端口为3306)

远程登录的所有流程。默认关闭远程登录。你需要手动打开所有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

现在享受远程登录

在使用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 -u root -p

输入你的Mysql用户密码

检查你想要的用户已经访问的主机。在我的例子中,用户是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';

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

之后,我检查了用户现在可以访问的主机。在我的例子中,用户是root:

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

这给了我这样的输出:

+-----------+
| host      |
+-----------+
| %         |
| localhost |
+-----------+

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

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

其中u表示用户h表示mysql-server-ip-addressp表示密码。所以我的情况是:

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

这是所有。

我希望这对你们有帮助

  • 检查远程服务器是否允许通配符访问端口3306:

sudo lsof -i -P -n | grep监听

不应该是这样的:

mysqld 23083 mysql 21u IPv4 145900142 0t0 TCP 127.0.0.1:3306(听)< / p >

在这种情况下,我们需要更新/etc/mysql/mysql.conf.d/mysqld.cnf或/etc/mysql/mariadb.conf.d/50-server.cnf:

Bind-address = 127.0.0.1 ->0.0.0.0

sudo service mysql restart;

为了从客户端测试mySQL连接:

host_address>3306

关闭链接/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

MySQL 8不再允许您使用GRANT命令创建用户。您需要首先创建用户。

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