确认是caching_sha2_password插件导致连接失败:登录MySQL执行SELECT user, host, plugin FROM mysql.user WHERE user='your_username',若plugin列为caching_sha2_password且客户端为Navicat 12以下、PyMySQL

连不上 MySQL 8.0,八成不是密码错、不是网络不通,而是客户端压根不认 caching_sha2_password 插件——握手协议不匹配,连接在第一步就断了。
怎么确认是 caching_sha2_password 在报错
用还能登录的账号(比如 root)进 MySQL 命令行,执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
重点看 plugin 列。如果显示 caching_sha2_password,且你用的是以下任一情况,基本就是它:
- Navicat 12 或更早版本
PyMySQL 或 <code>mysqlclientMySql.Data (.NET)- PHP 7.3/7.4 +
mysqli扩展未升级 - JDBC 驱动是
mysql-connector-java:5.1.x
典型错误信息包括:Authentication plugin 'caching_sha2_password' cannot be loaded、Client does not support authentication protocol,或连接直接超时无提示。
ALTER USER 切插件必须带密码、匹配 host、执行 FLUSH PRIVILEGES
这条命令看着简单,但漏掉任意一项就会锁死账号或无效:
- 必须显式写
BY 'real_password':只写IDENTIFIED WITH mysql_native_password不加BY,原密码哈希会被清空 -
host必须和你实际连接时完全一致:'user'@'localhost'、'user'@'127.0.0.1'、'user'@'%'是三个独立用户;Navicat 默认走127.0.0.1,只改localhost就白忙 - 执行完必须紧跟
FLUSH PRIVILEGES;:部分云 RDS、Docker 或 phpEnv 环境下不执行这句,变更根本不生效 - 密码含
@、/、!等字符时,命令行连接要加单引号:mysql -u user -p'pass!@#'
示例(按需选一条):
ALTER USER 'app_user'@'localhost' IDENTIFIED WITH mysql_native_password BY 'mypass123';
ALTER USER 'app_user'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'mypass123';
ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'mypass123';
ERROR 1524: Plugin 'mysql_native_password' is not loaded 怎么办
这不是语法错,是服务端根本没加载这个插件——常见于 MySQL 8.4+、精简安装包或某些容器镜像:
- 先查插件路径:
SHOW VARIABLES LIKE 'plugin_dir'; - 再用系统命令确认该路径下是否存在
mysql_native_password.so(Linux/macOS)或.dll(Windows) - 若文件缺失,别手动拷贝;重装完整服务端包(如 Ubuntu 上运行
sudo apt install --reinstall mysql-server) - 若文件存在但权限不足(尤其 SELinux 环境),确保
mysql用户对目录有r-x权限,并设置正确上下文:mysqld_plugin_t
注意:mysql_native_password 在 MySQL 8.0.34+ 已被标记为废弃(deprecated),后续大版本可能移除——这不是临时方案,是过渡期必须面对的兼容性现实。


















