ALTER USER是唯一可靠解法,需执行ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd'并确保host精确匹配(如localhost/127.0.0.1/%),因caching_sha2_password与旧客户端协议不兼容导致ERROR 2058等握手失败。

ALTER USER 是唯一可靠的方式,不是重设密码,也不是改表字段。直接执行语句就能生效,不需要重启 MySQL。
为什么连不上?先确认是不是 caching_sha2_password 搞的鬼
报错 ERROR 2058 或 Client does not support authentication protocol requested by server,基本就是这个插件不兼容导致的。旧客户端(比如 Navicat 15 以前、PHP mysqli 扩展、某些 JDBC 驱动)压根不认识 caching_sha2_password,连握手都失败。
- 不是密码错了,是认证协议不匹配
-
SELECT user, host, plugin FROM mysql.user能一眼看出问题:如果plugin列显示caching_sha2_password,那就对了 - 注意
'root'@'localhost'和'root'@'127.0.0.1'是两个独立用户,TCP 连接走后者,Unix socket 走前者,必须分别处理
ALTER USER ... IDENTIFIED WITH mysql_native_password 必须带密码
MySQL 8.0 不允许只换插件不指定密码 —— 即使你只想保留原密码哈希值,语法也强制要求 BY 子句。所以哪怕密码没变,也得重复写一遍:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_actual_password';
- host 必须完全匹配,
'root'@'%'和'root'@'192.168.1.100'都要单独改 - 命令行里密码含
!、#、$时,用单引号包裹:mysql -u root -p'pass!@#123',否则 shell 会误解析 -
FLUSH PRIVILEGES不是必须的,ALTER USER已自动提交,加了也没坏处
改完还是连不上?检查这三件事
插件改了不代表万事大吉,常见漏点就这几个:
安全的随机密码生成器。支持自定义长度、字符类型(大写/小写字母、数字、特殊符号),排除相似字符,批量生成。纯 Python 标准库,无需 API 密钥。
- 客户端缓存了旧认证方式(比如 MySQL Workbench),关掉重开,别点“重连”
- Docker 启动的 MySQL,确认挂载的是修改后的配置,而不是镜像自带默认配置
- 云数据库(如阿里云 RDS)可能禁用该操作,只能通过控制台开启兼容模式,不能直接跑
ALTER USER
安全代价不能忽略
回退到 mysql_native_password 是妥协方案,不是升级:
- 不再支持 RSA 密钥交换,非 TLS 链路上传输密码更易被截获
- 丢失双密码、密码历史、账户锁定等高级策略能力
- 部分新特性(如角色权限继承)依赖新插件的元数据结构,改回去后可能异常
真正长期解法是升级客户端或启用 TLS,而不是把服务端拉回旧标准。但如果你现在就得连上 Navicat 或老 PHP 项目,那 ALTER USER 就是最短路径。


















