最准方法是执行SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user',plugin值为caching_sha2_password即确认;需注意Navicat等旧客户端兼容性问题及ALTER USER必须带全'user'@'host'并FLUSH PRIVILEGES。

怎么确认真是caching_sha2_password在报错
别靠错误信息猜。用还能连上的账号(比如本地root)登录 MySQL 命令行,执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
重点看plugin列。如果值是caching_sha2_password,且你用的是以下任一情况,基本就是它:
• Navicat ≤ v14
• mysql-connector-java:5.1.x 或 8.0.15-
• PyMySQL < 1.0.2 或 mysqlclient < 2.0
• PHP 7.3 及更早 + mysqli 未启用 get_server_public_key=1
典型错误包括:Authentication plugin 'caching_sha2_password' cannot be loaded、ERROR 2059、或 Navicat 提示 Access denied for user 但密码确定没错。
ALTER USER必须写全'user'@'host'并重设密码
MySQL 把 'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' 当作三个完全独立的用户。Navicat 默认走 127.0.0.1(TCP),不是 localhost(socket),很多人只改了后者却连不上。
实操必须严格按格式写,漏掉任何一部分都会失败:
• 必须显式重设密码:ALTER USER 'your_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_actual_password';
• 省略 BY 'xxx' 会清空密码,账户锁死
• 只写 'your_user' 不带 @'host' 会报 ERROR 1396,提示用户不存在
• repl_user@'192.168.1.10' 和 repl_user@'%' 是两个账号,主从同步失败时必须查准 host 再改
改完不FLUSH PRIVILEGES就等于没改
MySQL 8.0.16+ 权限缓存更严格,ALTER USER 只改元数据,不自动刷新内存中的认证状态。
必须紧跟着执行:FLUSH PRIVILEGES;
否则连接仍走旧插件,重启 MySQL 也无效。
额外注意:
• 宝塔、phpEnv 等面板环境,改完后还需手动重启 MySQL 服务,否则连接池可能继续复用旧认证状态
• Navicat 不会自动感知变更,必须关闭软件重开,或删掉旧连接重建(它缓存握手参数)
• 云数据库(如阿里云 RDS)禁写 /etc,my.cnf 里设 default_authentication_plugin 对存量用户完全无效
为什么default_authentication_plugin配置没用
default_authentication_plugin=mysql_native_password 这个配置项只影响「之后新建的用户」,对已存在的 root、应用账号、复制账号完全无效。很多人改完就重启,结果 Navicat 还是连不上——因为旧用户根本没被改。--default-auth=mysql_native_password 这种命令行参数只作用于当前 mysql 客户端进程,对 Navicat、Java 应用、Python 脚本里的驱动毫无影响。
真正容易被忽略的是:Navicat 会缓存连接配置,改完服务端后不关掉重开软件、不删旧连接重建,它可能还在用旧握手参数重试——host 写 localhost 却没同步改 'root'@'localhost',或者密码含 @、/ 被 URL 解析吃掉,这些细节比插件切换本身更常出问题。



















