mysql 8.0 默认认证插件为 caching_sha2_password,旧版 navicat 仅支持 mysql_native_password,需执行 alter user 'user'@'host' identified with mysql_native_password by 'pwd' 并 flush privileges 才生效。

Navicat 连接 MySQL 8.0 报错 1251,不是密码错了,是“说的加密语言不一样”——MySQL 8.0 默认用 caching_sha2_password,而旧版 Navicat 只认 mysql_native_password。
为什么执行 ALTER USER 后还是连不上
常见错误是命令没写全或 host 不匹配:
-
ALTER USER 'root'@'localhost'中的'localhost'必须和你实际连接时用的 host 完全一致;如果 Navicat 填的是127.0.0.1,就得改'root'@'127.0.0.1',否则改的是另一个用户 - 漏掉
BY 'your_password':只写IDENTIFIED WITH mysql_native_password会报错ERROR 1827 (HY000): The password cannot be empty - 没加
PASSWORD EXPIRE NEVER:某些环境里新密码会被立刻标记为过期,连上提示“password expired”,但 Navicat 不显示这个细节,只卡在 1251 - 执行完没运行
FLUSH PRIVILEGES:权限缓存没更新,MySQL 仍按旧插件尝试认证,错误照旧
怎么确认改成功了
别急着开 Navicat,先查数据库里 plugin 字段是否真变了:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
看到 plugin 列值为 mysql_native_password 才算生效。如果还是 caching_sha2_password,说明前面某步没执行到位——比如用了 'root'@'%' 却用 localhost 连,或者当前登录用户没权限改 mysql.user 表。
ALTER USER 语句必须带 host 和密码
这是最容易忽略的硬性要求:
-
ALTER USER 'root' IDENTIFIED WITH mysql_native_password BY 'pwd'❌ 错误:没指定 host,MySQL 不知道你要改哪个root -
ALTER USER 'root'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pwd'✅ 正确 - 如果要支持远程连接,得单独处理对应 host:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'pwd' - 改完必须跟
FLUSH PRIVILEGES,重启 MySQL 也能生效,但没必要——FLUSH PRIVILEGES更快、更轻量
长期来看,该升级还是该降级
caching_sha2_password 确实更安全(SHA-256 + 盐值 + 内存缓存),mysql_native_password 是 SHA1,已不推荐用于生产环境。临时切回老协议只为让旧工具跑起来,但要注意:
- 如果团队里有人用新版 Navicat 或 DBeaver,他们可能默认走新协议,反而连不上你刚降级的用户
- 云服务(如阿里云 RDS、腾讯云 CDB)通常禁用
mysql_native_password,你没法执行ALTER USER,只能升级客户端 - 真正需要关注的不是“怎么让它连上”,而是“谁在用这个账号、从哪连、是否该拆分权限”——比如开发用
localhost,运维用%,各自配不同插件和密码策略
最麻烦的点往往不在命令本身,而在 host 匹配、权限范围和缓存刷新这三个地方——少一个,就白操作一遍。











