必须显式执行alter user 'user'@'host' identified with mysql_native_password by 'pwd'并flush privileges,否则仅set password或省略with子句无法更改认证插件;host须完全匹配,plugin字段必须验证为mysql_native_password。

ALTER USER 必须带 WITH mysql_native_password,否则无效
只执行 SET PASSWORD 或 ALTER USER ... IDENTIFIED BY 不会改认证插件,密码哈希格式仍是 caching_sha2_password,客户端照样报错 ERROR 2059 或 Plugin caching_sha2_password could not be loaded。必须显式指定插件名:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_password';- host 必须完全匹配:如果用户是
'root'@'127.0.0.1',就不能只写'root'@'localhost';查当前定义用SELECT User, Host FROM mysql.user; -
BY 'your_password'必须带上,即使密码不变——MySQL 8.0 不允许跳过明文密码重设 - 执行后建议立刻加
FLUSH PRIVILEGES;,部分小版本(如 8.0.22 及更早)不刷不会生效
验证 plugin 是否真变了,别被表象骗
改完别急着连 Navicat 或 Java 应用,先确认数据库里字段确实更新了:
- 运行
SELECT user, host, plugin FROM mysql.user WHERE user = 'root'; - 结果中
plugin列必须是mysql_native_password,不是caching_sha2_password、sha256_password,更不是auth_socket(Ubuntu 22.04 默认可能用这个,得先用sudo mysql登录再操作) - 如果还是旧值,常见原因是 host 写错,比如你改的是
'root'@'localhost',但客户端实际连的是'root'@'192.168.1.100',两个用户完全独立
命令行登录含特殊字符密码时,shell 先拦下了
插件改对了、密码也对,但 mysql -u root -p"pass!@#123" 报 event not found?这不是 MySQL 拒绝,是 bash 把 ! 当成历史展开符处理了:
- 正确写法是单引号包裹:
mysql -u root -p'pass!@#123' - 或逐个转义:
mysql -u root -ppass\!\@\#123 - 实在不确定,就用交互式输:
mysql -u root -p回车后手动输入
default_authentication_plugin 只影响新用户,老用户不会自动变
在 /etc/mysql/mysql.conf.d/mysqld.cnf 的 [mysqld] 段加 default_authentication_plugin = mysql_native_password 并重启服务,只让后续 CREATE USER 的用户默认用老插件:
- 已有用户(包括升级前就存在的
root)的plugin字段保持不变,仍需单独ALTER USER - 云数据库(阿里云 RDS、腾讯云 CDB)通常禁用该配置项,这条路走不通
- 确认 MySQL 实际加载哪个配置文件:运行
mysqld --help --verbose | grep "Default options",往第一个存在的路径里加配置











