ChatGPT解决这个技术问题 Extra ChatGPT

来自所有主机的 MySQL root 访问权限

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

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

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

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

你能telnet到3306端口的机器吗
MySQL 守护进程很可能不会在 46.xxx 上侦听,而仅在 localhost 上侦听。在 my.cnf 中查找 bind-address
因此,world+dog 现在有了您的 root 密码的哈希值、可以从 Internet 上的任何主机访问 root 的知识以及您 IP 地址的第一个字节。你不认为这只是一点点关注吗?
Enable remote MySQL connection 的可能重复项

B
Benjamin Loison

更新:

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

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


好的,问题是绑定地址。谢谢你。 @Darhazer 也谢谢你 :)
查询当前授权:`SHOW GRANTS FOR 'root'@'%';
要同时允许 root@% 向其他用户授予权限,请在步骤 (a) 之后立即运行: GRANT USAGE ON *.* TO 'root'@'%' WITH GRANT OPTION;
配置文件是(现在)/etc/mysql/mysql.conf.d/mysqld.cnf(至少在标准 Ubuntu 16 上)
我只需要这样做,就能够远程远程连接到服务器:USE mysql; UPDATE user SET Grant_priv='Y' WHERE user='root';
H
HK boy

运行以下查询:

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

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


这不是完美的解决方案。它可能会起作用。对我来说,它产生了一个错误:ERROR 1062 (23000): Duplicate entry '%-root' for key 'PRIMARY'
@Scriptlabs,用户表中可能有多个条目,主机为“localhost”。并且多行有root,包括root.localhost、root.127.0.0.1、root.::1。所以你最好添加一个单独的用户而不是更新,这就是我不赞成这个答案的原因。
不是 FLUSH PRIVILEGES;之后也有必要吗?
这对我有用。尝试这个。 update mysql.user set host='%' where user='root'
使用 double "" 代替 '' 否则会出错
M
Martin Tournoij

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

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

使用 mysql

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

重启mysql服务


ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以在第 1 行的 '*.* TO 'root'@'localhost'' 附近使用正确的语法
对此也有错误。我省略了反斜杠,它起作用了。
这个答案对我有用。伟大的!
I
ItalyPaleAle

有时

绑定地址 = 127.0.0.1

应该

绑定地址 = *


T
The Big Zank

MariaDB 在 Raspbian 上运行 - 包含绑定地址的文件很难查明。 MariaDB 有一些关于此主题的not-very-helpful-info

我用了

# sudo grep -R bind-address /etc 

找到该死的东西在哪里。

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

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

现在一切都很好。


J
Jason Johnson

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

bind-address = 127.0.0.1

bind-address = <Private IP Assigned by Amazon>

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


f
felipe cardenas

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

[mysqld]
bind-address = 127.100.10.234

此 ip 来自 ethX 配置。


请添加更多细节。该设置需要在哪个文件或框架中进行?请更具体地了解 ethX 配置。
i
iHaveacomputer

就我而言,“绑定地址”设置是问题所在。在 my.cnf 中评论此设置确实 not 有帮助,因为在我的情况下,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

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


G
GangaRam Dewasi

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

K
Kieran Foot

mysql_update 是您所需要的。

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