如何在MySQL 8.0中授予root用户所有特权


116

试过了

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

得到

错误1064(42000):您的SQL语法有错误;在第1行的“ IDENTIFIED BY'root'WITH GRANT OPTION'”附近使用与MySQL服务器版本相对应的手册,以获取正确的语法。

注意:在以前的版本中尝试时,该方法同样有效。

也尝试过

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

得到

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

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


您直接与mysql连接还是使用ssh?
哈拉尔德

以root用户身份从命令提示符直接访问
Praveen

1
请参见13.7.1.6 GRANT语法13.7.1.4 GRANT语法之间的区别。
wchiquito

7
我也陷入了同样的问题。我正在使用启动mysql shell mysql -u root -p,然后输入root密码。然后,我尝试了一下GRANT GRANT OPTION ON *.* TO 'root'@'%';,但得到了错误ERROR 1410 (42000): You are not allowed to create a user with GRANT
aiman '18

Answers:


203

从MySQL 8开始,您不再可以(隐式)使用GRANT命令创建用户。请改用CREATE USER,然后使用GRANT语句:

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

关于的安全风险的警告WITH GRANT OPTION,请参阅:


3
此命令将创建一个新用户。但是我想向现有的root用户授予特权。mysql> CREATE USER'root'@'%'由'root'标识;查询行,受影响的0行(0.31秒)的MySQL> GRANT ALL PRIVILEGES ON 以格兰特选项“ root” @“%”;查询确定,受影响的0行(0.16秒)mysql> SELECT User FROM mysql.user; + ------------------ + | 用户| + ------------------ + | 根| | mysql.infoschema | | mysql.session | | mysql.sys | | 根| + ------------------ +设置5行(0.00秒)
Praveen

现在,用户表中存在两个名称为root的用户!另外,我无法远程连接(root用户)。-------------详细信息:类型:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException SQL状态:08001
Praveen

奇怪的。您问题中的错误消息表明该用户不存在。这是我建议首先创建它的唯一原因。而且在一个MySQL实例中不可能有相同的用户两次。它们的名称或主机部分不同。
迈克·里施克(Mike Lischke)'18年

2
这2个用户从不同的主机连接。SELECT User, Host FROM mysql.user;改为运行。
迈克·里施克(Mike Lischke)'18年

3
明白了错误:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
ADI公司

32

1)这对我有用。首先,创建一个新用户。示例:foo具有密码的用户bar

> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';

2)将以下代码替换为带有'foo'的用户名。

> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';

注意:database_name是您要拥有特权的数据库意味着全部

3)以用户foo身份登录

mysql> mysql -u foo -p

密码:bar

4)确保使用pw bar将来自Sequelize的初始连接设置为foo。


5
到目前为止,这还不能回答问题。这是关于全局权限,而不是数据库特定的权限。
tmuecksch

30

我看到很多(错误的)答案,就这么简单:

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'pass';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;

注意:user您可以使用自己创建root的数据库来代替自己创建的数据库。但是,使用默认的root帐户让应用程序连接到数据库不是首选方法。

替代特权(请注意并记住最小特权原则):

-- Grant user permissions to all tables in my_database from localhost --
GRANT ALL ON my_database.* TO 'user'@'localhost';

-- Grant user permissions to my_table in my_database from localhost --
GRANT ALL ON my_database.my_table TO 'user'@'localhost';

-- Grant user permissions to all tables and databases from all hosts --
GRANT ALL ON *.* TO 'user'@'*';

如果您以某种方式遇到以下错误:

错误1130(HY000):不允许主机“ 1.2.3.4”连接到该MySQL服务器

您需要在其中添加/更改以下两行,/etc/mysql/my.cnf然后重新启动mysql:

bind-address           = 0.0.0.0
skip-networking

您能详细说明为什么它不起作用而不仅仅是抱怨吗?这样,我可以为您提供帮助或发布其他信息。
Nebulastic

这个答案甚至没有解决root用户特权的问题。
约瑟夫

相应地更新了答案。
Nebulastic

1
最佳答案,现在GRANT ALL ON适用于MySQL 8.0。我也相信,除了禁用它之外,bind-address您还可以绑定127.0.0.1并包含--protocol=tcp在任何命令中。长期的性能也优于localhost
杰西·尼克尔斯

4

我的规格:

mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)

对我有用的是:

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;

两个查询的响应:

Query OK, O rows affected (0.10 sec*)

注意:我之前创建了一个数据库(db_name),并且正在创建具有授予数据库中所有表所有特权的用户凭证,而不是使用我在某处读取的默认root用户。


3

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

