允许从任何IP地址远程访问MySQL数据库

346

我知道这个命令:

GRANT ALL PRIVILEGES
ON database.*
TO 'user'@'yourremotehost'
IDENTIFIED BY 'newpassword';

但是它只允许我授予特定的IP地址访问这个远程MySQL数据库。如果我想让任何远程主机都可以访问这个MySQL数据库呢?我该怎么做?基本上我要把这个数据库公开,让每个人都能够访问它。


3
在进行此操作之前,请考虑安全影响:http://security.stackexchange.com/questions/63881/is-it-not-safe-to-open-mysqls-port-to-the-internet - e18r
23
并非每个系统都是生产系统,有些人需要它来进行开发。 - Conrad Jones
我可以从本地机器访问托管在cPanel上的远程数据库,但从另一个cPanel上无法访问。显示了这个错误:SequelizeConnectionRefusedError。 - undefined
24个回答

335
TO 'user'@'%'

% 是通配符 - 如果需要,你也可以使用诸如 '%.domain.example' 或者 '%.123.123.123' 这样的格式。


@kristopolous 这可能有很多原因。这个命令是关于远程访问的(两台不同的机器)。如果你不是在进行这个操作,那么这个命令就不正确了。你仍然需要正确的密码和其他一些东西。 - Ariel
21
要使更改生效,您需要使用命令 "flush privileges;"。 - Didier Sampaolo
连接到运行在相同的操作系统实例上的数据库实例(例如您的开发机器)时,要传递-h my_machine_name参数是关键。这会欺骗客户端将您识别为'user'@my_machine_name.example.com,而不是'user'@localhost。这样,您就不需要为localhost和网络访问创建和维护双重帐户和授权。当然,确保mysqld绑定到0.0.0.0而不是127.0.0.1也很重要。 - Charlie Reitzel
操作 CREATE USER 失败,针对的是 '%' 的 'remote' 用户。 - shamaseen

204
这个内容最初来自于https://rtcamp.com/tutorials/mysql/remote-access/
启用远程访问(授权) 首页 / 教程 / Mysql / 启用远程访问(授权) 如果您尝试从远程机器连接到您的mysql服务器,并遇到以下错误,那么本文就是为您准备的。
错误1130(HY000):主机'1.2.3.4'不被允许连接到此MySQL服务器。
更改mysql配置
首先编辑mysql配置文件。
vim /etc/mysql/my.cnf

注释掉以下几行代码。
#bind-address           = 127.0.0.1
#skip-networking

如果你找不到skip-networking这一行,就添加它并注释掉它。
重新启动MySQL服务器。
~ /etc/init.d/mysql restart

更改GRANT权限

你可能会惊讶地发现,即使在上述更改之后,你仍然无法远程访问或者虽然能够访问但无法访问所有数据库。

