直接修改用户认证插件可解决caching_sha2_password兼容性问题,需对每个用户执行alter user ... identified with mysql_native_password by 'password',并覆盖localhost、127.0.0.1、%等所有host。

直接改用户认证插件就能解决,不是重设密码,也不是改配置文件就完事——ALTER USER语句必须对每个已有用户单独执行,且BY 'password'不可省略。
ERROR 2058 或 “Client does not support authentication protocol” 怎么快速定位
这不是密码输错,也不是网络不通,而是客户端根本不认识caching_sha2_password这个插件。典型表现包括:
- Navicat 12 / DBeaver 早期版本 / PHP 7.2 的
mysqli扩展直接报错退出 -
mysql -u root -p命令行失败,但sudo mysql(走auth_socket)能进 - Java 应用抛
SQLException: Client does not support authentication protocol
先确认问题根源:连上 MySQL 后执行
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果 plugin 列显示 caching_sha2_password,那就对了——这就是要改的对象。
ALTER USER 必须带 BY 'xxx',不能只改插件
MySQL 8.0 不允许“只换插件不指定密码”。哪怕你只想保留原密码哈希,也必须显式提供明文密码。否则语句会报语法错误或静默失败。
- 正确写法:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 错误写法:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password;(缺BY) - 远程用户别漏掉 host:
'root'@'%'和'root'@'192.168.1.100'是不同记录,都要单独改 -
FLUSH PRIVILEGES不是必须,但加了没坏处;改完立即生效,不用重启 MySQL
localhost 和 127.0.0.1 是两个用户,本地连接常踩这个坑
很多客户端默认用 TCP 连 127.0.0.1,而你只改了 'root'@'localhost',结果还是连不上。
- 查全量用户:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 常见组合都要覆盖:
'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' - Docker 环境尤其要注意:容器内执行的语句,是否真的作用在你正在连接的那个实例上?挂载的配置或启动参数可能覆盖你的修改
shell 解析特殊字符密码导致登录失败
插件改对了、密码也对,但命令行死活登不进去?大概率是 shell 把 !、#、$ 当成元字符处理了。
- 错误:
mysql -u root -p"pass!@#123"→ bash 报event not found - 正确:
mysql -u root -p'pass!@#123'(单引号包裹) - 更稳妥:
mysql -u root -p回车后手动输入密码,彻底避开 shell 解析
真正容易被忽略的是:改插件之后,客户端(比如 Navicat)可能缓存了旧的认证方式,必须关掉整个应用再重开,点“重连”没用。











