最稳方法是直接用ALTER USER修改用户认证插件:先查SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username',确认host匹配(如localhost/127.0.0.1/%)和plugin为caching_sha2_password,再执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'password',并FLUSH PRIVILEGES;客户端需重启且确保连接host与修改项一致。

直接改用户认证插件最稳,别指望重启 MySQL 或改配置文件就能自动修复旧用户。
查清楚当前用户用的是哪个 plugin
连不上不是因为密码错,而是客户端根本不认识服务端发来的认证协议。先登录 MySQL 命令行(mysql -u root -p),执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
注意三点:
-
your_username要替换成你实际连接用的用户名 -
host字段必须匹配——'localhost'、'127.0.0.1'、'%'是三个完全不同的用户记录 - 如果
plugin列显示caching_sha2_password,且你用的是 .NET Framework 的MySql.Data 、PyMySQL
ALTER USER 必须带密码重设,不能只换插件
只写 ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password; 会清空密码,导致锁死自己。正确写法是:
ALTER USER 'your_username'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';
常见遗漏点:
- 如果你用
127.0.0.1连(比如 Navicat 默认行为),还得单独执行一遍:ALTER USER 'your_username'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 远程连接要改
'your_username'@'%',别漏掉单引号 - 改完立刻执行
FLUSH PRIVILEGES;,部分 MySQL 版本不自动刷新权限
改完仍连不上?重点检查客户端侧细节
服务端改对了,但客户端可能还在用旧缓存或错配参数:
- Navicat / MySQL Workbench 会缓存握手方式,关掉软件再重开,别点“重连”
- 连接字符串里密码含
@、/、:等字符时,URL 解析可能截断——换纯字母数字密码快速验证 - Docker 环境下确认容器内运行的是你修改后的配置,不是挂载了旧
my.cnf或用了镜像默认启动参数 - 某些云数据库(如阿里云 RDS)禁写配置文件,
ALTER USER是唯一可行路径,别白费劲找my.cnf
真正容易被忽略的,不是“怎么改”,而是“改哪几个 host”和“客户端是否真用了新握手”。一个 'root'@'localhost' 改对了,但应用连的是 'root'@'127.0.0.1',照样报错。


















