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

282

尝试过

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

接收中

ERROR 1064 (42000):您的SQL语法有误;请检查与您的MySQL服务器版本对应的手册,以获取正确的语法使用方式,在第1行附近的“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。


2
查看13.7.1.6 GRANT Syntax13.7.1.4 GRANT Syntax之间的区别。 - wchiquito
26
我被同一个问题困扰。我使用 mysql -u root -p 命令启动 MySQL shell,然后输入 root 密码。接着我尝试执行 GRANT GRANT OPTION ON *.* TO 'root'@'%'; 命令,但是出现了错误信息 ERROR 1410 (42000): You are not allowed to create a user with GRANT。请帮我翻译以上内容。 - aiman
5
@Praveen,你会在这里接受任何答案吗? - Mike Lischke
我的朋友,解决方法是什么?我也在收到同样的错误! - Raul Chiarella
我的问题是我试图授予权限给一个不存在的账户。 - late1
显示剩余2条评论
24个回答

535

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

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

注意:关于 WITH GRANT OPTION 的安全风险,请参见:


24
这个命令将创建一个新用户。但我想授予现有的root用户权限。mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root'; 查询成功,0行受影响(用时0.31秒)mysql> GRANT ALL PRIVILEGES ON . TO 'root'@'%' WITH GRANT OPTION; 查询成功,0行受影响(用时0.16秒)mysql> SELECT User FROM mysql.user; +------------------+ | User | +------------------+ | root | | mysql.infoschema | | mysql.session | | mysql.sys | | root | +------------------+ 共计5行记录(用时0.00秒) - Praveen
3
这两个用户来自不同的主机。请改为运行 SELECT User, Host FROM mysql.user; 命令。 - Mike Lischke
14
遇到了这个错误:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES),意思是使用给定的密码无法访问本地主机上的root用户。 - Adil
1
错误 1410 (42000):您不被允许使用GRANT创建用户 / CentOS 8 / MySQL 8 - mercury
似乎只有在执行了FLUSH PRIVILEGES之后才能生效;先运行这个。 - undefined
显示剩余12条评论

140

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

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

注意:使用默认的root账户连接数据库并不是首选的方式,您可以使用root代替自己创建的user。但是,允许应用程序使用默认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'@'*';

如果你遇到以下错误:

ERROR 1130 (HY000):主机'1.2.3.4'不被允许连接到此MySQL服务器

你需要在/etc/mysql/my.cnf文件中添加/更改以下两行,并重新启动MySQL:

bind-address           = 0.0.0.0
skip-networking

您可能会遇到以下有点令人困惑的错误:

ERROR 1410(42000):您不允许使用GRANT创建用户

这意味着要么该user根本不存在,要么user@host组合不存在。您可以使用以下命令轻松检查它:

SELECT host, user FROM user

3
这个回答甚至没有涉及到root用户权限的问题。 - Joseph8th
根据要求更改了答案。 - Cloudkollektiv
3
最佳答案是,对于MySQL 8.0现在应该使用“GRANT ALL ON”。我认为,与其禁用“bind-address”,不如绑定到“127.0.0.1”,并在任何命令中包含“--protocol=tcp”。长期来看,性能也比“localhost”好。 - Jesse Nickles
2
除了我的回答之外,其他所有回答都忽略了问题的关键点,即 OP 想知道为什么不能再使用 GRANT 命令创建用户。从来没有人问过如何使用 GRANT 授予权限。但不知怎么的,人们总是拒绝阅读之前已经被问过和回答过的内容。 - Mike Lischke
似乎只有在执行FLUSH PRIVILEGES之后才能正常工作;首先尝试在安全模式下执行此操作。 - undefined
显示剩余5条评论

42

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)确保Sequelize的初始连接设置为foo,密码为bar。


9
这远远不能回答问题。它涉及全局权限,而不是特定于数据库的权限。 - tmuecksch
3
用户root已经存在!但是出现了“ERROR 1410 (42000):您不允许使用GRANT创建用户”的错误。 - mercury
“GRANT ALL PRIVILEGES”不起作用。我一直收到“ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)”的错误信息。 有什么解决办法吗? - DarkDead

15

关于这个问题,这是我的个人意见。我也曾经遇到过在MySQL Workbench中连接问题。我使用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@%用户关联了错误的凭据。因此,如果您尝试修改用户权限却没有成功,请尝试:

  1. 删除该用户。
  2. 重新创建用户。
  3. 确保您在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版本8.0.13及以上,则可以在本地留下MySQL并限制连接。

