alter user 必须指定完整账号(含host)、带明文密码、执行 flush privileges 才生效;caching_sha2_password 插件需显式切换,否则报错 2059/1251。

直接执行 ALTER USER,必须带密码、必须精确匹配 host、必须执行 FLUSH PRIVILEGES —— 其他方法要么无效,要么只影响新用户。
确认当前插件是不是 caching_sha2_password
别猜错误原因。登录 MySQL 后立刻查:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
重点看三列是否完全匹配你实际连接时用的凭据:'root'@'localhost'、'root'@'127.0.0.1'、'root'@'%' 是三个独立账户。Navicat 默认走 127.0.0.1(TCP),命令行默认走 localhost(socket),不一致就会改了也白改。
- 如果
plugin列显示caching_sha2_password,就是它了 - 报错
ERROR 2059、ERROR 1251或Client does not support authentication protocol requested by server基本可锁定 - 云数据库(如阿里云 RDS)查出来是
caching_sha2_password,但禁止改配置文件,ALTER USER是唯一可行路径
执行 ALTER USER 切换插件
语法强制要求:必须指定 host、必须带 BY 'password'、不能省略明文密码 —— 即使密码没变也要重写一遍。否则 MySQL 8.0 会清空密码字段,导致锁死自己。
- 改本地 socket 连接:
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 改 TCP 连接(Navicat / 应用常用):
ALTER USER 'root'@'127.0.0.1' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 改远程访问:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_pass'; - 密码含
!、#、$等 shell 特殊字符时,命令行登录要用单引号:mysql -u root -p'pass!@#123',否则报event not found
FLUSH PRIVILEGES 不是可选项,是生效前提
ALTER USER 只更新磁盘上的 mysql.user 表,不刷新内存中的权限缓存。不执行这句,客户端仍按旧插件握手,错误照旧。
- 执行后无输出即成功;出现
Query OK表示已加载 - 验证是否生效:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';,确认plugin列变成mysql_native_password - 某些 Docker 镜像或 Ubuntu 22.04 安装包可能默认启用了
auth_socket,此时ALTER USER会报ERROR 1054 (42S22): Unknown column 'password' in 'field list',需先用sudo mysql登录再操作
为什么改完还是连不上?最常忽略的三件事
插件改对了,只是第一步。大量失败卡在后续环节:
- Navicat / Workbench 缓存了旧连接配置,不关软件、不删旧连接重建,它还在用旧 handshake 参数重试
- 应用连接字符串里 host 写的是
localhost,但只改了'root'@'%',漏掉了'root'@'localhost'或'root'@'127.0.0.1' - 密码含
@或/,被 JDBC URL 或 Navicat 连接框解析吃掉,比如jdbc:mysql://localhost:3306/db?user=root&password=pa@ss/word会截断
安全代价要心里有数:回退到 mysql_native_password 意味着放弃 RSA 密钥交换、丢失双密码策略、部分角色功能异常。它只是兼容性妥协,不是长期方案。