MySQL在这一点上非常愚蠢,因此,如果您具有'root'@'localhost'并尝试向'root'@'%'授予特权,它将把它们视为不同的用户,而不是针对任何主机上的root用户的通用概念,包括本地主机

该错误信息也具有误导性。

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

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

然后创建丢失的用户(按照Mike的建议),或将GRANT命令调整为实际的现有用户规范。


这对我来说是一个有效的解决方案!我只是无法准确键入user @行。在尝试其他建议的解决方案之前,请务必检查此内容。对我来说是:CREATE USER'user'@'%domain.com',然后当我发出失败的GRANT语句时,我的语法被一个'。'代替。看起来像这样GRANT .... TO'user'@'%.domain.com'。我忘了放'。在我的create语句中,它对解决此问题至关重要。
wallisds

2

在这个问题上只有我的2美分。我在尝试从MySQL Workbench连接时遇到了完全相同的问题。我正在运行一个bitnami-mysql虚拟机来设置用于开发的本地沙箱。

Bitnami的教程说可以运行“授予所有特权”命令:

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

显然这是行不通的,我终于使用Mike Lischke的答案使它起作用。

我认为发生的是root @%用户具有与其关联的错误凭据。因此,如果您尝试修改用户的权限并且没有运气,请尝试:

  1. 删除用户。
  2. 再次创建用户。
  3. 确保在my.cnf配置文件上具有正确的绑定。就我而言,我已经注释掉了该行,因为它仅用于沙箱环境。

从Mysql控制台:

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

select user, host from mysql.user;

删除所需用户:

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

创建用户和授予权限:

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

运行以下命令:

FLUSH PRIVILEGES;

找到您的mysql配置文件“ my.cnf”,然后查找如下所示的行:

bind-address=127.0.0.1

并用'#'注释:

#bind-address=127.0.0.1

然后重启你的mysql服务。

希望这可以帮助遇到同样问题的人!


1

这为我工作:

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

1

检查您的用户名和域与之前创建的用户名和域相同。Mysql通过用户表中的两个列选择帐户。如果不同,则mysql可能认为您想通过Grant创建一个新帐户,此版本在8.0版本之后不支持。


1

我的规格:

mysql --version
mysql  Ver 8.0.19 for Linux on x86_64 (MySQL Community Server - GPL)

对我有用的是:

mysql> USE mysql;
mysql> UPDATE User SET Host='%' WHERE User='root' AND Host='localhost';

尽管它会在您的特定情况下起作用。这段SQL语法会更新用户,并且不会设置用户帐户。它还不授予特权。
Nebulastic

0

好吧,我只是遇到了同样的问题。即使路由具有“%”也无法远程连接。现在,看看my.ini文件(Windows中的配置文件),该bind-address语句丢失了。

所以...我把这个bind-address = *放了,[mysqld]然后重新启动了服务。现在可以了!


这实际上是最接近正确答案的。
约瑟夫

0

1.授予特权

mysql>授予所有特权。通过授予选项来'root'@'%';

mysql>冲洗特权

2.检查用户表:

mysql>使用mysql

mysql>选择主机,用户从用户 在此处输入图片说明

3,修改配置文件

mysql默认绑定ip:127.0.0.1,如果要远程访问服务,只需删除配置

#Modify the configuration file
vi /usr/local/etc/my.cnf

#Comment out the ip-address option
[mysqld]
# Only allow connections from localhost
#bind-address = 127.0.0.1

4.最终重启服务

brew服务重启mysql


尽管这可以工作,但在授予某些特权时,我绝不会在生产中重启mysql实例。而是尝试刷新特权。
Nebulastic

-1

这可能起作用:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';

1
除了说明代码之外,还请解释为什么它是适当的解决方案。目的是进行教育,以便OP知道下次该怎么做,而不仅仅是解决眼前的问题。
锡人

-1

我遇到了同样的问题,这使我陷入了困境。特别是,对于地方发展,我希望能够做到mysql -u root -psudo。我不想创建一个新用户。我想root从本地PHP Web应用程序使用。

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

相反,正如其他答案中提到的那样,解决方案只是设置bind-address=0.0.0.0而不是bind-address=127.0.0.1在我的/etc/mysql/mysql.conf.d/mysqld.cnf配置中。否则无需进行任何更改。


这甚至不能完全回答问题。
Nebulastic

-2

我在CentOS上遇到了同样的问题,这对我有用(版本:8.0.11):

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

错误1064(42000):您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以获取在'附近使用的正确语法。在第1行上'root'@'%''
GDefender

mysql>授予所有特权。到'root'@'%'; 错误1064(42000):您的SQL语法有错误;查看与您的MySQL服务器版本相对应的手册,以获取在'附近使用的正确语法。
TO'root
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.