我已经在远程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进行访问.现在我想添加allow root access from every host on the internet行,所以我try 添加以下行(除了host列之外,它与上一次转储的第一行完全相同):

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

但我个人电脑上的客户继续告诉我(我屏蔽了服务器IP):

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

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

推荐答案

Update:

如 comments 中所述,由于MySql 8需要首先显式创建用户,因此命令如下所示:

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

Original answer:

这个过程有两个步骤:

a) 授予特权.当root用户使用当前root密码替换'password'执行时:

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

b) 绑定到所有地址:

最简单的方法是在my.cnf文件中输入comment out行:

#bind-address = 127.0.0.1 

然后重启mysql

service mysql restart

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

要判断mysql服务绑定到哪里,请以root用户身份执行:

netstat -tupan | grep mysql

Update For Ubuntu 16:

配置文件是(现在)

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

(至少在标准Ubuntu 16上)

Mysql相关问答推荐

为什么我安装MySQL时不能使用3306端口?

基于多行从表中 Select

获取最大登录应用程序用户数以及何时

SQL Select 最大值和平均值

MySQL 计数出现的百分比大于

SQL 请求:REPLACE 和通配符 %.如何做正确的事?

如何用sql找出两次之间的差异

MySql SELECT 查找包含数字的区间的时间复杂度是多少?

为什么order by子句可以利用索引?

创建表时我的 SQL 语句有什么问题

MySQL表中给定字段的每个不同值的连续记录形成对

mysql 执行注释部分

基于两个单元格值的 SQL 过滤表

MySQL 添加一个 NOT NULL 列

重新加载 .env 变量而不重新启动服务器(Laravel 5,共享主机)

在连接条件上使用 IS NULL 或 IS NOT NULL - 理论问题

MySQL 中的 VARCHAR(255) 和 TINYTEXT 字符串类型有什么区别?

WHERE 子句中的条件顺序会影响 MySQL 性能吗?

如何从两个不同的日期获得年份差异?

在 Postgresql 中模拟 MySQL 的 ORDER BY FIELD()