MySQL 8.4 默认禁用 mysql_native_password 插件是硬性变更,需在[mysqld]段添加 mysql_native_password=ON 并执行 ALTER USER ... IDENTIFIED WITH mysql_native_password 才能真正启用,缺一不可。

mysql_native_password插件默认禁用是硬性变更
MySQL 8.4 不再加载 mysql_native_password 插件,这不是配置遗漏或权限问题,而是服务端启动时直接跳过该插件注册。所有依赖它的客户端(如老版 Navicat、PyMySQL、Node.js 的 mysql 库、PHP 5.x mysqli)会立刻报错:ERROR 1524 (HY000): Plugin 'mysql_native_password' is not loaded 或 ER_NOT_SUPPORTED_AUTH_MODE。这个行为在 MySQL 9.0 中会进一步升级为彻底删除插件,所以 8.4 是最后的兼容窗口期。
两种启用方式效果完全不同
必须区分「全局启用插件」和「单用户切换认证方式」:
-
在
[mysqld]配置段加mysql_native_password=ON:仅允许服务端接受该插件的连接请求,但不改变现有用户的认证方式;旧用户仍用caching_sha2_password,连不上就是连不上 -
执行
ALTER USER 'user'@'host' IDENTIFIED WITH mysql_native_password BY 'pwd':强制重写该用户记录的plugin字段,后续连接才真正走该协议;必须配FLUSH PRIVILEGES生效
常见错误是只改配置不改用户,或只改用户不重启 mysqld(其实改用户不用重启,但很多人误以为要)。
使用tbot机器ID身份文件配合tsh CLI,通过Teleport访问控制SSH登录托管主机或执行远程命令。
客户端连接串必须同步适配
即使服务端启用了插件、用户也切到了 mysql_native_password,旧客户端仍可能卡在握手阶段。关键参数缺一不可:
- Java JDBC:
?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC—— 少allowPublicKeyRetrieval=true会报Public Key Retrieval is not allowed - Node.js
mysql库:必须升级到支持 8.0+ 协议的版本(如mysql2),原生mysql库已停止维护,不支持caching_sha2_password,也不推荐硬切回mysql_native_password - Python PyMySQL:需显式指定
auth_plugin='mysql_native_password'参数,否则默认尝试caching_sha2_password
别忽略系统表损坏引发的连锁失败
从 5.7 直升 8.4 或升级过程异常,常导致 mysql.user 表结构错乱(比如列数应为 51 实际只有 42)、存储引擎仍是 MyISAM、或内部用户(如 mysql.infoschema)缺失。此时即使你执行了 ALTER USER,也会先报 ERROR 1805 或 ERROR 1449,根本进不去 SQL 执行环节。这类问题无法靠参数或 SQL 修复,必须用 --initialize-insecure 重建系统库,或从干净的 8.0.45 升级中转。


















