必须指定完整 host(如 'root'@'%' 或 'root'@'127.0.0.1')并添加 PASSWORD EXPIRE NEVER,再执行 FLUSH PRIVILEGES,否则因 host 不匹配或密码过期仍会连接失败。
直接改 mysql_native_password 就能连上,不用升级 navicat 或重装驱动 —— 但必须确认用户 host 和密码都对,且执行了 flush privileges。
为什么 ALTER USER ... IDENTIFIED WITH mysql_native_password 必须带完整 host
MySQL 把 'root'@'localhost' 和 'root'@'%' 当作两个完全不同的用户。Navicat 连接时用的是哪个 host,就得改对应那条记录。常见错误是只改了 localhost,但 Navicat 实际走的是 %(比如配置连接时填了 IP 或域名),结果还是报 2059。
- 先查清楚你用的到底是哪个:
SELECT user, host, plugin FROM mysql.user; - 如果 Navicat 填的是
127.0.0.1,要改'root'@'127.0.0.1',不是localhost -
host是%表示任意主机,但权限更宽,生产环境慎用
ALTER USER 语句里不能省略 PASSWORD EXPIRE NEVER
MySQL 8.0 默认启用了密码过期策略。如果只执行 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';,下次连接可能触发“密码已过期”提示,导致 Navicat 卡在认证阶段,错误码可能变成 1862 而非 2059。
- 稳妥写法是两步合并:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456' PASSWORD EXPIRE NEVER; - 或者分两行:
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456';+ALTER USER 'root'@'%' PASSWORD EXPIRE NEVER; - 不加
PASSWORD EXPIRE NEVER的话,SHOW CREATE USER 'root'@'%'能看到PASSWORD EXPIRE DEFAULT,这就是隐患点
FLUSH PRIVILEGES 不是可选项,是必须步骤
MySQL 8.0 的权限系统不会自动重载内存中的用户表缓存。即使 ALTER USER 执行成功,不执行 FLUSH PRIVILEGES,旧的 caching_sha2_password 插件信息仍保留在服务端握手流程里,Navicat 第一次握手就会失败。
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 执行完
ALTER USER后,立刻跟一句:FLUSH PRIVILEGES; - 验证是否生效:
SELECT user, host, plugin FROM mysql.user WHERE user = 'root';—— 看plugin列是否已变成mysql_native_password - 如果没变,说明前面某步出错或没生效,别急着开 Navicat
最容易被忽略的是 host 匹配和密码过期策略 —— 改了插件却连不上,八成卡在这两点。连上之后建议尽快在 Navicat 里测试建库、查表、改数据,确认不是只过了认证但权限不足。










