是的,MySQL 8.0 中 GRANT ALL PRIVILEGES 不能直接用于 root 用户,因语法被拒绝:root 是系统保留用户,权限由 mysql.user 表硬编码控制,不走常规 GRANT 流程;需先 CREATE USER 再 GRANT,并注意 host 区分、权限细化及网络配置联动。

MySQL 8.0 中 GRANT ALL PRIVILEGES 不能直接用于 root 用户?
是的,MySQL 8.0 默认禁用了对内置账户(如 root)直接使用 GRANT ALL PRIVILEGES ON *.* 的语法,执行会报错:ERROR 1064 (42000)。这不是权限不足,而是语法被拒绝——因为 root 是系统保留用户,其权限由 mysql.user 表中的字段(如 Super_priv)硬编码控制,不走常规 GRANT 流程。
给普通用户授予真正全局权限的正确写法
要让一个新用户拥有跨所有数据库、所有表的操作权(包括 CREATE、DROP、GRANT OPTION 等),必须显式指定主机范围,并加上 WITH GRANT OPTION(否则无法再授权给别人):
CREATE USER 'admin'@'%' IDENTIFIED BY 'strong_pass';GRANT ALL PRIVILEGES ON *.* TO 'admin'@'%' WITH GRANT OPTION;FLUSH PRIVILEGES;
注意:@'%' 和 @'localhost' 是两个完全独立的账户,权限不互通;如果应用从本地连接却只建了 @'%',会连不上。
为什么 GRANT ALL PRIVILEGES 在 MySQL 8.0 不等于“全功能”?
即使执行成功,ALL PRIVILEGES 也不包含某些高危管理权限,比如:
-
SYSTEM_USER(切换用户身份) -
REPLICATION CLIENT(查看主从状态) -
BACKUP_ADMIN(执行物理备份) -
CLONE_ADMIN(克隆实例)
这些需要单独追加:GRANT SYSTEM_USER, REPLICATION CLIENT ON *.* TO 'admin'@'%';。MySQL 8.0 把权限拆得更细,ALL PRIVILEGES 只覆盖传统 DML/DCL 类权限,不自动包含新增的管理类权限。
容易被忽略的配置联动点
授完权不代表一定能远程连上,还卡在三个地方:
- MySQL 配置文件中
bind-address必须不是127.0.0.1(否则拒绝非 localhost 连接) - Linux 防火墙(如
ufw或firewalld)需放行3306端口 - 用户 host 写成
'%'后,仍可能被skip-name-resolve影响——若开启该选项,DNS 解析失败时会 fallback 到localhost,导致权限匹配错乱
最稳妥的做法:先确认 SELECT user(), current_user(); 返回的用户名和 host 是否与你 GRANT 的完全一致,再排查网络层。


















