直接用alter user切换即可,无需改配置、不用重启服务,但必须显式指定插件和密码,且host必须完全匹配;先查select user, host, plugin from mysql.user where user = 'your_user'确认当前插件,再执行alter user 'user'@'host' identified with caching_sha2_password by 'pwd';并紧跟flush privileges。

直接用 ALTER USER 切换即可,不需要改配置、不用重启服务,但必须显式指定插件和密码,且 host 必须完全匹配。
确认目标用户当前插件是否支持切换
别凭经验判断,先查真实状态:登录 MySQL 后执行
SELECT user, host, plugin FROM mysql.user WHERE user = 'your_user';
如果 plugin 列已经是 caching_sha2_password,说明无需操作;如果是 mysql_native_password 或 auth_socket,才需要切换。注意:auth_socket 用户(常见于本地 root)不能直接用 IDENTIFIED WITH 切换,得先用 SET PASSWORD 清空认证方式再重设。
执行 ALTER USER 切换到 caching_sha2_password
语法必须完整,缺一不可:
-
ALTER USER后必须带'user'@'host'全称,'root'@'localhost'和'root'@'127.0.0.1'是两个独立账号 - 必须用
IDENTIFIED WITH caching_sha2_password,只写IDENTIFIED BY不会改插件 - 必须显式提供密码,哪怕想保留原密码——MySQL 8.0 不允许空
BY子句
示例:
ALTER USER 'app'@'%' IDENTIFIED WITH caching_sha2_password BY 'P@ssw0rd!';
执行后立刻跟:
FLUSH PRIVILEGES;
否则部分小版本(如 8.0.22)可能不生效。
客户端连接失败?检查驱动和连接参数
切过去之后,旧版客户端大概率连不上,典型报错包括:
Authentication plugin 'caching_sha2_password' cannot be loadedClient does not support authentication protocol
这不是 MySQL 配置问题,而是客户端能力不足:
- PyMySQL pymysql>=1.0
- PHP mysqli 扩展需 7.4+ 或 8.x,7.2/7.3 默认不兼容
- JDBC 驱动需
mysql-connector-java:8.0.23+,5.x 系列完全不认 - Navicat ≥15 支持,≤14 需手动勾选“使用加密连接”或降级插件
如果无法升级客户端,别硬切——caching_sha2_password 的安全优势在内网环境实际收益有限,强行切换反而阻断开发流程。
为什么 default_authentication_plugin 不起作用?
改 my.cnf 里的 default_authentication_plugin = caching_sha2_password 只影响新创建的用户,对已有用户完全无效。已有用户的 plugin 字段不会自动更新,也不会继承全局设置。这个配置项常被误认为“开关”,其实它只是个模板值。真正要改老用户,唯一可靠路径就是逐个 ALTER USER + FLUSH PRIVILEGES。
最容易被忽略的是 host 匹配粒度:一个用户在 mysql.user 表里可能有 'dev'@'localhost'、'dev'@'127.0.0.1'、'dev'@'192.168.1.%' 多条记录,每条都得单独执行 ALTER USER,漏一条,对应场景就仍走旧插件。











