MySQL 8.0 默认认证插件 caching_sha2_password 与老客户端(如 Navicat 12、PyMySQL

MySQL 8.0 默认用 caching_sha2_password,老客户端(Navicat 12、PyMySQL
确认当前用户用的是哪个认证插件
登录 MySQL 命令行后,先查清楚问题出在哪:
-
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';—— 看你连的是'root'@'localhost'还是'root'@'127.0.0.1'或'root'@'%',这三个在 MySQL 里互不等价 - 如果
plugin列显示caching_sha2_password,那基本就是它了 - 注意:有些云数据库(如阿里云 RDS)不让你改配置文件,
ALTER USER是唯一可行路径
执行 ALTER USER 切换插件必须带密码
只写 IDENTIFIED WITH mysql_native_password 不行,会清空密码导致锁死自己:
- 改本地连接:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 改远程连接:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 如果你用
127.0.0.1连(Navicat 默认行为),还得单独加一句:ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_new_pass'; - 改完立刻执行:
FLUSH PRIVILEGES;,否则不生效
my.cnf 配置只影响新用户,重启也不自动修复旧用户
有人改了 [mysqld] 段的 default_authentication_plugin = mysql_native_password 就以为万事大吉,结果还是连不上——因为已有用户记录里的 plugin 字段不会自动更新:
- 配置生效需重启 MySQL:
sudo systemctl restart mysqld(systemd 环境) - 但重启后新建的用户才用新插件,
root、admin这些老用户仍保持原plugin值 - 云服务(RDS/CDB)通常禁写
/etc/my.cnf,这条路根本走不通 - 开发机或 Docker 可加启动参数:
--default-authentication-plugin=mysql_native_password,但同样不修复存量用户
最容易被忽略的一点:Navicat 会缓存连接配置,改完服务端后不关掉重开软件,或者不删掉旧连接重建,它可能还在用旧的握手参数重试。host 写 localhost 却没同步改 'root'@'localhost',或者密码含 @、/ 被 URL 解析吃掉——这些细节比插件切换本身更常导致失败。











