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

Pra*_*een 57 mysql mysql-error-1064 mysql-8.0

试着

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY 'root' WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

入门

错误1064(42000):您的SQL语法有错误; 检查与MySQL服务器版本对应的手册,以获得正确的语法,以便在第1行的"IDENTIFIED BY"root"WITH GRANT OPTION"附近使用.

注意:在MySQL 5.7中尝试时也一样

也试过了

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

入门

错误1410(42000):您不能使用GRANT创建用户

MySQL(8.0.11.0)用户名/密码是root/root.

Mik*_*hke 121

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

mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root';
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

  • 此命令将创建一个新用户。但我想授予现有 root 用户权限。mysql> CREATE USER 'root'@'%' IDENTIFIED BY 'root'; 查询 OK,0 行受影响(0.31 秒) mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; 查询 OK,0 行受影响(0.16 秒) mysql> SELECT User FROM mysql.user; +-----------------+ | 用户 | +-----------------+ | 根| | mysql.infoschema | | mysql.session | | mysql.sys | | 根| +-----------------+ 5 行(0.00 秒) (8认同)
  • 得到那个错误:`ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)` (5认同)
  • 这 2 个用户从不同的主机连接。改为运行`SELECT User, Host FROM mysql.user;`。 (3认同)

Neb*_*tic 81

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

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'P@ssW0rd';
GRANT ALL ON *.* TO 'user'@'localhost';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

注意: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'@'*';
Run Code Online (Sandbox Code Playgroud)

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

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

您需要添加/更改以下两行/etc/mysql/my.cnf并重新启动mysql:

bind-address           = 0.0.0.0
skip-networking
Run Code Online (Sandbox Code Playgroud)

  • 这个答案甚至没有解决 *root* 用户权限的问题。 (3认同)
  • 最佳答案,现在 MySQL 8.0 是“GRANT ALL ON”。我还相信,您可以绑定到“127.0.0.1”并在任何命令中包含“--protocol=tcp”,而不是禁用“bind-address”。长期性能也优于“localhost”。 (2认同)
  • 除了我的答案之外,OP 想知道为什么不能再使用 GRANT 命令创建用户。从来没有人问过如何使用“GRANT”来授予权限。但不知何故,人们拒绝阅读之前提出的问题和回答的内容。 (2认同)

Arm*_*rez 15

关于这个问题我只想说两分钱。我在尝试从 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";
Run Code Online (Sandbox Code Playgroud)

这显然不起作用,我终于使用迈克·利施克的答案让它发挥作用。

我认为发生的情况是 root@% 用户的关联凭据错误。因此,如果您尝试修改用户的权限但没有成功,请尝试:

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

1. 删除用户。

从 Mysql 控制台:

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

select user, host from mysql.user;
Run Code Online (Sandbox Code Playgroud)

删除所需用户:

drop user '{{ username }}'@'%';
Run Code Online (Sandbox Code Playgroud)

2. 重新创建用户。

创建用户并授予权限:

CREATE USER '{{ username }}'@'%' IDENTIFIED BY '{{ password }}';
GRANT ALL PRIVILEGES ON *.* TO '{{ username }}'@'%' WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

运行这个命令:

FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

3. 确保您的 MySQL 配置文件具有正确的绑定。

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

bind-address=127.0.0.1
Run Code Online (Sandbox Code Playgroud)

并使用“#”对其进行注释:

#bind-address=127.0.0.1
Run Code Online (Sandbox Code Playgroud)

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

然后重新启动 MySQL 服务。

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


绑定:如果您想了解更多相关信息,我建议您查看以下解决方案:如何将 MySQL 服务器绑定到多个 IP 地址。它基本上说你可以使用防火墙保持 MySQL 打开并限制连接,或者如果你有 MySQL 版本 8.0.13 及更高版本,则可以本地限制连接。

MySQL 配置文件该文件可能有不同的位置,具体取决于您的 Linux 发行版和安装。在我的系统上它位于 '/etc/my.cnf'. 以下是其他建议位置:

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

您还可以搜索配置位置,如本网站所示: 如何查找 MySQL 配置文件的位置。


小智 14

1)这对我有用.首先,创建一个新用户.示例:在此处使用pw'bar.enter代码为'foo'

> mysql> CREATE USER 'foo'@'localhost' IDENTIFIED WITH mysql_native_password BY 'bar';
Run Code Online (Sandbox Code Playgroud)

2)用'foo'用户名替换下面的代码.

> mysql> GRANT ALL PRIVILEGES ON database_name.* TO'foo'@'localhost';
Run Code Online (Sandbox Code Playgroud)

注意:database_name是您希望拥有权限的数据库.一切都意味着

3)以用户foo身份登录

