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

查清楚当前用户用的是哪个认证插件
连不上不是因为“密码错”,而是客户端不认识服务端要求的认证方式。先登录 MySQL 命令行(mysql -u root -p),执行:SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
重点看 plugin 列是不是 caching_sha2_password。注意:'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' 是三个独立用户,必须分别查、分别改。
用 ALTER USER 切换单个用户的认证插件
这是修复连接失败最快的方式,不用重启 MySQL,所有环境(包括阿里云 RDS)都支持,但必须严格满足以下条件:
-
ALTER USER必须带IDENTIFIED WITH mysql_native_password BY 'xxx';只写IDENTIFIED WITH mysql_native_password会清空密码,导致锁死自己 - host 必须完全匹配,比如用户是
'app_user'@'192.168.1.%',就不能写成'app_user'@'%' - 执行后必须跟
FLUSH PRIVILEGES;,否则部分 MySQL 8.0.x(尤其是 8.0.22 及更早)不生效 - 如果应用连的是
localhost,MySQL 8.0 默认走 socket,而 Navicat 默认走 TCP(即127.0.0.1),得单独处理'user'@'127.0.0.1'
改 my.cnf 的 default_authentication_plugin(仅限自建库)
这个配置只对新创建的用户生效,不能解决你当前连不上的问题,但它能防止后续新建用户再踩坑:
- 必须加在
[mysqld]段下,写在[client]或[mysql]段无效 - 正确写法是:
[mysqld]<br>default_authentication_plugin = mysql_native_password
- 改完必须
sudo systemctl restart mysqld(不是reload) - MySQL 8.4+ 已弃用该配置项,需改用
authentication_policy
为什么改了 default_authentication_plugin 还连不上 root?
因为 root 用户是在 MySQL 8.0 升级前就存在的,它的 plugin 字段仍为 caching_sha2_password,不受全局配置影响。必须手动更新:
- 先用临时方式登录(比如跳过权限检查,或用 socket 登录)
- 执行:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY '你的密码'; - 如果要支持远程
root登录,还得补一句:ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '你的密码'; - 最后别忘:
FLUSH PRIVILEGES; - 验证是否成功:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';——输出的plugin列必须是mysql_native_password
FLUSH PRIVILEGES 的强制执行——尤其在云数据库上,漏掉这两点,ALTER USER 就像没执行一样。











