default_authentication_plugin只影响新用户,不修复老连接;必须对每个现有用户执行alter user修改plugin字段,并flush privileges生效。

default_authentication_plugin 配置只影响新用户,不修复老连接
改 my.cnf 里的 default_authentication_plugin = mysql_native_password 确实能生效,但它只决定后续 CREATE USER 语句在没显式指定 IDENTIFIED WITH 时用哪个插件。对已存在的用户(包括 root)完全无效——这也是为什么很多人配了却还是连不上。
典型错误现象:
- 旧版 PHP(如 7.2)、Navicat 12、DBeaver 早期版本报错
ERROR 1251: Client does not support authentication protocol -
mysql -u root -p直接失败,但sudo mysql(通过auth_socket)能进
必须对每个现有用户单独执行 ALTER USER
真正要改的是 mysql.user 表里具体用户的 plugin 字段,不是配置文件。操作前先确认目标用户当前插件:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
再按需执行(注意 @'host' 必须和创建时完全一致):
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'app_pass';- 改完必须执行
FLUSH PRIVILEGES;,否则不生效
如果连 root 都登录不了,得临时用 mysqld --skip-grant-tables 启动,再进库执行上述语句。
Python / PHP 连接报 Authentication plugin 'caching_sha2_password' is not supported 怎么办
这个错误明确指向客户端驱动不支持新插件,有三条路可走:
- 升级驱动:PyMySQL ≥ 0.9.3、mysqlclient ≥ 1.4.0、PHP mysqli 扩展 ≥ 7.2.16 支持
caching_sha2_password,优先推荐 - 降级用户认证:对应用专用账号执行
ALTER USER切回mysql_native_password,开发/测试环境常用 - 避免全局改配置:不要为兼容性把整个实例切回旧插件,安全代价高;
caching_sha2_password的 SHA256 + salt + SSL 支持是实打实的防护提升
Docker 初始化脚本里创建的用户默认用了 caching_sha2_password
MySQL 官方镜像(如 mysql:8.0)启动时,若用 MYSQL_ROOT_PASSWORD 或初始化 SQL 创建用户,会默认走 caching_sha2_password。这时候光靠 default_authentication_plugin 配置项拦不住——因为初始化逻辑本身没读这个配置。
解决办法只有两个:
- 在初始化 SQL 文件末尾手动加
ALTER USER语句,比如:ALTER USER 'dev_user'@'%' IDENTIFIED WITH mysql_native_password BY 'dev123'; FLUSH PRIVILEGES; - 或改用显式声明插件的
CREATE USER:CREATE USER 'dev_user'@'%' IDENTIFIED WITH mysql_native_password BY 'dev123';
容易被忽略的一点:Docker 容器重启后,如果挂载了外部数据卷,用户状态是持久化的,但初始化脚本只在首次启动时运行——所以改错一次,后续就一直错。