mysql> mysql -u foo -p
Run Code Online (Sandbox Code Playgroud)

密码:吧

4)确保你的Sequelize初始连接设置为foo with pw bar.

  • root 用户已经存在!但是得到“ERROR 1410 (42000): You are not allowed to create a user with GRANT”。 (4认同)
  • 到目前为止,这还不能回答问题。这是关于全局权限,而不是数据库特定的权限。 (2认同)

小智 7

我的规格:

mysql --version
mysql  Ver 8.0.16 for Linux on x86_64 (MySQL Community Server - GPL)
Run Code Online (Sandbox Code Playgroud)

什么对我有用:

mysql> CREATE USER 'username'@'localhost' IDENTIFIED BY 'desired_password';
mysql> GRANT ALL PRIVILEGES ON db_name.* TO 'username'@'localhost' WITH GRANT OPTION;
Run Code Online (Sandbox Code Playgroud)

两个查询中的响应:

Query OK, O rows affected (0.10 sec*)
Run Code Online (Sandbox Code Playgroud)

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


Dan*_* Vo 7

对于那些CREATE USER 'root'@'localhost'对服务器计算机上已经有 root 帐户感到困惑的人,请记住,您'root'@'localhost''root'@'your_remote_ip'是 mysql 服务器中的两个不同用户(相同的用户名,但作用域不同)。因此,使用your_remote_ippostfix创建一个新用户实际上会创建一个新的有效root用户,您可以使用它从远程机器访问 mysql 服务器。

例如,如果您root要从 IP 为 的远程计算机连接到 mysql 服务器,10.154.10.241并且您想为远程 root 帐户设置密码'Abcdef123!@#',则您需要执行以下步骤:

  1. 在您的 mysql 服务器机器上,执行mysql -u root -p,然后输入您的密码进行root登录。

  2. 进入mysql>会话后,执行此操作为远程范围创建 root 用户:

    mysql> CREATE USER 'root'@'10.154.10.241' IDENTIFIED BY 'Abcdef123!@#';
    
    Run Code Online (Sandbox Code Playgroud)
  3. Query OK消息之后,执行此操作以授予新创建的 root 用户所有权限:

    mysql> GRANT ALL ON *.* TO 'root'@'10.154.10.241';
    
    Run Code Online (Sandbox Code Playgroud)
  4. 进而:

    FLUSH PRIVILEGES;
    
    Run Code Online (Sandbox Code Playgroud)
  5. 重启mysqld服务:

    sudo service mysqld restart
    
    Run Code Online (Sandbox Code Playgroud)
  6. 确认服务器已成功重启:

    sudo service mysqld status
    
    Run Code Online (Sandbox Code Playgroud)

如果执行上述步骤没有任何错误,您现在可以使用root.


Ser*_*kin 6

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

MySQL 在这一点上非常愚蠢,所以如果你有 'root'@'localhost' 并试图授予 'root'@'%' 权限,它会将它们视为不同的用户,而不是任何主机上的 root 用户的通用概念,包括本地主机。

错误消息也具有误导性。

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

SELECT CONCAT("'", user, "'@'", host, "'") FROM mysql.user;
Run Code Online (Sandbox Code Playgroud)

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

  • 这对我来说是一个有效的解决方案!我只是未能准确输入 user@ 行。在尝试建议的其他解决方案之前,请务必检查这一点。对我来说是: CREATE USER 'user'@'%domain.com' 然后当我发出失败的 GRANT 语句时,我的语法出现了一个“.”。它看起来像这样 GRANT .... TO 'user'@'%.domain.com'。我忘了加上“.” 在我的创建声明中,它对解决这个问题产生了很大的影响。 (2认同)

ACV*_*ACV 6

你会得到这个错误

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

如果您尝试GRANT在不存在的用户上运行!

因此,首先运行此命令以确保您在您的用户中使用的用户GRANT与您所拥有的用户完全匹配:

select User, Host from user;

特别要注意您创建的用户是否位于localhost,但您尝试授予的用户是否位于%


小智 5

复制此内容并立即使用:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
GRANT ALL ON *.* TO 'username'@'localhost';
FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

而不是使用单行代码,例如:

CREATE USER 'username'@'localhost' IDENTIFIED BY 'password';
Run Code Online (Sandbox Code Playgroud)

然后:

GRANT ALL ON *.* TO 'username'@'localhost';
Run Code Online (Sandbox Code Playgroud)

然后:

FLUSH PRIVILEGES;
Run Code Online (Sandbox Code Playgroud)

  • 在 MySQL 8 中,“FLUSH PRIVILEGES;”是多余的,更改会立即应用。 (2认同)

小智 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;
Run Code Online (Sandbox Code Playgroud)