试着

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

得到

错误1064(42000):你有一个错误的SQL语法;查看手册 对应于你的MySQL服务器版本,正确的语法使用'IDENTIFIED BY 'root' WITH GRANT OPTION'在第一行。

注意:在以前的版本中尝试时,相同的工作。

也试过

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;

得到

错误1410(42000):不允许使用GRANT创建用户

MySQL(8.0.11.0)用户名/密码为root/root。


当前回答

指定的用户在您的MySQL上不存在(因此,MySQL试图像在版本8之前那样使用GRANT创建它,但由于此版本引入的限制而失败)。

MySQL在这一点上是相当愚蠢的,所以如果你有'root'@'localhost',并试图授予'root'@'%'特权,它将它们视为不同的用户,而不是任何主机上的广义root用户,包括localhost。

错误消息也具有误导性。

因此,如果您得到错误消息,请使用以下内容检查现有用户

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;

然后创建缺失的用户(正如Mike建议的那样),或者将GRANT命令调整为实际存在的用户规范。

其他回答

我在CentOS上也有同样的问题,这为我工作了(版本:8.0.11):

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'

指定的用户在您的MySQL上不存在(因此,MySQL试图像在版本8之前那样使用GRANT创建它,但由于此版本引入的限制而失败)。

MySQL在这一点上是相当愚蠢的,所以如果你有'root'@'localhost',并试图授予'root'@'%'特权,它将它们视为不同的用户,而不是任何主机上的广义root用户,包括localhost。

错误消息也具有误导性。

因此,如果您得到错误消息,请使用以下内容检查现有用户

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;

然后创建缺失的用户(正如Mike建议的那样),或者将GRANT命令调整为实际存在的用户规范。

我也有同样的问题,所以来了这里。特别地,对于本地开发,我希望能够在没有sudo的情况下执行mysql -u root -p。我不想创建一个新用户。我想从本地PHP web应用程序使用根。

错误消息具有误导性,因为默认的'root'@'%'用户权限没有任何问题。

相反,正如一些人在其他答案中提到的那样,解决方案只是在我的/etc/mysql/mysql.conf.d/mysqld.cnf配置中设置bind-address=0.0.0.0而不是bind-address=127.0.0.1。其他方面不需要更改。

这只是我对这个问题的看法。我有完全相同的问题,试图从MySQL工作台连接。我正在运行一个bitnami-mysql虚拟机来为开发设置一个本地沙盒。

Bitnami的教程说要运行“Grant All Privileges”命令:

/opt/bitnami/mysql/bin/mysql -u root -p -e "grant all privileges on *.* to 'root'@'%' identified by 'PASSWORD' with grant option";

这显然行不通,最后我用Mike Lischke的答案让它起作用了。

我认为发生的情况是root@%用户有与之关联的错误凭据。因此,如果你试图修改用户的特权,但运气不好,尝试:

删除用户。 重新创建用户。 确保在MySQL配置文件上有正确的绑定。 在我的例子中,我已经注释掉了这行,因为它只是用于沙盒环境。


1. 删除用户。

从Mysql控制台:

列出用户(有助于查看所有用户):

select user, host from mysql.user;

删除期望用户:

drop user '{{ username }}'@'%';

2. 重新创建用户。

创建用户并授予权限:

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

执行如下命令:

FLUSH PRIVILEGES;

3.确保在MySQL配置文件上有正确的绑定。

找到您的MySQL配置文件(附加说明在最后)。如果你想让MySQL监听多个网络上的连接,在配置文件中找到下面这行:

bind-address=127.0.0.1

并使用“#”注释它:

#bind-address=127.0.0.1

对于生产环境,您可能希望使用限制网络访问(最后的附加说明)。

然后重新启动MySQL服务。

希望这对有同样问题的人有所帮助!


绑定:如果你想了解更多,我建议你看看下面的内容 解决方案如何将MySQL服务器绑定到多个IP地址。它 基本上是说你可以打开MySQL,限制连接 防火墙,或者如果你的MySQL版本是8.0.13或更高。

该文件可以有不同的位置,这取决于你的 Linux分发和安装。在我的系统里,地址是 ”“/ etc / my . cnf中所做。以下是其他推荐地点: /etc/mysql/mysql.conf.d /etc/mysql/my.cnf 你也可以搜索配置位置,如本网站所示: 如何找到MySQL配置文件的位置。

ubuntu 22.04.1 Mysql版本8.0.31-0

我的根用户没有GRANT权限,所以我不能授予新用户任何权限。 解决方案是删除当前的根用户,并使用'mysql_native_password'创建一个新用户。

命令如下 以root用户登录mysql

mysql> DROP USER 'root'@'localhost' IDENTIFIED BY 'PASSWORD' FROM mysql.user;
mysql> CREATE USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'password';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'locahost' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;