来自所有主机的MySQL根访问


152

我已经在远程Ubuntu计算机上安装了MySQL服务器。通过以下方式rootmysql.user表中定义用户:

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 |
+------------------+------+-------------------------------------------+

我可以root使用标准mysql客户端从同一远程计算机命令行界面与用户访问。现在,我想允许来自Internet上每台主机的root用户访问权限,因此我尝试添加以下行(它与上一个转储的第一行完全相同,但该host列除外):

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

但是我的个人PC上的客户端继续告诉我(我掩盖了服务器IP):

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

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


您可以通过telnet到端口3306上的计算机吗
mihaisimi 2012年

3
MySQL守护程序很可能不会在46.xxx上侦听,而仅在localhost上侦听。bind-address在my.cnf中查找
Maxim Krizhanovsky 2012年

1
因此,world + dog现在有了您的root密码的哈希值,知道可以从Internet上的任何主机访问root以及IP地址的第一个字节。你不认为这只是一个很小的位有关?
eggyal 2012年

Answers:


362

该过程分两个步骤:

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

2
查询当前的授权:`SHOW GRANTS FOR'root'@'%';
罗布(Robsch)2015年

5
为了还允许root @%向其他用户授予权限,请在步骤(a)之后立即运行:GRANT USAGE ON *。* TO GRANT OPTION'@'%'WITH GRANT OPTION;
卡莱布

1
配置文件是(现在)/etc/mysql/mysql.conf.d/mysqld.cnf(至少在标准Ubuntu 16上)
jgp

2
我只需要这样做,便可以远程连接到服务器:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
Sviderskiy Dmitriy

35

运行以下查询:

use mysql;

update user set host='%' where host='localhost'

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


2
这不是完美的解决方案。它可能会起作用。对我来说,它产生了一个错误:错误1062(23000):键“ PRIMARY”的条目“%-root”重复
Scriptlabs

2
@Scriptlabs,用户表中可能有多个条目,且主机为“ localhost”。并带有root多行,包括root.localhost,root.127.0.0.1,root。:: 1。因此,您最好添加一个单独的用户而不是进行更新,这就是为什么我对此答案不满意。
Mike Purcell

4
不是平常的特权;之后还需要吗?
Nom1fan

1
这为我工作。试试这个。update mysql.user set host='%' where user='root'
nur zazin


7

MYSQL 8.0-打开mysql命令行客户端
GRANT ALL PRIVILEGES ON *。* TO'root'@'localhost';
使用mysql
UPDATE mysql.user SET host ='%'WHERE user ='root';
重启mysql服务


4

运行在Raspbian上的MariaDB-很难确定包含bind-address的文件。MariaDB 在这个问题上有一些不太有用的信息

我用了

# sudo grep -R bind-address /etc 

找到该死的东西在哪里。

我还必须像上面的每个人一样在mysql中设置特权和主机。

并且还很开心地打开了3306端口以远程连接到我的Raspberry Pi-终于使用了iptables-persistent

现在一切都很好。


1

如果您的操作系统连接了许多网络,则必须在my.conf文件的bind-addres中指定该网络之一。一个例子:

[mysqld]
bind-address = 127.100.10.234

此ip来自ethX配置。


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

1

就我而言,“绑定地址”设置是问题所在。谈及此设置中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

再试一次,检查是否已选择新设置。


-2

mysql_update 是您所需要的。

我不知道为什么当MySql优雅地构建了一个已经可以执行此操作的工具时,为什么有人会遵循更复杂的方法来更正此问题...

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.