提问者:小点点

所有主机的MySQL根访问


我已经在一台远程Ubuntu机器上安装了MySQL服务器。root用户在mysql.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 |
+------------------+------+-------------------------------------------+

我可以使用标准的MySQL客户端,通过用户root从同一远程计算机命令行界面进行访问。现在我想允许internet上每台主机的根用户访问,所以我尝试添加以下行(它与上一个转储中的第一行完全重复,除了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,这对我来说是可以的...


共1个答案

匿名用户

在这个过程中有两个步骤:

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

默认情况下,它只绑定到localhost,但如果注释该行,它将绑定到它找到的所有接口。注释掉该行相当于bind-address=*

要检查mysql服务绑定的位置,请以root身份执行:

netstat -tupan | grep mysql

Ubuntu 16更新:

配置文件(现在)

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

(至少在标准Ubuntu 16上)