ERROR 1044 (42000) ... 'root'@'%' 给mysql的root %用户添加grant权限


ERROR 1044 (42000): Access denied for user 'root'@'%'

--给mysql的root %用户添加grant权限。并给创建的用户赋予权限
select user,host,grant_priv from user;
update user set grant_priv='Y' where user='root';
flush privileges
show grants for 'root'@'%';
--mysql_upgrade -u root -p
--insert into mysql.user(Host,User,Password) values("localhost","root",password("1234"));


从供应商那边接手一个 MySQL 数据库(数据库版本为 5.7.21 MySQL Community Server (GPL) ),在创建账号时遇到了 ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database xxx 错误,如下所示

 

 

mysql> grant all on xxx.* to xxx@'192.168.%' identified by 'xxx';
ERROR 1044 (42000): Access denied for user 'root'@'localhost' to database 'xxxx'
mysql>

 

照理说, root 用户应该有任何权限,那么为什么出现这个错误呢? 查看当前用户为 root@localhost ,顺便查看了一下各个 root 账号的权限。如下所示:

 

 

mysql> select current_user() from dual;
+----------------+
| current_user() |
+----------------+
| root@localhost |
+----------------+
1 row in set (0.00 sec

mysql> select host,user from user where user='root';
+-----------+----------+
| host      | user     |
+-----------+----------+
| %         | root     |
| 127.0.0.1 | root     |
| ::1       | root     |
| localhost | root     |
+-----------+----------+
7 rows in set (0.00 sec)

mysql>  show grants for root@'localhost';
+--------------------------------------------------------------+
| Grants for root@localhost                                    |
+--------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'localhost'            |
| GRANT PROXY ON ''@'' TO 'root'@'localhost' WITH GRANT OPTION |
+--------------------------------------------------------------+
2 rows in set (0.00 sec)

mysql> show grants for root@'127.0.0.1';
+---------------------------------------------------------------------+
| Grants for root@127.0.0.1                                           |
+---------------------------------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'127.0.0.1' WITH GRANT OPTION |
+---------------------------------------------------------------------+
1 row in set (0.00 sec)

mysql> show grants for root@'%';
+-------------------------------------------+
| Grants for root@%                         |
+-------------------------------------------+
| GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' |
+-------------------------------------------+
1 row in set (0.00 sec)

 

 

 

    如上所示, root@localhost 账号没有 WITH GRANT OPTION 选项,关于 WITH GRANT OPTION 选项,如果想让授权的用户,也可以将这些权限授予给其他用户,需要选项  WITH GRANT OPTION   。也就是说有这个选项就可以将权限传递给第三方。这也是上面 root@localhost 用户 给其它用后授权报错的原因,如果以  root@127.0.0.1 登录(此账号拥有 WITHGRANT OPTION 选项),创建用户并授权就不会有这个错误,如下所示:

 

 

# mysql -host 127.0.0.1 -u root -p
Enter password:




mysql>  grant all on xxx.* to xxx@'192.168.%' identified by 'test1249';
Query OK, 0 rows affected, 1 warning (0.00 sec)


mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

 

当然还有其它方面的原因也可能会引起这个错误,不过在这个案例当中,确实仅仅是因为上面原因引起。特此记录一下这个案例 @







About Me

........................................................................................................................

● 本文作者:小麦苗,部分内容整理自网络,若有侵权请联系小麦苗删除

● 本文在itpub( http://blog.itpub.net/26736162 )、博客园( http://www.cnblogs.com/lhrbest )和个人weixin公众号( xiaomaimiaolhr )上有同步更新

● 本文itpub地址: http://blog.itpub.net/26736162

● 本文博客园地址: http://www.cnblogs.com/lhrbest

● 本文pdf版、个人简介及小麦苗云盘地址: http://blog.itpub.net/26736162/viewspace-1624453/

● 数据库笔试面试题库及解答: http://blog.itpub.net/26736162/viewspace-2134706/

● DBA宝典今日头条号地址: http://www.toutiao.com/c/user/6401772890/#mid=1564638659405826

........................................................................................................................

● QQ群号: 230161599 (满) 、618766405

● weixin群:可加我weixin,我拉大家进群,非诚勿扰

● 联系我请加QQ好友 646634621 ,注明添加缘由

● 于 2019-06-01 06:00 ~ 2019-06-30 24:00 在西安完成

● 最新修改时间:2019-06-01 06:00 ~ 2019-06-30 24:00

● 文章内容来源于小麦苗的学习笔记,部分整理自网络,若有侵权或不当之处还请谅解

● 版权所有,欢迎分享本文,转载请保留出处

........................................................................................................................

小麦苗的微店 https://weidian.com/s/793741433?wfr=c&ifr=shopdetail

小麦苗出版的数据库类丛书 http://blog.itpub.net/26736162/viewspace-2142121/

小麦苗OCP、OCM、高可用网络班 http://blog.itpub.net/26736162/viewspace-2148098/

小麦苗腾讯课堂主页 https://lhr.ke.qq.com/

........................................................................................................................

使用 weixin客户端 扫描下面的二维码来关注小麦苗的weixin公众号( xiaomaimiaolhr )及QQ群(DBA宝典)、添加小麦苗weixin, 学习最实用的数据库技术。

........................................................................................................................

欢迎与我联系

 

 



来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26736162/viewspace-2648966/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/26736162/viewspace-2648966/

<think>首先,用户的问题是关于解释MySQL命令:`grant all privileges on *.* to 'root'@'%'` 的作用。系统级指令要求我使用特定的格式:行内数学表达式用`$...$`,独立公式用`$$...$$`,但这里可能不需要数学公式,因为问题是关于SQL命令的。不过,如果有数学内容,我会应用规则。指令还要求使用中文回答,生成相关问题,并在引用段落末尾添加引用标识。 参考站内引用提供了背景:引用[1]、[3]、[4]、[5]讨论了MySQLgrant命令,特别是版本差异。引用[3]指出,在MySQL 8.0之前,使用`grant all privileges on *.* to 'root'@'%' identified by 'password' with grant option;`,但在8.0及以上版本,需要分开使用`create user`和`grant`命令。引用[4]和[5]也确认了这一点。 用户的问题只是解释命令的作用,不包括密码部分。命令是`grant all privileges on *.* to 'root'@'%'`,没有`identified by`部分。所以,我应该专注于解释这个命令本身。 关键点: - `grant all privileges`: 授予所有权限。 - `on *.*`: 对所有数据库和所有表。 - `to 'root'@'%'`: 给用户root,允许从任何主机连接(%表示所有主机)。 命令的作用是:授予root用户从任何主机访问MySQL服务器时,对所有数据库和表的所有权限。 在MySQL 8.0及以上版本,这个命令需要在用户存在时使用,否则会报错。引用[3]、[4]、[5]强调,在8.0之前,grant命令可以隐式创建用户,但8.0后需要先创建用户用户没有指定版本,所以我可以简要提一下版本差异。 回答结构: 1. 清晰解释命令的作用。 2. 使用中文。 3. 在相关部分添加引用标识。 4. 生成相关问题。 生成相关问题:基于这个主题,相关问题可以是: - 如何创建用户? - MySQL权限管理的最佳实践? - 如何撤销权限? - 解释with grant option的作用? - MySQL版本差异的影响? 确保回答真实可靠:基于引用,命令授予root用户所有权限,允许远程连接。 最终回答: - 解释命令:授予root用户所有权限,允许从任何主机访问所有数据库和表。 - 提到版本差异:在MySQL 8.0前,grant可能创建用户;8.0后需要先create user。 - 添加引用标识在引用段落末尾。 - 生成相关问题。</think>### MySQL命令 `grant all privileges on *.* to 'root'@'%'` 的作用解释 在MySQL中,`grant all privileges on *.* to 'root'@'%'` 是一个权限管理命令,用于授予用户`root`对数据库服务器的所有权限。以下是该命令的详细分解和作用: 1. **命令结构解析**: - `grant all privileges`: 这部分表示授予所有可用的权限(包括SELECT、INSERT、UPDATE、DELETE、CREATE、DROP等所有数据库操作权限)。 - `on *.*`: 指定权限的作用范围。`*.*` 表示所有数据库(第一个`*`)和所有表(第二个`*`),即对整个MySQL服务器上的所有对象生效。 - `to 'root'@'%'`: 指定权限授予的用户。`'root'` 是用户名,`'%'` 表示允许从任何主机(IP地址)连接到MySQL服务器。`%` 是一个通配符,代表所有远程主机。 2. **核心作用**: - 该命令使`root`用户拥有**完全控制权**,包括: - 访问和修改所有数据库和表。 - 创建或删除数据库、表、用户等。 - 执行管理操作(如权限分配)。 - 特别适用于**远程访问场景**:例如,当需要从其他服务器或客户端工具(如MySQL Workbench)连接MySQL时,`'%'` 允许任意IP的连接,但需注意安全风险[^3][^5]。 3. **版本注意事项**: - **MySQL 8.0 之前版本**:此命令可直接运行,如果用户不存在,MySQL会隐式创建用户(例如,包含密码设置)。但这不是推荐做法,因为可能引发兼容性问题[^3]。 - **MySQL 8.0 及以上版本**:由于安全策略变更,此命令**不能隐式创建用户**。必须先使用 `create user` 创建用户,再执行 `grant` 命令。否则,会报错(如 `ERROR 1410`)。例如: ```sql CREATE USER 'root'@'%' IDENTIFIED BY 'your_password'; -- 先创建用户并设置密码 GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' WITH GRANT OPTION; -- 再授予权限 FLUSH PRIVILEGES; -- 刷新权限使更改生效 ``` 引用[3]、[4]、[5] 强调,MySQL 8.0 后必须显式分开步骤,以避免权限错误[^3][^4][^5]。 4. **安全警告**: - 授予`'root'@'%'` 权限虽然方便,但**高风险**:它允许任何主机以root身份访问,可能导致未授权访问。生产环境中,建议: - 限制主机范围(如 `'root'@'192.168.1.%'`)。 - 使用强密码。 - 仅在必要时开启远程访问[^5]。 总之,此命令是MySQL权限管理的核心操作,用于赋予root用户最高权限,但需根据MySQL版本和安全需求谨慎使用。如需撤销权限,可使用 `revoke` 命令。 ### 相关问题 1. MySQL 8.0 中如何正确创建新用户并授予权限? 2. 如何限制MySQL用户的远程访问权限以提升安全性? 3. `with grant option` 在权限命令中的作用是什么? 4. 如何撤销MySQL用户的特定权限? 5. MySQL权限管理的最佳实践有哪些?
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值