连不上不是密码错了,是客户端不支持caching_sha2_password插件;需先用SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username'确认插件类型,若为caching_sha2_password且客户端版本老旧(如Navicat 12/13、PyMySQL < 1.0等),则执行ALTER USER 'your_username'@'host' IDENTIFIED WITH mysql_native_password BY 'password'并立即FLUSH PRIVILEGES,同时确保bind-address配置允许远程连接、用户host匹配、防火墙开放3306端口。

连不上不是密码错了,是客户端根本不认识 caching_sha2_password 插件——改 ALTER USER 就行,但必须严格匹配 host、带密码、执行 FLUSH PRIVILEGES。
怎么确认真是 caching_sha2_password 搞的鬼
先用能连上的账号(比如 root)登录 MySQL 命令行,查你那个远程用户实际用的插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_username';
如果 plugin 列显示 caching_sha2_password,且你用的是 Navicat 12/13、PyMySQL < 1.0、MySql.Data < 8.0.28、PHP mysqli 7.2–7.4,基本就是它了。
-
'your_username'@'localhost'、'your_username'@'127.0.0.1'、'your_username'@'%'是三个独立账号,别只查localhost就以为全搞定了 - Navicat 默认走 TCP 连接,实际连接 host 是
127.0.0.1或公网 IP,不是localhost - 错误信息里带
Authentication plugin 'caching_sha2_password' cannot be loaded或Client does not support authentication protocol,基本可锁定
ALTER USER 必须带密码、必须匹配 host、必须刷新权限
这条命令看着简单,漏掉任意一点都会锁死自己或无效:
- 不能只写
IDENTIFIED WITH mysql_native_password,必须加BY 'real_password'——否则密码哈希被清空,账号彻底失联 - host 必须和你远程连接时用的一致:连的是
192.168.1.100,就得改'your_username'@'192.168.1.100';连的是%,就改'your_username'@'%' - 执行完立刻跟
FLUSH PRIVILEGES;,部分云 RDS 和 Docker 环境不执行这句变更就不生效 - 如果报
ERROR 1396,说明该用户不存在,得先CREATE USER 'your_username'@'%' IDENTIFIED BY 'xxx';再改
改完还连不上?检查这三个常被忽略的点
认证插件改对了,不代表一定能连通:
- MySQL 配置里
bind-address还是127.0.0.1→ 改成0.0.0.0或注释掉,然后sudo systemctl restart mysqld - 用户没真正授权远程访问:
GRANT ALL ON *.* TO 'your_username'@'%';执行后也得FLUSH PRIVILEGES; - 防火墙或云平台安全组没开 3306 端口 → 本地用
telnet your_server_ip 3306测试是否通
最常卡在 host 不匹配或忘了 FLUSH PRIVILEGES,这两个动作缺一不可。


















