根本原因是客户端不支持caching_sha2_password插件,需用SELECT确认用户plugin值,若为caching_sha2_password则必须对'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%'等独立账户分别执行ALTER USER ... IDENTIFIED WITH mysql_native_password BY 'pwd'并FLUSH PRIVILEGES。

不是密码错了,也不是网络不通——是客户端压根不认 MySQL 8.0 默认的认证协议。
确认当前用户用的是哪个认证插件
登录 MySQL 命令行(用 root 或有权限的账号),执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
重点看 plugin 列。如果值是 caching_sha2_password,问题就坐实了。注意:'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' 是三个完全独立的账户,必须分别查、分别改。
ALTER USER 必须带密码且 host 必须匹配
这条命令看着简单,漏掉任意一点都会锁死自己:
- 不能只写 IDENTIFIED WITH mysql_native_password,必须显式加 BY 'your_password',否则密码哈希被清空,连本地命令行都登不进去
- 连接时用的是 192.168.1.100,就得改 'root'@'192.168.1.100';连的是 %,就得改 'root'@'%'
- 执行完立刻跟 FLUSH PRIVILEGES;,部分 Docker 环境和云 RDS 不执行这句,变更根本不生效
- 如果报 ERROR 1396,说明该用户不存在,得先 CREATE USER 'root'@'%' IDENTIFIED BY 'xxx'; 再 ALTER USER
my.cnf 里设 default_authentication_plugin 没用
在 my.cnf 的 [mysqld] 段加 default_authentication_plugin=mysql_native_password 并重启 MySQL,只影响后续新建的用户,对已有用户完全无效。很多人改完发现 Navicat 还是连不上,就是卡在这儿。Docker 启动时用 --default-authentication-plugin=mysql_native_password 更实用,但也仅限新用户。
真正容易被忽略的是 host 匹配和密码重置的耦合关系:改错一个 host,Navicat 从本机连可能通,但从局域网其他机器连就失败;而一旦漏掉 BY 子句,账号直接失联,连命令行都进不去。


















