
你是不是也遇到过这种情况服务器上 MySQL 吭哧吭哧升级到 8.0本地拿着用了好几年的 Navicat 11 或者 12 连上去结果直接弹一个红叉报错信息写着Authentication plugin caching_sha2_password cannot be loaded。数据库没挂服务也正常问题就出在新老版本之间的认证方式上。这个报错我当年第一次碰到时也愣了半天明明密码没输错网络也通怎么就连接不上了。后来把 MySQL 8.0 的认证机制、Navicat 各版本对协议的支持情况整个捋了一遍才算彻底搞明白。这篇教程就把我从 Navicat 11/12 平滑升级到 15、成功解决 MySQL 8.0 认证问题的完整过程写出来包括底层原理、具体步骤、常见坑点以及如果不方便升级客户端时怎么从 MySQL 端做兼容处理照着做基本不会再有连接困扰。1. 问题根因MySQL 8.0 为什么让你连不上1.1 caching_sha2_password 是什么MySQL 8.0 发布时官方把默认认证插件从老一辈的mysql_native_password换成了caching_sha2_password。这玩意儿名字看着绕口其实拆开就三部分caching缓存、sha2SHA-256 哈希算法、password密码。一句话总结新的密码认证方式比老方案更抗暴力破解和中间人攻击。老的mysql_native_password是基于 SHA1 的挑战-应答机制密码哈希值只有 40 位十六进制字符安全强度放到今天已经明显不够看而且它在传输过程中容易受到降级攻击和中间人重放攻击。caching_sha2_password则使用 SHA-256 算法哈希结果更长、计算不可逆性更强同时支持 RSA 公钥加密传输密码和 TLS 加密连接安全性上了不止一个台阶。关键点来了MySQL 服务端换了新的认证协议但老版本客户端不支持这个协议握手阶段两边就“对不上暗号”。MySQL 8.0 里创建用户时默认用的就是新插件你如果没做任何特殊配置用 Navicat 11/12 去连它根本不认识服务端发过来的认证报文自然只能报错。1.2 旧版 Navicat 有没有救Navicat 11 和 12 的发布时间都在 MySQL 8.0 正式版之前当时 MySQL 默认认证还是mysql_native_password所以这两个版本的客户端实现里压根没有caching_sha2_password的处理逻辑。这属于典型的“客户端太老服务端太新”的不兼容问题。Navicat 15 以后的版本才完整支持 MySQL 8.0 的caching_sha2_password认证。所以标题里说的“从 11/12 到 15”本质上就是把客户端升级到能听懂新协议的版本。用个生活化的类比你家小区大门以前用机械锁你手里的钥匙一直能开。后来物业把门锁换成了指纹锁你手里那把旧钥匙当然就插不进去了——不是你钥匙有问题是锁的认证逻辑变了。想进门要么换一张能录指纹的新卡升级 Navicat要么物业在门上保留一个机械锁孔MySQL 侧改用老认证插件。2. 升级前的摸底与准备2.1 确认当前 Navicat 和 MySQL 版本动手升级之前先搞清楚现状。打开 Navicat菜单栏找“帮助 - 关于”会看到类似Navicat Premium 11.2.7这样的版本号。数据库版本不要靠印象直接在命令行或查询窗口里跑一句SELECT VERSION();拿到版本号之后对照看看Navicat 版本MySQL 8.0 兼容性备注Navicat 11不兼容 caching_sha2_password建议升级到 15Navicat 12不兼容 caching_sha2_password建议升级到 15Navicat 15兼容支持新认证协议可正常连接Navicat 16/17兼容体验更佳如果你的 MySQL 还是 5.7 或更早那旧版 Navicat 还能继续用。但既然都考虑 MySQL 8.0 了我建议别在旧版本上耗着客户端迟早要升级。2.2 升级前必须备份的数据和配置这不是吓唬你。Navicat 升级本身不动数据库数据但连接配置、查询历史、模型文件这些是本地的如果安装异常或者卸载时把配置文件清掉了恢复起来头大。我习惯在升级前做三件事第一导出连接配置。Navicat 的“文件 - 导出连接”可以把当前所有连接包括主机、端口、用户名、密码导出成.ncx文件重装后“导入连接”一键还原密码也会保留前提是你在导出时记得勾选“包含密码”。第二数据库数据备份。虽然升级 Navicat 不会动 MySQL 服务端但万一你在排查连接问题时手滑改了用户权限或者认证插件导致暂时连不上有备份心里不慌。至少把业务核心库用mysqldump导一份mysqldump -uroot -p --single-transaction --routines --events your_database your_database_backup.sql第三记录当前 MySQL 用户和认证插件分布。执行下面这条 SQL把输出存到本地文本SELECT user, host, plugin FROM mysql.user;这一步是为了后面如果要做认证插件兼容时明确知道哪些账号是默认的caching_sha2_password哪些是老插件。2.3 检查操作系统与本地环境Navicat 15 支持 Windows 7 及以上、macOS 10.10 及以上一般办公电脑都没压力。但我提醒两点一是 Windows 系统如果缺少 VC 运行库安装新版 Navicat 后可能启动报错。遇到这种情况去装一下 Microsoft Visual C Redistributable 最新版就行。二是如果用的是绿色版、便携版升级时容易因为缺少注册表项或服务组件导致功能异常。我建议用官方安装包做覆盖安装或全新安装别图省事用绿色版。提示官网下载安装包的时候留意版本Navicat 15 之后只提供 64 位安装包。如果你的 Windows 还是 32 位那就得先解决操作系统的问题了。3. Navicat 平滑升级实操全流程3.1 获取新版安装包的正确姿势先说一个原则请务必从官方渠道获取安装包支持正版。Navicat 是商业软件但官方提供 14 天全功能试用覆盖所有数据库类型和全部功能评估完全够用。如果你只是日常开发、测试还可以考虑社区版或者开源工具作为替代后面我会专门说。去官网下载页面找到 Navicat Premium 15 或更高版本根据操作系统选择对应的安装包。下载好之后先校验一下文件大小和数字签名避免下载到被篡改的文件。3.2 保留旧版配置的安装方法Navicat 官方安装包默认支持覆盖安装也就是说你在 11/12 里的连接配置、查询历史、模型、报表等会保留下来。不过为了保险我建议这样操作先关闭正在运行的 Navicat包括系统托盘里的进程确保没有残留进程占用文件。然后直接运行新版安装包选择安装目录。如果你之前是自定义安装路径那这里务必选同一路径这样配置文件能直接沿用。如果路径不一致连接配置可能找不到。安装完成后先不要急着打开检查一下安装目录下是否生成了config目录或者ncx文件。Navicat 的配置通常存在用户目录下的%APPDATA%\PremiumSoft里路径对得上就不会丢。3.3 验证连接 MySQL 8.0安装完成后打开 Navicat 15找到你之前创建的那个连不上 MySQL 8.0 的连接直接双击测试。正常情况下弹窗提示连接成功然后你就能看到库表结构了。这时候可以顺手验证一下新协议是否真的生效在查询窗口执行SELECT user, host, plugin FROM mysql.user;如果当前连接用户显示的是caching_sha2_password同时 Navicat 能正常查询说明客户端已经完全兼容新认证方式。如果你在连接设置里看到“身份验证插件”这个下拉选项里面出现了caching_sha2_password或者sha256_password那就更直观了——旧版根本没有这两个选项。3.4 升级里的三个高频翻车点第一连接配置丢失。装完新版发现连接列表空空的九成是安装路径和旧版本不一致。解决方法是手动导入之前导出的.ncx文件文件 - 导入连接。第二连接报Access denied for user。这种通常是 MySQL 用户本身密码错误或者该用户只允许特定 host 登录。升级 Navicat 不会导致这个检查一下用户名、密码和 host 限制就好。第三界面变卡或者布局变了。Navicat 15 的界面相比 11/12 有不小变化工具栏和窗口布局需要重新适应。如果你特别恋旧可以在“视图 - 外观”里切换主题配色但布局回不去了这个只能习惯。4. 不想换客户端的备选方案MySQL 侧兼容调整4.1 单个用户改认证插件如果你因为某些原因暂时升不了 Navicat比如公司软件管控严格、电脑权限不够又想赶紧连上 MySQL 8.0那可以从数据库这边下手把用户的认证插件改回老的mysql_native_password。用 root 账户登录 MySQL执行ALTER USER your_useryour_host IDENTIFIED WITH mysql_native_password BY your_password;注意几个要点your_user和your_host必须和mysql.user表里的记录完全一致。常见错误是rootlocalhost写成root%实际上 MySQL 把这两个当成不同用户。执行完 NoSQL 不会自动刷新权限但 ALTER USER 这类账号操作会隐式刷新保险起见再跑一次FLUSH PRIVILEGES;也完全可以。验证是否生效SELECT user, host, plugin FROM mysql.user WHERE user your_user;看到 plugin 变成mysql_native_password再用 Navicat 11/12 连一次应该就能通了。我之前在测试环境用这套方法处理过几个老账号连接恢复正常整个过程不到一分钟。4.2 全局默认认证插件配置如果你的 MySQL 8.0 实例里还有大量旧账号或者未来还要创建一堆老协议用户可以在 MySQL 配置文件里把默认认证插件改回老插件。编辑my.cnfLinux或my.iniWindows在[mysqld]下加一行[mysqld] default_authentication_pluginmysql_native_password然后重启 MySQL 服务。注意这个配置只影响修改之后新建的用户对已存在的用户无效已有用户还得手动 ALTER。不过我要强调一点MySQL 8.0.28 和 8.0.34 之后的版本对default_authentication_plugin的处理有变化。8.0.28 虽然还在但官方开始提示弃用8.0.34 之后这个参数在某些发行版里已经失效新版本更加鼓励直接用caching_sha2_password。所以全局修改这个方案只适合临时救急不适合长期依赖。长远来看升级客户端才是正解。再补充一个安全提示老插件mysql_native_password在传输密码时的安全性确实比新插件弱如果你所在的网络环境不太可信尽量别开这个全局开关只在必要的账号上做局部修改。4.3 批量处理已有用户如果库里有多个用户需要一次性改掉可以生成批量 SQLSELECT CONCAT(ALTER USER , user, , host, IDENTIFIED WITH mysql_native_password BY some_password;) FROM mysql.user WHERE plugin caching_sha2_password;把输出复制出来一条条执行或者写到脚本里跑。注意密码这里要你自己填批量改的话通常会让这些用户暂时统一一个临时密码再让业务方去改这属于权限管理范畴就不展开了。4.4 为什么我不建议长期走 MySQL 侧兼容我见过有的团队为了迁就老客户端MySQL 8.0 用了半年还全是mysql_native_password用户等于把 8.0 最核心的安全升级整个避开完全失去了升级意义。MySQL 8.0 换成caching_sha2_password不是拍脑袋而是因为老插件在暴力破解和中间人攻击面前的防御力确实不够。所以我的建议是升级客户端到 Navicat 15 或者使用其他支持新协议的客户端工具而不是让数据库迁就旧工具。工具是拿来用的安全是底线别把方向搞反了。5. 常见问题排查与避坑实录5.1 连接报错速查表报错信息根本原因解决办法Authentication plugin caching_sha2_password cannot be loaded客户端版本老不认识新认证插件升级 Navicat 15或改 MySQL 用户认证插件Access denied for user rootlocalhost密码错误、host 不匹配或账号锁定核对用户名密码ALTER USER 重置密码检查 mysql.user 的 hostLost connection to MySQL server at reading initial communication packet网络不通、防火墙拦截或 bind-address 限制检查 3306 端口连通性确认 MySQL 监听地址Public Key Retrieval is not allowed客户端未允许获取 RSA 公钥Navicat 连接设置里启用“允许获取服务器公钥”Unknown database xxx指定的数据库名不存在或没权限确认库名和权限Table xxx doesnt exist选择的库和表不匹配检查连接设置里的默认数据库5.2 踩过的三个隐藏较深的坑第一个坑改完认证插件后其他工具连不上了。有些开发工具比如旧版 Python 的mysqlclient、部分老 PHP 驱动只支持mysql_native_password你刚把用户改回老插件那边好了但如果你把某个账号从新插件改掉原本用新协议连接的程序就开始报错。MySQL 5.7 时代程序写的caching_sha2_password本来就不多但 MySQL 8.0 之后新写的连接基本都支持改之前先统计一下这个账号还有哪些服务在用。第二个坑Navicat 的 RSA 公钥设置。新版 Navicat 连接 MySQL 8.0 时如果连接属性里的“使用 SSL”或者“服务器公钥”选项没配好会报Public Key Retrieval is not allowed。通常做法是在高级设置里勾选“允许获取服务器公钥”或者直接把 SSL 模式设为“禁用”。第三个坑MySQL 8.0 强密码策略导致 ALTER 失败。如果你执行 ALTER USER 时提示密码不符合当前策略先检查validate_password组件是否启用以及密码长度和复杂度要求。临时调整可以用SET GLOBAL validate_password.policy LOW;改完记得恢复原状。5.3 排查思路与替代工具推荐排查问题时我习惯遵循这个顺序先用命令行客户端测 MySQL 本身通不通再测 Navicat 通不通最后对比差异。mysql -u root -p -h your_host -P 3306如果命令行能正常连接而 Navicat 不行问题基本锁定在客户端配置或协议兼容上如果命令行也连不上那就是 MySQL 服务端、网络或权限的问题换个思路排查。工具方面补一句。Navicat 确实好用界面友好、功能齐全但它是商业软件如果你预算有限或者公司还没批软件采购可以先考虑 MySQL 官方自带的 MySQL Workbench、开源的 DBeaver、DataGrip 等这些工具都支持 MySQL 8.0 的caching_sha2_password认证在兼容性上和 Navicat 15 是同一水平的。别为了省事去网上找所谓破解版安全风险极高完全划不来。6. 一点个人经验做了这么多年的数据库运维MySQL 8.0 的认证升级是我见过最典型的“版本鸿沟”案例。客户端和服务端的版本差不只是功能多少的问题还牵扯到底层协议的安全演进。遇到caching_sha2_password报错时我的第一反应永远是先升级客户端而不是急着去改 MySQL 的认证配置。前者是一劳永逸的正解后者只是临时救急。最后再分享一个小技巧不管你用哪个版本的 Navicat升级之前去“帮助 - 关于”页面看一眼你的精确版本号和授权模式然后去官网确认你那个版本支持的 MySQL 认证方式。很多时候你以为自己用了新版实际上小版本落后很多一样会踩坑。版本管理这件事早晚都要做晚做不如早做。