答案是确认插件不匹配:执行select user, host, plugin from mysql.user where user = 'your_username',若plugin为caching_sha2_password且客户端为navicat 15以下、pymysql

连不上 MySQL 8.0,八成是 caching_sha2_password 插件和客户端不匹配——不是密码错,是握手协议根本对不上。
怎么确认真是 caching_sha2_password 搞的鬼
先用能连的方式(比如 mysql -u root -p)登录命令行,执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
重点看 plugin 列。如果是 caching_sha2_password,而你用的是:
- Navicat 15 以下
- PyMySQL
- PHP mysqli 7.2–7.4
- Django 默认配置(未升级 PyMySQL)
- 宝塔面板数据库管理页
基本就是它了。注意:'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' 是三个独立账户,必须分别查、分别改。
ALTER USER 切换插件时最容易踩的坑
这条命令看着简单,但漏掉任意一个细节就会锁死自己或无效:
- 必须显式写
BY 'your_password'—— 只写IDENTIFIED WITH mysql_native_password会清空密码 - 改完必须立刻执行
FLUSH PRIVILEGES;,尤其云 RDS(如阿里云)不执行这句就不生效 -
'root'@'127.0.0.1'很容易被忽略:Navicat 默认连127.0.0.1而非localhost,得单独处理 - 如果提示
ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded,说明插件根本没启用(常见于 MySQL 8.4+ 或精简安装),不能硬切,得走启用流程
MySQL 8.4+ 中 mysql_native_password 插件不可用怎么办
从 MySQL 8.4 开始,mysql_native_password 插件默认禁用甚至移除。此时再执行 ALTER USER ... IDENTIFIED WITH mysql_native_password 必报错。
有两个选择:
- 推荐:升级客户端驱动(PyMySQL ≥1.0、Connector/J 8.0+、PHP 8.0+ mysqli),直接支持
caching_sha2_password - 备选:启用插件(需修改配置并重启):
在my.cnf的[mysqld]段加:[mysqld] mysql_native_password=ON authentication_policy=mysql_native_password
注意:
default_authentication_plugin在 8.4+ 已弃用,不能用;重启后仍需对已有用户执行ALTER USER+FLUSH PRIVILEGES
真正容易被忽略的点是:改完插件后,客户端连接池(如 PHP-FPM、Java 应用)不会自动刷新,旧连接仍会失败——必须重启对应进程,而不是只刷新页面或重开 Navicat 窗口。











