先执行select user, host, plugin from mysql.user where user = 'root'确认plugin是否为caching_sha2_password,再用alter user 'root'@'host' identified with mysql_native_password by 'pwd'并flush privileges生效。

怎么确认真是caching_sha2_password导致连不上
不是所有“连不上”都怪它,得先查清楚。用 MySQL 命令行登录后执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'root';——重点看 plugin 列是不是 caching_sha2_password。如果用的是 Navicat 12、PyMySQL mysqli、旧版 DBeaver 或 SQLyog,基本就是它了。
注意:'root'@'localhost' 和 'root'@'127.0.0.1' 在 MySQL 里是两个完全不同的用户,Navicat 默认连 127.0.0.1,但你可能只改了 localhost,结果还是连不上。
典型报错包括:SQLSTATE[HY000] [2054]、ERROR 1251、Authentication plugin 'caching_sha2_password' cannot be loaded——这些都不是密码错了,是握手协议对不上。
ALTER USER切换插件时必须带密码和FLUSH PRIVILEGES
这条语句看着简单,漏掉任意一环就白干:
-
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'real_password';必须显式写BY 'xxx',只写IDENTIFIED WITH mysql_native_password会清空密码,直接锁死自己 - host 要和你实际连接时完全一致:连
192.168.1.100就得改'app_user'@'192.168.1.100',不能只改% - 执行完必须立刻跟
FLUSH PRIVILEGES;,尤其在 Docker、phpEnv 或某些云 RDS 上,不加这句权限不会生效 - 如果报
ERROR 1396 (HY000),说明该用户不存在,得先CREATE USER 'app_user'@'%' IDENTIFIED BY 'xxx';再改
为什么改my.cnf的default_authentication_plugin没用
很多人重启 MySQL 前改了 default_authentication_plugin = mysql_native_password,发现老用户还是连不上——因为这个配置只影响新 CREATE USER 的默认插件,对已有用户的 plugin 字段毫无作用。
MySQL 8.0 的 mysql.user 是个视图,字段值存在数据字典里,不靠配置文件驱动。升级后 root、admin 这些存量账号的认证方式全得手动重置,配置文件改了也白改。
云服务(如阿里云 RDS、腾讯云 CDB)通常禁止写 my.cnf,这条路根本走不通,ALTER USER 是唯一可行路径。
Navicat 缓存和连接地址细节比插件切换更常导致失败
改完服务端后,Navicat 不关掉重开、不删旧连接重建,它可能还在用旧握手参数重试;或者你在连接配置里填的是 localhost,但没同步改 'user'@'localhost',只改了 'user'@'%';再或者密码含 @、/,被 URL 解析吃掉——这些细节比插件本身更容易卡住你。
真正要动的是每个用户的认证方式,不是全局开关。批量处理多个用户时,可从 mysql.user 视图中查出所有 plugin != 'mysql_native_password' 的账号,生成一批 ALTER USER 语句执行。











