MySQL 8 远程访问

32

我通常会正确设置 MySQL 以实现远程访问。

但是目前我遇到了 MySQL 8 的问题。

首先,在 mysql.conf.d/mysqld.cnf 文件中,我没有任何 bind-address 行,所以我手动添加了它 (bind-address 0.0.0.0) 并授予了 '%' 用户的访问权限。

当我连接时,收到了 "身份验证失败" 的消息。

但在本地主机/命令行上却可以正常工作。


我认为您需要注释绑定地址并从root上授予'%'的权限。 - user8406805
你可能遇到了麻烦,因为MySQL 8更改了默认的身份验证插件,一些客户端需要升级。另一种选择是配置您的MySQL 8实例以使用传统的mysql_native_password插件。很难确定,因为您没有提供有关如何连接(客户端、语言等)的详细信息。请阅读https://dev.mysql.com/doc/refman/8.0/en/upgrading-from-previous-series.html#upgrade-caching-sha2-password。 - Bill Karwin
我在根目录上授予权限,主机为“%”。 我尝试从我的计算机使用dbForge Studio(一个数据库客户端)进行连接。 我还阅读了关于MySQL 8的升级更新,但没有看到任何与远程访问升级有关的内容。 - sHaDeoNeR
好的,我已经更新到旧的身份验证系统,现在出现错误:“此服务器版本8.0.11目前不受支持。”我正在使用Dbforge进行检查。 - sHaDeoNeR
4个回答

62
  1. my.ini文件中删除或注释掉bind_address参数。

(该文件名因操作系统而异。在Linux上,my.ini实际上是位于目录/etc/mysql/下的my.cnf文件。)

  1. 重启服务。
  2. 创建root用户(是新用户,因为现有的用户是'root@localhost',仅限本地访问):

    CREATE USER 'root'@'%' IDENTIFIED BY '123';

  3. 赋予权限:

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

对于DBA用户,在末尾添加WITH GRANT OPTION

例如:CREATE USER 'root'@'%' IDENTIFIED BY '123' WITH GRANT OPTION;


因为使用 CREATE with GRANT 没有效果吗?

MySQL 8不能再使用GRANT创建用户,因此如果您尝试与GRANT一起使用IDENTIFIED BY '123',则会出现错误,这是最常见的错误。


1
这个很好用,感谢分享你的回复。 - jpruiz114
1
谢谢,它起作用了。但是文件名因操作系统而异。在Linux上,“my.ini”实际上是位于目录“/etc/mysql/”中的“my.cnf”。 - realhu
1
认证插件“caching_sha2_password”无法加载:找不到指定的模块。 - Pažout
1
我认为答案中有一个错误。WITH GRANT OPTION子句不适用于CREATE USER语句,而适用于GRANT语句。 - malloc4k
1
完美的答案...... - Umair Ayub
显示剩余4条评论

24

MySQL 8中的远程访问:

1) 允许任意主机访问

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

bind-address            = 0.0.0.0

2) 允许用户从任何地方访问:

mysql

GRANT ALL PRIVILEGES ON *.* TO 'root'@'%';
UPDATE mysql.user SET host='%' WHERE user='root';

3) 更改认证方式为密码

ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'ThePassword';

3
除非你不想对root账户进行这样的操作,否则这只会打开另一个攻击向量。创建一个新账户,仅授予其所需的访问权限,而不是使用超级用户(SUPER User)。 - RiggsFolly
@DivinesLight,为什么我的答案是错误的? - rbz
你可能需要一个'root'@'%'来开始。 - mckenzm

14

遇到相同的问题,连接到MySQL Workbench并更新用户权限。

MySQL版本:8.0.20 Community。 操作系统:Windows 10。

  1. 打开MySQL Workbench -> Server -> Users and Privileges
  2. 选择用户
  3. 将Limit to Hosts Matching更改为“%”,以便从任何主机访问。
  4. 应用更改。
  5. 如有必要,请重新启动MySQL服务。 对我来说,无需重新启动就可以正常运行。

截图, MySQL Workbench 8.0.20


2
这是MySQL 8的完美和最佳解决方案。忘记bind_address或bind-address的所有内容,应用此技巧。 - MERT DOĞAN
这个方法很有效,只用了两分钟就完成了。我本来在8中寻找mysql.ini文件,但后来发现了这个方法。 - Cyril Gupta

3
对于MySQL 8,打开mysqld.cnf文件。
sudo nano /etc/mysql/mysql.conf.d/mysqld.cnf

修改或添加 bind-address 选项:

[mysqld]
bind-address = 0.0.0.0

重启 mysql 服务

sudo service mysql restart

3
在手册8.0中,将bind-address更改为bind_address链接 - rbz
3
不要修改cnf文件,不要添加"bind-address"或"bind_address"。正确的解决方案是授予root用户(或其他用户)远程访问权限,因为root用户只有本地访问权限:sudo mysql -u root -p

CREATE USER 'root'@'%' IDENTIFIED BY '1234567890';

GRANT ALL PRIVILEGES ON . TO 'root'@'%';

sudo systemctl restart mysql
- jpruiz114
授予 'root'@'%' 所有数据库的所有权限; - jonincanada

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接