最稳方案是直接用ALTER USER修改认证插件,必须同时指定精确host和密码,否则清空密码导致无法登录;改完立即执行FLUSH PRIVILEGES生效。

直接改用户认证插件最稳,别一上来就动 my.cnf —— 除非你明确要影响所有新用户,且能重启服务。
ALTER USER 必须带密码和精确 host 才生效
MySQL 8.0 要求切换认证插件时,ALTER USER 语句必须同时指定密码和 host,缺一不可。只写 ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password; 会清空密码字段,导致下次连不进。
- host 必须和你实际连接方式完全一致:
'root'@'localhost'(Unix socket)、'root'@'127.0.0.1'(TCP)、'root'@'%'是三个独立账户 - Navicat / MySQL Workbench 默认走
127.0.0.1,不是localhost;光改后者没用 - 远程应用常用
'app_user'@'%',就得单独执行:ALTER USER 'app_user'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 密码含
@、/、:等字符时,JDBC URL 里要 URL 编码;命令行用双引号可能被 shell 解析,改用单引号:mysql -u root -p'pass!123'
FLUSH PRIVILEGES 不是可选项,是生效前提
ALTER USER 只更新磁盘表,不刷新内存中的权限缓存。不执行 FLUSH PRIVILEGES;,客户端仍按旧插件握手,错误照旧。部分 MySQL 8.0.x 小版本(尤其低于 8.0.23)不刷就不生效。
- 执行后立刻验证:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,确认plugin列是mysql_native_password - 云数据库(如阿里云 RDS)也支持这条命令,且立即生效——这是唯一可行路径
- 如果连不上,先用
mysqld --skip-grant-tables或 socket 登录(mysql -S /var/run/mysqld/mysqld.sock -u root)再操作
my.cnf 的 default_authentication_plugin 只影响新用户
在 /etc/mysql/mysql.conf.d/mysqld.cnf 的 [mysqld] 段加 default_authentication_plugin = mysql_native_password,看起来一劳永逸,但其实它对已有用户完全无效。
- 配置必须严格放在
[mysqld]段下,[client]或[mysql]段无效 - 改完必须
sudo systemctl restart mysqld(reload不起作用) - Docker 部署需用启动参数:
--default-authentication-plugin=mysql_native_password - 查 MySQL 实际加载哪个配置:
mysqld --help --verbose | grep "Default options",优先级高的会覆盖低的
最容易被忽略的是:改了全局配置后,老用户(包括 root)的 plugin 字段依然没变,必须手动跑一遍 ALTER USER。很多“改了配置还是连不上”的问题,卡在这一步。


















