177

我已经在远程 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 |
+------------------+------+-------------------------------------------+

我可以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)

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

4

10 回答 10

414

更新:

正如评论中提到的,由于 MySql 8 您需要首先显式创建用户,因此命令将如下所示:

CREATE USER 'root'@'%' IDENTIFIED BY 'root'; 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

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

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

netstat -tupan | grep mysql

Ubuntu 16 更新:

配置文件是(现在)

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

(至少在标准 Ubuntu 16 上)

于 2012-06-27T11:53:56.633 回答
46

运行以下查询:

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

注意:不推荐用于生产用途。

于 2014-06-12T17:24:27.910 回答
20

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

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

使用 mysql

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

重启mysql服务

于 2018-10-30T11:15:33.160 回答
11

有时

绑定地址 = 127.0.0.1

应该

绑定地址 = *

于 2015-08-16T17:57:42.857 回答
5

MariaDB 在 Raspbian 上运行 - 包含绑定地址的文件很难查明。MariaDB 有一些关于这个主题的不太有用的信息

我用了

# sudo grep -R bind-address /etc 

找到该死的东西在哪里。

就像上面提到的每个人一样,我还必须在 mysql 中设置权限和主机。

并且在打开 3306 端口以远程连接到我的 Raspberry Pi 时也玩得很开心——最后使用了iptables-persistent

现在一切都很好。

于 2017-10-01T16:17:14.703 回答
1

如果您的操作系统连接了许多网络,您必须在 my.conf 文件的绑定地址中指定其中一个网络。一个例子:

[mysqld]
bind-address = 127.100.10.234

此 ip 来自 ethX 配置。

于 2017-04-21T20:10:11.990 回答
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=0.0.0.0

最后重新启动您的 MySql 服务器以获取新设置:

sudo service mysql restart

重试并检查是否已选择新设置。

于 2017-09-26T21:21:47.347 回答
1

bind-address = 0.0.0.0/etc/mysql/mysql.conf.d/mysqld.cnfmysql 命令行中更新并允许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
于 2020-09-17T20:13:17.413 回答
1

我正在使用 AWS LightSail,为了让我的实例正常工作,我必须进行更改:

bind-address = 127.0.0.1

bind-address = <Private IP Assigned by Amazon>

然后我就可以远程连接了。

于 2020-12-12T00:30:48.623 回答
-2

mysql_update是你需要的。

我不知道为什么有人会遵循更复杂的方法来纠正这个问题,当 MySql 慷慨地构建了一个已经这样做的工具时......

于 2018-08-19T10:24:10.673 回答