【问题标题】:How to grant all privileges to root user in MySQL 8.0如何在 MySQL 8.0 中授予 root 用户所有权限
【发布时间】:2018-10-15 01:50:09
【问题描述】:

试过

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;

得到

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

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

【问题讨论】:

  • 你是直接用mysql连接还是用ssh?
  • 以root用户身份直接从命令提示符
  • 查看13.7.1.6 GRANT Syntax13.7.1.4 GRANT Syntax 之间的区别。
  • 我也遇到了同样的问题。我使用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
  • @Praveen 你会在这里接受答案吗?

标签: mysql mysql-error-1064 mysql-8.0


【解决方案1】:

就我而言,我想做类似的事情,我从这里开始执行一些步骤,但最好的方法是 @nebulasic 提到的:

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

在此之后,我在尝试从 VSCode 查询数据库或连接 SQLTools 时遇到错误。

客户端不支持服务器请求的认证协议;考虑升级 MySQL 客户端

运行此查询将解决问题:

ALTER USER 'user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'Your_newP@s$w0Rd';

我还想提一下,这些步骤可以在本地环境中工作,建议在生产中执行某些操作时将每个用户分配给每个数据库,并相应地生成密码,并在必要时采取不同的其他安全措施。

【讨论】:

    【解决方案2】:

    非常感谢@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;
    

    【讨论】:

      【解决方案3】:

      在这个问题上我只有 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. 确保您的 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 服务。

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


      绑定:如果您想了解更多信息,我建议您查看以下内容 解决方案How to bind MySQL server to more than one IP address。它 基本上说你可以通过使用让 MySQL 保持打开状态并限制连接 防火墙,或者如果您有 MySQL 8.0.13 及更高版本,则本机。

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

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

      您还可以搜索本网站所示的配置位置: How to find locations of MySQL config files.

      【讨论】:

        【解决方案4】:

        带 sudo 的明星 mysql

        sudo mysql
        

        【讨论】:

          【解决方案5】:

          从 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的安全风险,请参阅:

          【讨论】:

          • 此命令将创建一个新用户。但我想向现有的 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; +------------------+ |用户 | +------------------+ |根 | | mysql.infoschema | | mysql.session | | mysql.sys | |根 | +-----------------+ 5 行(0.00 秒)
          • 现在用户表中有两个名为 root 的用户!!我也无法远程连接(root 用户)。 ------------- 详细信息:类型:com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException SQL 状态:08001
          • 很奇怪。您问题中的错误消息表明该用户不存在。这是我建议首先创建它的唯一原因。并且在单个 MySQL 实例中不可能有两次相同的用户。它们的名称或主机部分不同。
          • 这 2 个用户从不同的主机连接。改为运行SELECT User, Host FROM mysql.user;
          • 得到那个错误:ERROR 1045 (28000): Access denied for user 'root'@'localhost' (using password: YES)
          【解决方案6】:

          试试这个,我有同样的问题,我尝试了几个选项,但下面的工作。

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

          使用的参考 - https://www.digitalocean.com/community/tutorials/how-to-install-linux-apache-mysql-php-lamp-stack-on-ubuntu-20-04#step-6-%E2%80%94-testing-database-connection-from-php-optional

          【讨论】:

            【解决方案7】:

            复制这个并立即使用:

            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;
            

            【讨论】:

            • 在 MySQL 8 中 FLUSH PRIVILEGES; 是多余的,更改会立即应用。
            【解决方案8】:

            这个命令对我有用:

            1-登录mysql并查看所有用户

            sudo mysql -u root

            select user, host from mysql.user;
            

            2-删除旧用户

            drop user root@localhost;

            3-创建新用户

            CREATE USER 'root'@'localhost' IDENTIFIED BY 'mypassword'

            4-为其添加所有权限:

            GRANT ALL ON *.* TO 'root'@'localhost'

            ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password
            BY 'mypassword';
            

            5-终于刷新权限

            FLUSH PRIVILEGES;

            【讨论】:

              【解决方案9】:

              如果您在服务器计算机上已经有一个 root 帐户,而对 CREATE USER 'root'@'localhost' 感到困惑,请记住您的 'root'@'localhost''root'@'your_remote_ip' 是两个不同的用户(相同的用户名,但不同的范围) 在 mysql 服务器中。因此,使用your_remote_ip 后缀创建新用户实际上会创建一个新的有效root 用户,您可以使用该用户从远程计算机访问mysql 服务器。

              例如,如果您使用root 从IP 为10.154.10.241 的远程计算机连接到您的mysql 服务器,并且您想为远程root 帐户设置密码'Abcdef123!@#',这里是您希望遵循的步骤:

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

              2. mysql> 会话中,执行以下操作为远程范围创建 root 用户:

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

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

                FLUSH PRIVILEGES;
                
              5. 重启mysqld服务:

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

                sudo service mysqld status
                

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

              【讨论】:

                【解决方案10】:

                你会得到这个错误

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

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

                因此,首先运行此程序以确保您在 GRANT 中使用的用户与您的用户完全匹配:

                select User, Host from user;

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

                【讨论】:

                  【解决方案11】:

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

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

                  注意:您可以使用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): Host ‘1.2.3.4’ is not allowed to connect to this MySQL服务器

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

                  bind-address           = 0.0.0.0
                  skip-networking
                  

                  【讨论】:

                  • 您能否详细说明为什么它不起作用而不是抱怨?这样我就可以帮助您或发布更多信息。
                  • 这个答案甚至没有解决 root 用户权限的问题。
                  • 相应地更新了答案。
                  • 最佳答案,现在是 GRANT ALL ON 用于 MySQL 8.0。此外,我相信您可以绑定到127.0.0.1 并在任何命令中包含--protocol=tcp,而不是禁用bind-address。长期性能也优于localhost
                  • 除了我的所有答案之外,OP 想知道为什么不能再使用 GRANT 命令创建用户。从来没有人问过如何使用GRANT 来授予权限。但不知何故,人们拒绝阅读之前的提问和回答。
                  【解决方案12】:

                  我遇到了同样的问题,导致我来到这里。特别是对于本地开发,我希望能够在没有sudo 的情况下做到mysql -u root -p。我不想创建新用户。我想在本地 PHP Web 应用程序中使用 root

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

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

                  【讨论】:

                  • 这甚至不能完全回答问题。
                  【解决方案13】:

                  我的规格:

                  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 语法更新了一个用户,它没有设置用户帐户。它也不授予特权。
                  【解决方案14】:

                  1.授予权限

                  mysql> 授予所有权限。 TO 'root'@'%'WITH GRANT OPTION;

                  mysql> 刷新权限

                  2。检查用户表:

                  mysql>使用mysql

                  mysql> 从用户中选择主机、用户

                  3.修改配置文件

                  mysql默认绑定ip:127.0.0.1,如果要远程访问服务,删除config即可

                  #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 实例。而是尝试刷新权限。
                  【解决方案15】:

                  这可能有效:

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

                  【讨论】:

                  • 与其扔掉代码,还不如解释一下为什么它是合适的解决方案。目标是进行教育,以便 OP 知道下次该做什么,而不仅仅是解决眼前的问题。
                  【解决方案16】:

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

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

                  【讨论】:

                  • ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '. TO 'root'@'%'' 在第 1 行
                  • mysql> 授予所有权限。 TO 'root'@'%'; ERROR 1064 (42000):您的 SQL 语法有错误;检查与您的 MySQL 服务器版本相对应的手册,以了解在 '. TO 'root'@'%'' 在第 1 行 mysql>
                  【解决方案17】:

                  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是你想拥有权限的数据库,.意思是all on all

                  3) 以 foo 用户身份登录

                  mysql> mysql -u foo -p
                  

                  密码:bar

                  4) 确保您与 Sequelize 的初始连接使用 pw bar 设置为 foo。

                  【讨论】:

                  • 这并没有回答这个问题。这是关于全局权限,而不是特定于数据库的权限。
                  【解决方案18】:

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

                  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'。我忘了把'。在我的创建声明中,它在解决这个问题方面发挥了重要作用。
                  • 这应该是被接受的答案!同样在这里,重要的是@之后的内容,它必须是正确的。愚蠢的Mysql
                  【解决方案19】:

                  检查您的用户名和域是否与之前创建的相同。 mysql通过user表中的两列来选择账号,如果不一样,mysql可能会认为你想通过grant创建一个新账号,8.0版本以后不支持了。

                  【讨论】:

                  • 我在用户中有错字,这就是发生的事情!
                  【解决方案20】:

                  我的规格:

                  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 用户是最佳实践。

                  【讨论】:

                    【解决方案21】:

                    这对我有用:

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

                    【讨论】:

                      【解决方案22】:

                      嗯,我也遇到了同样的问题。即使路由有 '%' 也无法远程连接。现在,看看my.ini 文件(Windows 中的配置文件),bind-address 语句被遗漏了。

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

                      【讨论】:

                      • 这其实是最接近正确答案的。
                      猜你喜欢
                      • 1970-01-01
                      • 2016-12-07
                      • 1970-01-01
                      • 2020-11-22
                      • 1970-01-01
                      • 1970-01-01
                      相关资源
                      最近更新 更多