答案是直接执行alter user切换认证插件为mysql_native_password并flush privileges;需先用select user, host, plugin from mysql.user where user = 'root'确认plugin为caching_sha2_password,再按实际host(如'localhost'、'127.0.0.1'、'%')分别执行带by密码的完整语句,否则会清空密码或无效。

直接改用户插件,别碰 my.cnf 的 default_authentication_plugin —— 它对已有用户完全无效,改了也白改。
怎么确认真是 caching_sha2_password 在报错
别靠猜,连上 MySQL 后立刻执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
如果 plugin 列显示 caching_sha2_password(注意不是 sha256_password 或 auth_socket),且你用的是旧版 Navicat、PHP mysqli、PyMySQL、老 JDBC 驱动或宝塔内置工具,那基本就是它了。典型错误包括:
Authentication plugin 'caching_sha2_password' cannot be loadedERROR 2058 (HY000): Plugin caching_sha2_password could not be loadedClient does not support authentication protocol
ALTER USER 必须带完整语法和显式密码
这条命令看着简单,但漏掉任意一点都会锁死自己:
- 必须用
IDENTIFIED WITH mysql_native_password BY 'your_password',只写IDENTIFIED BY不会改插件 -
'root'@'localhost'中的host必须和你实际连接时完全一致:'root'@'127.0.0.1'和'root'@'localhost'是两个独立用户,得分别改 - 远程用户要改
'root'@'%'或具体 IP,不能只改localhost -
BY 'your_password'必须显式写上——哪怕密码没变,省略会导致原密码被清空
示例:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'MyP@ssw0rd123';
FLUSH PRIVILEGES 不是“建议”,是必做动作
MySQL 8.0 多数情况会自动刷新权限,但在这些场景下不执行就无效:
- Docker 容器里跑的 MySQL(尤其官方镜像)
- 云数据库代理层(如阿里云 RDS、腾讯云 CDB)
- 小版本低于 8.0.23 的部署(比如 8.0.22 或更早)
- 宝塔面板里改完后没重启 MySQL 服务
执行完立刻验证是否生效:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
确保 plugin 已变成 mysql_native_password。不验证就去连客户端,大概率白忙活。
最容易被忽略的点:host 字符级匹配(连空格都不能多)、FLUSH PRIVILEGES 在部分环境是硬性要求、改完不查 plugin 字段就以为搞定了——这三个坑,踩中一个就回不到数据库里。











