来自所有主机的 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。现在我想添加 允许互联网上每个主机的 root 访问,所以我尝试添加以下行(它与前一个转储的第一行完全相同,除了 host列) :

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

但是我的客户在我的个人电脑上继续告诉我(我模糊了服务器 IP) :

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

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

620719 次浏览

更新:

正如注释中提到的,由于 MySql 8需要首先显式创建用户,因此该命令将类似于:

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

原答案:

这个过程有两个步骤:

A)授予特权。作为 root 用户执行时,用当前 root 密码替换 'password':

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 service 绑定到作为 root 用户执行的位置:

netstat -tupan | grep mysql

Ubuntu 16更新:

配置文件是(现在)

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

(至少在标准的 Ubuntu 16上)

运行以下查询:

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

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

有时候

Bind-address = 127.0.0.1

应该是

Bind-address = *

如果有许多网络连接到操作系统,那么您必须在 my.conf 文件的 bind-addres 中指定其中一个网络。 例如:

[mysqld]
bind-address = 127.100.10.234

这个 IP 来自 ethX 配置。

在我的例子中,“ 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

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

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

我用过

# sudo grep -R bind-address /etc

找到那该死的东西在哪里。

我还必须在 mysql 中设置特权和主机,正如上面所指出的那样。

而且还有一些有趣的时间打开3306端口远程连接到我的树莓派-最后使用 Iptables-持久性

现在一切都很顺利。

你需要的是 mysql_update

我不知道为什么有人会遵循更复杂的方式来纠正这个问题,当 MySql 优雅地构建了一个工具,已经做到了这一点..。

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

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

使用 mysql

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

重新启动 mysql 服务

更新 /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

我正在使用 AWS LightSail,为了让我的实例工作,我必须做出改变:

bind-address = 127.0.0.1

bind-address = <Private IP Assigned by Amazon>

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