根本原因是客户端不支持caching_sha2_password插件,需先执行select user,host,plugin from mysql.user where user='your_username'确认插件类型,若为caching_sha2_password且使用旧版navicat、jdbc 5.1.x、pymysql等,则应alter user 'user'@'host' identified with mysql_native_password by 'pwd'并flush privileges。

连不上 MySQL 8.0 不是密码错了,大概率是客户端不认 caching_sha2_password 插件——直接改用户插件最有效,不用重启、云数据库也支持。
怎么确认当前用户用的是哪个认证插件
别猜,先查。登录 MySQL(mysql -u root -p),执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
注意三点:
-
your_username要替换成你实际连接用的用户名,比如app_user或root -
host必须严格匹配:'localhost'、'127.0.0.1'、'%' 是三个独立用户;Navicat 默认走127.0.0.1,但你可能只改了localhost - 如果
plugin列显示caching_sha2_password,且你用的是 JDBC 5.1.x、PyMySQL、旧版 Navicat 或 PHP mysqli 7.2–7.4,那基本就是它了
ALTER USER 必须带 WITH 和密码,否则会锁死账户
只写 ALTER USER 'user'@'host' IDENTIFIED BY 'pwd' 不会改插件,握手流程照旧。必须显式指定插件和密码:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'YourPass123!';
常见错误和要点:
- 不能省略
BY 'password':只写IDENTIFIED WITH mysql_native_password会清空密码,导致账户无法登录 - 每个
host都要单独执行:'root@'localhost' 和 'root@'127.0.0.1' 得各来一条 - 密码需满足
validate_password策略(默认 ≥8 位、大小写字母+数字+特殊字符),弱密码会被拒绝 - 执行完立刻跟
FLUSH PRIVILEGES;,MySQL 8.0.22 及更早小版本不刷权限就不生效
my.cnf 的 default_authentication_plugin 只影响新用户
这个配置在自建库中可以加,但对已存在的用户完全无效,云数据库(如阿里云 RDS、腾讯云 CDB)通常禁用该参数:
[mysqld] default_authentication_plugin = mysql_native_password
关键限制:
- 必须放在
[mysqld]段下,写在[client]或[mysql]段无效 - 改完必须
sudo systemctl restart mysqld(不是reload) - 重启后新建的用户才默认用
mysql_native_password,已有用户仍需单独ALTER USER - Docker 官方镜像若未挂载配置或启动参数覆盖,
my.cnf修改可能根本没加载
最容易被忽略的一点:改插件 ≠ 改密码策略。即使插件切成功了,如果新密码不满足 validate_password 要求,语句会报错,你以为插件没切,其实是密码被拒了。











