mysql 8.0中grant不再处理密码,必须用create user或alter user设置密码;grant含identified by会直接报error 1064,且caching_sha2_password插件不兼容旧客户端易致连接失败。

GRANT 语句根本不再处理密码,这是设计上的硬性剥离
MySQL 8.0 不是“不支持 GRANT 修改密码”,而是彻底移除了 GRANT 对密码和用户身份的任何干预能力。它只管授权(what),不管你是谁、用什么方式登录(who + how)。所以 GRANT ... IDENTIFIED BY 这种写法会直接报 ERROR 1064 (42000) —— 解析器在语法层面就拒绝了,不是执行时报错。
CREATE USER 和 ALTER USER 才是密码操作的唯一入口
密码设置、修改、认证插件指定,全部收归到 CREATE USER 和 ALTER USER 两条语句里:
-
CREATE USER 'u'@'%' IDENTIFIED WITH mysql_native_password BY 'p':建用户 + 指定插件 + 设密(推荐显式写插件) -
ALTER USER 'u'@'%' IDENTIFIED BY 'newp':改密(默认沿用原插件) -
ALTER USER 'u'@'%' IDENTIFIED WITH caching_sha2_password BY 'newp':换插件并设密
旧教程里常见的 SET PASSWORD = PASSWORD('x') 或直接 UPDATE mysql.user 全部失效:PASSWORD() 函数已被删除,authentication_string 字段也不能裸写明文——必须经由 ALTER USER 触发内部哈希流程,否则认证必然失败。
caching_sha2_password 插件不兼容,会让“语法正确”的密码修改白忙一场
你执行了正确的 ALTER USER,也 FLUSH PRIVILEGES 了,但客户端连不上,十有八九是插件问题:
- MySQL 8.0 默认用
caching_sha2_password,而 Navicat 11、老版 JDBC(mysql-connector-java:5.1.x)、PHP mysqli 扩展等不支持它 - 错误表现不是 SQL 报错,而是连接时卡住、或报
ERROR 1045 (28000): Access denied,排查时容易忽略认证层 - 解决方法不是降级 MySQL,而是创建/修改用户时强制指定插件:
IDENTIFIED WITH mysql_native_password BY 'p'
SYSTEM_USER 权限限制让某些 ALTER USER 操作静默失败
如果你对带 SYSTEM_USER 权限的账户(如 root@'%'、某些管理账号)执行 ALTER USER,可能遇到 ERROR 1227 (42000):
- 这不是密码或语法问题,而是权限检查:操作者自己也得有
SYSTEM_USER权限才能修改这类账户 - 常见于升级后未同步调整权限,或用普通管理员账号去改 root 密码
- 临时解法:
GRANT SYSTEM_USER ON *.* TO 'admin'@'%'; FLUSH PRIVILEGES;,但应评估是否真需该权限
最易被忽略的点是:插件兼容性和 SYSTEM_USER 权限这两类问题,都不会在 SQL 执行阶段暴露,而是在后续连接或操作中突然失效——它们藏在“成功执行”之后,而不是之前。











