应执行alter user切换认证插件并立即flush privileges:先查select user,host,plugin from mysql.user where user='root'确认是否为caching_sha2_password,再用alter user 'root'@'host' identified with mysql_native_password by 'pwd'修改,host须与连接时完全一致且必须显式指定密码,最后flush privileges并验证plugin已变更。

确认当前用户用的是 caching_sha2_password
别急着改,先查清楚是不是它在作祟。登录 MySQL 后执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'root';。如果 plugin 列显示 caching_sha2_password(注意不是 sha256_password),且你用的是旧版 Navicat、PHP mysqli、PyMySQL 或某些 JDBC 驱动,那基本就是它了。错误提示里带 Authentication plugin 'caching_sha2_password' cannot be loaded 或 ERROR 2058,也基本可锁定。
执行 ALTER USER 切换插件必须带密码
这条语句看着简单,但漏掉任意一点都会连不进数据库:ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
-
'root'@'localhost'中的host必须和你实际连接时完全一致——'root'@'127.0.0.1'和'root'@'localhost'是两个独立用户,得分别改 -
BY 'your_password'必须显式写上,哪怕密码没变;省略会导致原密码被清空,下次直接锁死自己 - 远程用户要改
'root'@'%'或具体 IP,不能只改 localhost
改完必须 FLUSH PRIVILEGES
虽然 MySQL 8.0 多数情况会自动刷新权限,但在 Docker、phpEnv、某些小版本(如 8.0.22 之前)或云数据库代理层下,不执行 FLUSH PRIVILEGES; 就不会生效。这不是可选项,是必做动作。执行后立刻验证:SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,确保 plugin 已变成 mysql_native_password。
my.cnf 改 default_authentication_plugin 没用?正常
很多人改了 [mysqld] 下的 default_authentication_plugin = mysql_native_password 还是连不上——因为这个配置只影响「新创建的用户」,对已存在的 root、repl_user 等完全无效。云数据库(如阿里云 RDS)通常还不让改 my.cnf。所以别在这上面浪费时间,ALTER USER 是唯一通用、即时生效的解法。
最容易被忽略的点:host 匹配必须精确到字符级,连空格都不能多;FLUSH PRIVILEGES 在部分部署中不是“建议”,而是“必须”;改完不验证 plugin 字段就去连客户端,大概率白忙活。