默认情况下,你正在使用的mysql用户名和密码只允许在本地访问mysql服务器。因此需要更新权限。(如果你想为此目的创建一个单独的用户,你可以使用CREATE USER '用户名'@'localhost' IDENTIFIED BY '密码';

运行以下命令以从所有机器访问。(用你的凭据替换用户名密码

mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'%' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

运行以下命令以从特定IP地址授予访问权限(请用您的凭据替换USERNAMEPASSWORD)。
mysql> GRANT ALL PRIVILEGES ON *.* TO 'USERNAME'@'1.2.3.4' IDENTIFIED BY 'PASSWORD' WITH GRANT OPTION;

您可以将1.2.3.4替换为您的IP地址。您可以多次运行上述命令,以允许多个IP地址访问。
您还可以为远程访问指定单独的用户名密码
您可以通过以下方式检查最终结果:
SELECT * from information_schema.user_privileges where grantee like "'USERNAME'%";

最后,您可能还需要运行:
mysql> FLUSH PRIVILEGES;

测试连接
从终端/命令行:
mysql -h HOST -u USERNAME -pPASSWORD

如果你得到了一个mysql shell,请不要忘记运行show databases;来检查你是否有远程机器的正确权限。
额外提示:撤销访问权限
如果你不小心授予了一个用户访问权限,最好准备好撤销选项。
以下将从所有机器中撤销USERNAME的所有选项:
mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'%';
Following will revoke all options for USERNAME from particular IP:

mysql> REVOKE ALL PRIVILEGES, GRANT OPTION FROM 'USERNAME'@'1.2.3.4';
Its better to check information_schema.user_privileges table after running REVOKE command.

如果在执行REVOKE命令后看到USAGE权限,那没关系。它和没有权限一样好。我不确定它是否可以被撤销。

11
请注意,我不得不修改 /etc/mysql/mysql.conf.d/mysqld.cnf 文件而不是 /etc/mysql/my.cnf 文件来注释掉 bind-address 部分。缺少 #skip-networking 行,添加和注释该行不会产生任何影响。 - Pawan
1
在MariaDB 10.1.26上,配置文件为/etc/mysql/mariadb.conf.d/50-server.cnf - Kwadz
1
如果您已经完成了以上所有步骤,但仍无法连接,请检查防火墙设置,可能会阻止端口3306或您设置的任何端口。 - avn
值得一提的是,“USERNAME”与“username”是不同的。因此,请注意大小写。 - Shadi Alnamrouti
这是一个剽窃的案例。 - Peter Mortensen
显示剩余2条评论

48
要能够从任何IP地址连接到您的用户,请按照以下步骤操作:
允许MySQL服务器接受远程连接。为此,请打开mysqld.conf文件:
sudo gedit /etc/mysql/mysql.conf.d/mysqld.cnf

搜索以"bind-address"开头的行,并将其值设置为0.0.0.0。
bind-address                    = 0.0.0.0

最后保存文件。
注意:如果您正在运行MySQL 8+,则默认情况下bind-address指令不会在mysqld.cnf文件中。在这种情况下,请将该指令添加到文件/etc/mysql/mysql.conf.d/mysqld.cnf的底部。
现在重新启动MySQL服务器,可以使用systemd或使用旧的service命令。这取决于您的操作系统。
sudo systemctl restart mysql # for ubuntu
sudo systemctl restart mysqld.service # for debian

最后,MySQL服务器现在可以接受远程连接。

现在我们需要创建一个用户并授予权限,这样我们就可以使用这个用户进行远程登录。

以root身份或任何其他具有root特权的用户连接到MySQL数据库。

mysql -u root -p

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

注意:如果您在数据库服务器上配置了防火墙,您还需要打开端口3306,这是MySQL的默认端口,以允许流量访问MySQL。

2
sudo systemctl restart mysqld.service 是针对 Debian 的, 我不得不使用 sudo systemctl restart mysql.service 是针对 Ubuntu 的。 - ani0904071
我更新了我的回答,并为两个发行版添加了mysql重启命令。谢谢@ani0904071。 - Imtiaz Shakil Siddique

39
假设上述步骤已完成,MySQL端口3306可远程访问。不要忘记在MySQL配置文件中绑定公共IP地址。
例如,在我的Ubuntu服务器上,以root身份执行:
nano /etc/mysql/my.cnf

在文件中,搜索[mysqld]部分块,并添加新的绑定地址。在这个例子中,它是192.168.0.116。它会看起来像这样:
......
.....
# Instead of skip-networking the default is now to listen only on
# localhost which is more compatible and is not less secure.

bind-address        = 127.0.0.1
bind-address        = 192.168.0.116

.....
......

您可以选择删除 localhost (127.0.0.1) 绑定,但是您必须明确给出一个 IP 地址才能访问本地主机上的服务器。
然后最后一步是重新启动 MySQL 服务器(在 Ubuntu 上):
stop mysql

start mysql

或者对于其他系统,可以使用#/etc/init.d/mysql restart
现在可以通过远程访问MySQL数据库。
mysql -u username -h 192.168.0.116 -p

/etc/init.d/mysql reload 应该足够。 - Lorenz Lo Sauer
我刚才尝试远程连接Mysql服务器时失败了。然后我尝试注释掉bind-addresses,这样就成功了。我还尝试使用mysql -u<user> -p登录服务器,没有指定主机,它也能工作。因此,似乎“如果选择的话可以删除本地主机(127.0.0.1)绑定,但是必须明确给出IP地址才能在本地计算机上访问服务器。”是不正确的。(ubuntu 12.04 LTS server mysql Ver 14.14 Distrib 5.5.34) - Programster
7
bind-address 指令确定 mysql 服务器所监听的 IP 地址,而不是服务器接受连接的 IP 地址。 - GoZoner
2
在按照每个步骤后,它仍然无法正常工作。当注释掉bind-address时,我会收到一个错误,无论是localhost还是remotehost地址。 `mysql.serviceJob for mysql.service failed because the control process exited with error code. 请参阅“systemctl status mysql.service”和“journalctl -xe”获取详细信息。 - sunwarr10r
能否提供类似于abc.abc:1234这样的地址,而不是192.168.0.116? - bielas

31

需要更改配置文件以启用通过 localhost 的连接。

要通过远程 IP 地址进行连接,请使用 "root" 用户登录并在 MySQL 中运行以下查询。

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'localhost' WITH GRANT OPTION;

CREATE USER 'username'@'%' IDENTIFIED BY 'password';

GRANT ALL PRIVILEGES ON *.* TO 'username'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

这将创建一个新用户,可以在本地主机和远程IP上访问。
此外,请在位于/etc/mysql/my.cnf的my.cnf文件中注释掉下面的行:
bind-address = 127.0.0.1

重新启动MySQL服务器,使用以下命令:
sudo service mysql restart

现在你应该能够远程连接到你的MySQL服务器了。

3
这并没有回答问题。 - CHarris
1
@ChristopheHarris 你为什么这么认为?答案清楚地给出了逐步创建一个新用户的指示,该用户允许使用该用户在MySQL中进行本地和远程访问。你能解释一下吗? - harishannam
2
对我没用。仍然出现相同的错误。无论我是使用根用户还是新用户尝试,都无法连接到MySQL服务器,显示“xxx.xxx.xxx.xxx”([Errno 61] Connection refused)。 - sunwarr10r
我尝试了很多方法,但都不起作用。但我不知道为什么这个答案可行。但它确实可行,这就是我所知道的。 - Tushar Monirul

27
这是我获得授权的方式:
GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY
'yourRootPassword';

如前所述,% 是一个通配符,这将允许任何 IP 地址连接到您的数据库。我在此假设当您连接时,会有一个名为 root 的用户(这是默认的)。输入 root 密码,然后您就可以开始使用了。请注意,我对用户 root 没有使用任何单引号 (')。


1
为什么从用户中删除单引号很重要?这与其他答案(和手册)有何不同? - DMCoding

24

请使用以下命令:

GRANT ALL ON yourdatabasename.* TO root@'%' IDENTIFIED BY 'yourRootPassword';

那么:

FLUSH PRIVILEGES; 

请将以下代码注释在文件"/etc/mysql/mysql.conf.d/mysqld.cnf"中(这一步是必需的!):

#bind-address           = 127.0.0.1
bind-address = 127.0.0.1 

没问题!


非常好的一个。授权很重要。如果没有,会出现很多请求错误,比如“您的密码不符合当前策略要求”。 - Alejandro Teixeira Muñoz

17
运行以下内容:
mysql -u root -p

MySQL客户端会话:
GRANT ALL ON *.* to root@'ipaddress' IDENTIFIED BY 'mysql root password';
FLUSH PRIVILEGES;
exit

然后尝试从您指定的IP地址建立连接:
mysql -h address-of-remove-server -u root -p

你应该能够连接。

16

您可以通过此命令解决MariaDB的问题:

注意:

GRANT ALL ON *.* to root@'%' IDENTIFIED BY 'mysql root password';

%是通配符。在这种情况下,它指代所有的IP地址。


3
在MySQL中,你需要做的是:(1) 修改my.cnf文件内容;(2) 授权远程用户;(3) 处理防火墙以监听3306端口。 - 未来陆家嘴顶尖的投资人
你救了我的一天。感激不尽! - Almett

10
远程访问MySQL服务器8的数据库:
CREATE USER 'root'@'%' IDENTIFIED BY 'Pswword@123';

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

FLUSH PRIVILEGES;

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