MySQL配置文件:该文件的位置可能因您的Linux发行版和安装而异。在我的系统中,它位于'/etc/my.cnf'。这里是其他建议的位置:

  • /etc/mysql/mysql.conf.d
  • /etc/mysql/my.cnf

您也可以像此网站所示那样搜索配置文件的位置:如何查找MySQL配置文件的位置。


1
只有适用于我的版本的互联网答案才有效。 - dawid
如果有帮助的话,当我第一次运行FLUSH PRIVILEGES时,这个方法对我有效。否则我会遇到一个错误。 - undefined

13
如果您已经在服务器上拥有一个root帐户,但对于CREATE USER 'root'@'localhost'感到困惑,请记住,在mysql服务器中,您的'root'@'localhost''root'@'your_remote_ip'是两个不同的用户(相同的用户名,但作用域不同)。因此,使用your_remote_ip后缀创建新用户将实际上创建一个新的有效的root用户,您可以使用它来从远程计算机访问mysql服务器。
例如,如果您使用root连接到您的mysql服务器,该服务器的IP地址是10.154.10.241,并且您想为远程root帐户设置密码,该密码为'Abcdef123!@#',则需要按照以下步骤进行:
  1. 在您的mysql服务器上,执行mysql -u root -p,然后输入root的密码以登录。
  2. 进入mysql>会话后,执行以下操作以为远程作用域创建root用户:
  3. mysql> CREATE USER 'root'@'10.154.10.241' IDENTIFIED BY 'Abcdef123!@#';
    
  4. 在收到Query OK消息后,执行以下操作以授予新创建的root用户所有权限:

  5. mysql> GRANT ALL ON *.* TO 'root'@'10.154.10.241';
    
  6. 然后:

  7. FLUSH PRIVILEGES;
    
  8. 重新启动mysqld服务:

    sudo service mysqld restart
    
  9. 确认服务器已成功重启:

  10. sudo service mysqld status
    

如果上述步骤执行没有错误,你现在可以使用root从远程机器访问mysql服务器。


9

我的规格:

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*)

N.B:我之前创建了一个数据库(db_name),并创建了一个用户凭据,赋予该用户所有表的所有权限,以代替使用默认的root用户,因为我在某处读到这是最佳实践。


是的,出于某种原因,这给了我一个错误消息“您的SQL语法有误”。 - Raul Chiarella

8

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

MySQL在这一点上相当愚笨,因此,如果您有'root'@'localhost'并且尝试授予'root'@'%'权限,则将其视为不同的用户,而不是在任何主机上包括localhost的root用户的普遍概念。

错误信息也是误导性的。

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

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

然后按照Mike的建议创建缺失的用户,或者调整您的GRANT命令以符合实际已存在的用户规范。


2
这对我来说是一个有效的解决方案!我只是没有精确地输入user@行。在尝试其他建议的解决方案之前,请务必检查此内容。对我而言,解决方案是:CREATE USER 'user'@'%domain.com',然后当我发出失败的GRANT语句时,我的语法有一个"."的错误。它看起来像这样GRANT .... TO 'user'@'%.domain.com'。我忘记在创建语句中加入".",这使得修复此问题变得不同。 - wallisds
这应该是被接受的答案!我也是,@后面的内容很重要,而且必须正确。愚蠢的 MySQL。 - Andrew
我也遇到了同样的问题 - 请仔细检查您创建用户时是否按预期创建了用户。 - Yogesh Devi

6
您将会获得此错误:

ERROR 1410 (42000): 您无权使用GRANT创建用户

如果您正在尝试对不存在的用户运行GRANT,请首先运行以下命令以确保用于GRANT的用户与您拥有的用户完全匹配: select User, Host from user; 特别注意,您创建的用户是否在localhost,但您尝试授予的用户是%

1
这就是全部内容。谢谢!用户具有不同的主机名(例如'user'@'%''user'@'data')。 - Artfaith
是的,错误信息确实很误导人,应该将其更改为类似于**用户'user'@'whatever'不存在。**的内容。 - undefined

5

复制并立即使用:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON *.* TO 'username'@'localhost';
FLUSH PRIVILEGES;

不要使用单行代码,例如:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';

然后:

GRANT ALL ON *.* TO 'username'@'localhost';

然后:

FLUSH PRIVILEGES;

2
在MySQL 8中,FLUSH PRIVILEGES;是多余的,更改会立即生效。 - Ihor Pomaranskyy

5
非常感谢 @Nebulastic。 如果您只想允许远程IP,请使用以下命令。
CREATE USER 'user_test'@'113.yy.xx.94' IDENTIFIED BY 'YOUR_PWD';
GRANT ALL ON *.* TO 'user_test'@'113.yy.xx.94';
FLUSH PRIVILEGES;

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