mysql 8.0+ 执行 grant 报 error 1064 或 1410,是因为语法中含 identified by,该写法已被彻底移除;必须分三步:先 create user 创建用户并设密码,再 grant 授予权限,最后 flush privileges 刷新权限,且需注意认证插件兼容性。

MySQL 8.0 执行 GRANT 报 ERROR 1064 或 ERROR 1410,基本就是你在语句里写了 IDENTIFIED BY——这个语法在 8.0+ 已被彻底移除,不是引号写错、权限不够,也不是用户不存在,而是解析器直接拒绝该结构。
确认是不是 MySQL 8.0+ 导致的
别猜,执行这条命令看准版本:
SELECT VERSION();
如果返回类似 8.0.33、8.3.0 或 8.4.1,就坐实了必须分步操作。Docker 镜像、阿里云 PolarDB、腾讯云 CVM 上默认装的几乎都是 8.0+,而你本地开发环境可能还是 5.7,版本混用是踩坑高发区。
CREATE USER 和 GRANT 必须拆开写
MySQL 8.0 把“建用户”“设密码”“赋权限”三件事完全解耦:CREATE USER 负责身份与密码,GRANT 只管权限,ALTER USER 才改密。任何在 GRANT 后面跟 IDENTIFIED BY 的写法都会被拒。
- 错误写法(直接报错):
GRANT SELECT ON mydb.* TO 'u1'@'%' IDENTIFIED BY 'pwd123'; - 正确流程(三步缺一不可):
CREATE USER 'u1'@'%' IDENTIFIED BY 'pwd123';GRANT SELECT, INSERT ON mydb.* TO 'u1'@'%';-
FLUSH PRIVILEGES;(建议加上,尤其跨客户端或脚本批量操作后)
- 若用户已存在,
CREATE USER会报ERROR 1396;此时应改用:ALTER USER 'u1'@'%' IDENTIFIED BY 'newpwd';
连得上但认证失败?大概率是 caching_sha2_password 插件不兼容
即使 CREATE USER 和 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'; - 全局降级需重启服务,不推荐临时救急:
default_authentication_plugin=mysql_native_password加到my.cnf的[mysqld]段
root@'%' 和 root@'localhost' 是两个独立用户
很多人以为改了 root@'%' 就能远程登录,结果发现连不上——因为 root@'localhost' 是另一个账号,权限、密码、插件都互不影响。执行 SELECT User, Host FROM mysql.user; 就能看清。
- 想让 root 支持远程访问,不能只改 host 字段(
UPDATE mysql.user SET Host='%' WHERE User='root';),还要确保该账号有密码、用了兼容插件、且被授予对应权限 - 更安全的做法是:新建专用应用账号(如
'app_user'@'10.10.20.%'),避免动root -
GRANT ALL PRIVILEGES ON *.*是高危操作,生产环境应严格限定库表范围和来源 IP
最常被跳过的点:认证插件策略没在第一个用户创建时就定下来。等应用连不上再回头调,往往要翻好几层日志。语法错误好修,插件不匹配的问题才真正卡人。











