207

试过了

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。

4

22 回答 22

390

从 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,请参见:

于 2018-05-06T08:17:02.573 回答
92

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

USE mysql;
CREATE USER 'user'@'localhost' IDENTIFIED BY 'P@ssW0rd';
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'@'*';

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

ERROR 1130 (HY000): Host '1.2.3.4' is not allowed to connect to this MySQL server

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

bind-address           = 0.0.0.0
skip-networking
于 2019-09-30T12:23:53.103 回答
41

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

密码:吧

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

于 2018-07-16T18:52:41.547 回答
9

对于那些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!@#';
    
  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.

于 2021-02-03T21:07:55.673 回答
8

我的规格:

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

于 2019-05-17T09:45:14.730 回答
7

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

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

错误消息也具有误导性。

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

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

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

于 2019-05-02T09:56:17.583 回答
6

只是我在这个问题上的 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 服务。

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


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

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

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

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

于 2019-06-30T20:15:34.907 回答
3

复制并立即使用它:

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;
于 2021-05-25T10:40:24.237 回答
2

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

于 2019-06-30T15:17:05.910 回答
2

你会得到这个错误

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

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

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

select User, Host from user;

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

于 2021-01-21T12:54:51.523 回答
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;
于 2021-12-14T09:29:28.160 回答
2

这个命令对我有用:

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-finally 刷新权限

FLUSH PRIVILEGES;

于 2021-03-26T07:42:03.513 回答
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';
于 2020-03-30T04:49:39.513 回答
1

This worked for me:

mysql> FLUSH PRIVILEGES 
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES
于 2019-05-16T06:23:30.363 回答
0

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

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

于 2019-01-30T12:33:27.313 回答
0

就我而言,我想做类似的事情,我从这里开始执行一些步骤,但最好的方法是 @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';

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

于 2022-01-27T21:53:12.077 回答
0

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

于 2020-03-05T17:02:42.903 回答
0

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

全部授予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

于 2021-06-11T11:39:37.723 回答
-1

Stary mysql 与 sudo

sudo mysql
于 2021-07-04T20:14:27.020 回答
-1

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

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

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

于 2020-05-22T15:29:55.840 回答
-1

这可能有效:

grant all on dbtest.* to 'dbuser'@'%' identified by 'mysql_password';
于 2019-07-27T15:43:38.027 回答
-2

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

mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%'
于 2018-07-25T12:29:16.760 回答