90%的连接问题源于认证插件不匹配,需用alter user修改用户认证插件而非改动全局配置;先执行select user,host,plugin from mysql.user where user='your_user'确认plugin是否为caching_sha2_password。

直接改用户认证插件,别碰全局配置,90% 的问题靠一条 ALTER USER 就能解决。
查清楚当前用户用的是哪个认证插件
连不上不是因为“密码错了”,而是服务端说“我要用 caching_sha2_password 验证”,客户端回一句“我没听过这玩意”。先确认是不是它在作怪:
- 用能登录的方式(比如本地
mysql -u root -p)进到 MySQL - 执行:
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user'; - 重点看
plugin列:如果是caching_sha2_password,且你用的是 Navicat 旧版、Node.js 的mysql包、PyMySQL -
host得写对——'root'@'localhost'和'root'@'%'是两个独立账号,远程连失败但本地能连,大概率是漏改了'%'这条
用 ALTER USER 切回 mysql_native_password
这是最准、最安全、影响最小的解法。不需要重启 MySQL,也不用改配置文件:
- 语法必须完整带单引号:
ALTER USER 'your_user'@'host' IDENTIFIED WITH mysql_native_password BY 'your_password'; - 别写成
ALTER USER your_user@host ...——会报错ERROR 1064 - 密码明文写进去,确保和你连接时填的一致;如果不想暴露密码,可先用
SET PASSWORD单独设,再ALTER USER ... IDENTIFIED WITH ...换插件 - 执行完补一句:
FLUSH PRIVILEGES;(虽然多数情况自动生效,但云数据库如阿里云 RDS 有时需要显式刷) - 改完立刻生效,不用重启服务,也不影响其他用户
不同客户端的绕过或适配方式(仅当不能改服务端时)
如果你完全没法登录 MySQL(比如没管理员权限),或者必须保留 caching_sha2_password(比如安全合规强制要求),才考虑这些:
- Node.js 用
mysql2替掉mysql(mysql包已停止维护,不支持新协议);连接时加authPlugin: 'auth/mysql_native_password'不起作用,得换包 - Python 用
mysql-connector-python8.0+ 或 PyMySQL ≥ 0.9.3,并在连接参数里显式传auth_plugin='mysql_native_password' - JDBC URL 后加
&serverTimezone=UTC&allowPublicKeyRetrieval=true&useSSL=false,同时驱动必须是mysql-connector-java:8.0.33+ - 命令行客户端可在
~/.my.cnf里加[client] default_authentication_plugin = mysql_native_password,但这只影响本地命令行,不影响程序
为什么别乱动 my.cnf 的 default_authentication_plugin
有人一搜就去改 my.cnf 加 default_authentication_plugin=mysql_native_password,这容易踩坑:
- 只对「之后新建的用户」生效,已有用户的
plugin字段不变,该连不上还是连不上 - 某些云数据库(如腾讯云 CDB、AWS RDS)根本不允许改这个参数,加了也白加
- Docker 官方镜像默认禁用该配置项,强行挂载配置可能让容器启动失败
- 生产环境一旦开了全局降级,后续想给新用户配
caching_sha2_password反而要额外ALTER USER覆盖,徒增管理成本
真正卡住人的从来不是命令记不住,而是查 host 时只看了 'localhost'、忘了还有 '%',或者复制命令时漏了单引号——这两个点,比插件本身难 debug 得多。











