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

试着

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。

587055 次浏览

从MySQL 8开始,你不再可以(隐式地)使用GRANT命令创建用户。使用创建用户代替,后面跟着格兰特语句:

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

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

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

密码:酒吧

4)确保你的初始连接从Sequelize设置为foo与pw bar。

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

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

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

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

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

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

错误消息也具有误导性。

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

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

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

这招对我很管用:

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

我的规格:

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),并创建了一个用户凭据,赋予数据库中所有表的所有特权,而不是使用我在某处读到的默认根用户,这是一个最佳实践。

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

这只是我对这个问题的看法。我有完全相同的问题,试图从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@%用户有与之关联的错误凭据。因此,如果你试图修改用户的特权,但运气不好,尝试:

  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,限制连接 如果你的MySQL版本是8.0.13或更高,你可以设置防火墙

MySQL配置文件文件可以有不同的位置,这取决于你的 Linux分发和安装。在我的系统里,地址是 '/etc/my.cnf'。以下是其他建议的位置:

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

您也可以搜索配置位置,如本网站所示: 如何找到MySQL配置文件的位置。 < / p >

这可能有用:

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

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

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

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

可选特权(请注意并记住最小特权原则):

-- 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服务器< / p >

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

bind-address           = 0.0.0.0
skip-networking

1. 授予的权限

授予mysql>的所有权限。以授予选项“根”@“%”;

mysql> FLUSH PRIVILEGES

2. 检查用户表:

Mysql >使用Mysql

mysql> select host,user from user enter image description here < / p >

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.最后重新启动服务

重启mysql

我的规格:

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';

我也有同样的问题,所以来了这里。特别地,对于局部开发,我希望能够在没有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。其他方面不需要更改。

您将得到这个错误

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

如果你试图在一个不存在的用户上运行GRANT !

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

select User, Host from user;

特别要注意你创建的用户是否是localhost,而你试图授予的用户是%

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

例如,如果你正在使用root从一个IP为10.154.10.241的远程机器连接到你的mysql服务器,并且你想为远程根帐户设置一个密码'Abcdef123!@#',下面是你想要遵循的步骤:

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

  2. mysql>会话中,为远程作用域创建根用户:

    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. < p >,然后:

    FLUSH PRIVILEGES;
    
  5. 重启mysqld服务:

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

    sudo service mysqld status
    

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

这些命令对我来说很有用:

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

sudo mysql -u root

select user, host from mysql.user;

2-delete旧用户

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-finally flush特权

FLUSH PRIVILEGES;

复制并立即使用:

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;

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

授予所有 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

用sudo编译mysql

sudo mysql

非常感谢@星云 如果您想只允许远程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;

以我为例,我想做一些类似的事情,我遵循了这里的一些步骤,但最好的方法是@星云提到的:

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

在这之后,我遇到了一个错误,而试图查询数据库或连接SQLTools从VSCode。

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

运行这个查询将修复这个问题:

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

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

在选择语句中,将'user'@'%'更改为'user'@'localhost'解决了我的问题

  • 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;