MySQL可以从所有主机访问root权限

191

我在远程Ubuntu机器上安装了MySQL服务器。在mysql.user表中,root用户是这样定义的:

mysql> SELECT host, user, password FROM user WHERE user = 'root';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| localhost        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ip-10-48-110-188 | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| 127.0.0.1        | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
| ::1              | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

我可以使用标准的mysql客户端从同一远程机器命令行界面使用用户root进行访问。现在我想要允许来自互联网上每个主机的root访问,因此我尝试添加以下行(这是以前转储的第一行的精确副本,除了host列):

mysql> SELECT host, user, password FROM user WHERE host = '%';
+------------------+------+-------------------------------------------+
| host             | user | password                                  |
+------------------+------+-------------------------------------------+
| %                | root | *xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx |
+------------------+------+-------------------------------------------+

但是我的个人电脑上的客户端一直告诉我(我遮盖了服务器IP):

SQL错误(2003):无法连接到'46.x.x.x'上的MySQL服务器(10061)

我不知道这是身份验证错误还是网络错误。在服务器防火墙上,我为0.0.0.0/0启用了端口3306/TCP,对我来说没问题......


你能否telnet到3306端口的机器? - mihaisimi
3
可能性最大的是MySQL守护程序没有在46.x.x.x上监听,而只在本地主机上进行监听。请查找my.cnf文件中的“bind-address”设置。 - Maxim Krizhanovsky
1
所以,全世界现在都有你的根密码的哈希值,知道可以从互联网上的任何主机访问根用户,并且知道你IP地址的第一个字节。你难道不觉得这只是一点点令人担忧吗? - eggyal
可能是启用远程MySQL连接的重复问题。 - user
10个回答

445

更新:

如评论中所述,自 MySql 8 版本开始,您需要先显式创建用户,因此命令将如下所示:

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

翻译后的文本:

这个过程有两个步骤:

a) 授予权限。以 root 用户身份执行以下命令,将 'password' 替换为您当前的 root 密码:

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'password';
b) 绑定到所有地址:

最简单的方法是在您的my.cnf文件中注释掉该行:

#bind-address = 127.0.0.1 

并重新启动mysql

service mysql restart

默认情况下,它仅绑定到本地主机,但如果您注释掉该行,则会绑定到它找到的所有接口。注释掉该行等同于 bind-address=*

要检查 mysql 服务绑定到哪里,请以 root 身份执行:

netstat -tupan | grep mysql

Ubuntu 16 更新:

配置文件现在是:

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

(至少在标准的Ubuntu 16上)


5
好的,问题出在绑定地址上。谢谢。@Darhazer 也谢谢你 :) - lorenzo-s
3
查询当前授权信息:SHOW GRANTS FOR 'root'@'%'; - robsch
5
为了让root@%用户能够授权给其他用户,紧接着步骤(a)运行以下命令:GRANT USAGE ON . TO 'root'@'%' WITH GRANT OPTION; - Caleb
2
我只需要执行以下操作,就可以远程连接到服务器了:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root'; - Sviderskiy Dmitriy
1
从MySQL 8.0开始,您不能再使用“GRANT”命令(隐式地)创建用户。请使用“CREATE USER”后跟“GRANT”。例如:CREATE USER 'root'@'%' IDENTIFIED BY 'root'; GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; - Arseniy Banayev
显示剩余13条评论

49

运行以下查询:

use mysql;
update user set host='%' where host='localhost'

注意:不建议用于生产环境。


3
这并不是完美的解决方案,它可能有效。对我来说,它产生了一个错误: ERROR 1062 (23000):主键“PRIMARY”上有重复条目“%-root”。 - Scriptlabs
2
@Scriptlabs,很有可能用户表中有多个主机名为“localhost”的条目。而且还有多行root,包括root.localhost、root.127.0.0.1和root.::1。因此,最好添加一个单独的用户而不是更新现有用户,这就是我为什么要对这个答案进行负评的原因。 - Mike Purcell
7
在执行完<code>GRANT</code>或<code>ALTER USER</code>等特定语句后,通常需要使用<code>FLUSH PRIVILEGES;</code>命令来重新加载MySQL的权限表以使更改生效。因此,在这些语句之后运行<code>FLUSH PRIVILEGES;</code>是必要的。 - Nom1fan
7
这对我有效。尝试一下。 update mysql.user set host='%' where user='root' - nur zazin
使用双引号 "" 而不是单引号 '',否则会出现错误。 - Fernando Torres
显示剩余2条评论

26

MYSQL 8.0 - 打开mysql命令行客户端

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';  

使用mysql

UPDATE mysql.user SET host='%' WHERE user='root';  

重新启动mysql服务


错误 1064 (42000):您的 SQL 语法存在错误;请检查与您的 MySQL 服务器版本相对应的手册以获取正确的语法,位于第一行附近的 '*.* TO 'root'@'localhost''。 - Fernando Torres
这个也出错了。我忘记加反斜杠了,加上后就可以运行了。 - Sean O
这个答案对我有用。太好了! - Anh Nhat Tran

11

有时候

绑定地址 = 127.0.0.1

应该改为

绑定地址 = *


5

在Raspbian上运行MariaDB - 包含bind-address的文件很难找到。 MariaDB在这个主题上提供了一些不太有用的信息,详见此处

我使用了

# sudo grep -R bind-address /etc 

我需要找到该死的东西在哪里。

我还必须像其他人指出的那样,在mysql中设置特权和主机。

我还花了一些有趣的时间打开3306端口,以便远程连接到我的Raspberry Pi - 最终使用了iptables-persistent

现在一切都很好。


2

我正在使用AWS LightSail,为了让我的实例正常工作,我需要更改以下内容:

bind-address = 127.0.0.1

to

bind-address = <Private IP Assigned by Amazon>

随后我成功远程连接。


1
在我的情况下,“bind-address”设置是问题所在。注释掉my.cnf中的这个设置没有帮助,因为在我的情况下,MySQL由于某种原因将默认值设置为127.0.0.1。
要验证MySql当前使用的设置,请在本地命令行上打开它:
mysql -h localhost -u myname -pmypass mydb

读取当前设置:

Show variables where variable_name like "bind%"

如果您希望允许所有主机访问,请在此处看到0.0.0.0。如果不是这种情况,请编辑/etc/mysql/my.cnf并在[mysqld]部分下设置bind-address:

bind-address=0.0.0.0

最后,重新启动您的 MySql 服务器以使用新设置:
sudo service mysql restart

请再试一次并检查新设置是否已生效。


1

请在/etc/mysql/mysql.conf.d/mysqld.cnf中更新bind-address = 0.0.0.0,并从mysql命令行允许root用户从任何IP连接。

以下是唯一可用的命令,适用于mysql-8.0,因为其他命令会出现错误syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTIFIED BY 'abcd'' at line 1

GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost';
UPDATE mysql.user SET host='%' WHERE user='root';

重新启动mysql客户端。
sudo service mysql restart

1
如果您的操作系统连接了多个网络,您必须在my.conf文件的bind-address中指定其中一个网络。例如:
[mysqld]
bind-address = 127.100.10.234

这个IP地址来自于ethX的配置。


1
请添加更多细节。该设置需要在哪个文件或框架中进行?请更具体地说明ethX的配置。 - BPS

-2

mysql_update 就是你所需要的。

我不知道为什么有人会选择更复杂的方式来修正这个问题,因为 MySql 已经慷慨地建立了一个可以做到这一点的工具...


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