mysql 8.0+已移除grant中identified by语法,须先create user(可指定mysql_native_password插件)再grant,且root@'%'与root@'localhost'为独立用户。

MySQL 8.0 执行 GRANT 报 ERROR 1064 或 ERROR 1410,基本就是你在 GRANT 里写了 IDENTIFIED BY ——这个语法在 8.0+ 已被彻底移除,不是配错、漏写或权限不够,而是语句本身不合法。
确认 MySQL 版本是否为 8.0+
别凭印象判断。Docker 镜像、云数据库(如阿里云 PolarDB、腾讯云 CVM 上的 MySQL)默认已是 8.0+,而你本地可能是 5.7。执行:
SELECT VERSION();
如果返回类似 8.0.33、8.3.0 或 8.4.1,就坐实了必须分步操作。Percona Server 兼容 MySQL 8.0 协议的版本同样适用该规则。
CREATE USER + GRANT 必须分开执行
两步缺一不可,顺序不能颠倒,且 GRANT 中绝不能出现 IDENTIFIED BY:
- 先创建用户(含密码):
CREATE USER 'u1'@'%' IDENTIFIED BY 'pwd123'; - 再授予权限(不带密码):
GRANT SELECT, INSERT ON mydb.* TO 'u1'@'%'; - 如需全局权限:
GRANT ALL PRIVILEGES ON *.* TO 'u1'@'%'; - 最后刷新(建议加上,尤其跨客户端操作后):
FLUSH PRIVILEGES;
若用户已存在,CREATE USER 会报错;此时应改用:ALTER USER 'u1'@'%' IDENTIFIED BY 'newpwd';
认证插件不兼容导致“连得上但登不上”
即使语法全对、GRANT 成功、FLUSH PRIVILEGES 也执行了,仍可能遇到:
- MySQL Workbench 连接时卡在“Authenticating…”
- JDBC 报
Access denied for user(但用户名密码没错) - PHP mysqli_connect() 失败,错误提示含
caching_sha2_password
这是因为 MySQL 8.0 默认用 caching_sha2_password 插件,而旧版客户端不支持。解决方法有两个:
- 创建时显式指定插件:
CREATE USER 'u1'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd123'; - 或全局降级(需重启服务):在
my.cnf中加default_authentication_plugin=mysql_native_password
这个点常被跳过,直到应用连不上才回头排查——其实应在创建第一个 8.0 用户时就决定插件策略。
root@'%' 和 root@'localhost' 是两个独立用户
很多人想开远程 root 权限,直接跑:GRANT ALL ON *.* TO 'root'@'%' ...,却忘了:
-
root@'localhost'是本地超级用户,root@'%'是全新用户,不存在自动继承关系 - 若未显式创建
root@'%',GRANT会因用户不存在而失败(报ERROR 1133) - 生产环境强烈不建议开放
root@'%',应新建专用账号并限制 IP 段(如'appuser'@'10.0.0.%')
真正容易被忽略的,是插件策略和用户主机名的精确匹配——哪怕只差一个空格或大小写,CREATE USER 和 GRANT 就会指向完全不同的账户实体。











