直接改用户认证方式最稳妥,不用动全局配置,也不用重启mysql服务;alter user 'user'@'host' identified with mysql_native_password by 'pwd'; 并执行flush privileges,可立即修复旧客户端连接失败问题。

直接改用户认证方式最稳妥,不用动全局配置,也不用重启 MySQL 服务。 云数据库(如阿里云 RDS、腾讯云 CDB)通常禁用 my.cnf 修改权限,这条路根本走不通;而 ALTER USER 方式在所有 MySQL 8.0+ 环境下都生效,且立竿见影。
ALTER USER 切换单个用户的认证插件
这是修复连接失败最快、最通用的方法。错误现象通常是:Plugin caching_sha2_password could not be loaded 或 Client does not support authentication protocol —— 说明客户端(比如旧版 JDBC、PyMySQL、PHP mysqli)压根不认这个插件。
-
ALTER USER必须显式指定WITH mysql_native_password,只用SET PASSWORD不会改认证插件 - 用户名和 host 必须完全匹配,查当前用户用:
SELECT User, Host FROM mysql.user;,比如'app_user'@'192.168.1.%'和'app_user'@'%'是两个不同用户 - 执行后必须跟
FLUSH PRIVILEGES;,否则部分 MySQL 8.0.x 版本(尤其是小版本低于 8.0.23 的)不会立即生效 - 如果应用连的是
localhost,注意 MySQL 8.0 对localhost的解析更严格(可能走 socket 而非 TCP),测试时可临时改成127.0.0.1
my.cnf 修改 default_authentication_plugin(仅限自建库)
如果你能登录服务器并重启 mysqld,且确认所有新用户都应默认用老插件,可以改全局配置。但注意:这**只影响后续新建的用户**,已有用户仍需单独 ALTER USER。
- 配置项必须放在
[mysqld]段下,写成[client]或[mysql]段完全无效 - 正确写法:
[mysqld] default_authentication_plugin = mysql_native_password
- 改完必须
sudo systemctl restart mysqld(不是reload),否则不生效 - 某些容器化部署(如 Docker 官方镜像)默认没挂载 my.cnf,得通过启动参数或 entrypoint 注入配置
客户端配置文件补救(仅限命令行工具)
对 MySQL 命令行客户端(mysql 命令)本身有效,不影响应用连接。适合运维临时调试,不能解决 Java/Python 应用报错。
- 在用户家目录加
~/.my.cnf,内容为:[client] default_authentication_plugin = mysql_native_password
- 该配置只作用于本地
mysql -u ...连接,不影响 JDBC URL、PHP mysqli_connect() 等 - 文件权限必须是
600(chmod 600 ~/.my.cnf),否则客户端会忽略它
最容易被忽略的一点:很多团队试过改 my.cnf 却发现没用,其实是没注意到配置段写错了位置,或者以为改了就能让老用户自动切换——其实不会。真正要修通连接,ALTER USER + FLUSH PRIVILEGES 是唯一全环境兼容的操作。











