亚大伯斯 2025-10-12 21:20 采纳率: 98.6%
浏览 29
已采纳

连接MySQL报错:Plugin 'mysql_native_password'未加载

在使用较新版本MySQL(8.0+)时,客户端连接常出现“Plugin 'mysql_native_password'未加载”错误。该问题通常源于MySQL默认认证插件已从`mysql_native_password`更改为`caching_sha2_password`,而部分旧版客户端(如PHP 7.x、Python MySQLdb等)不支持新插件,导致连接失败。尽管服务端未禁用`mysql_native_password`,但若用户账户显式指定使用该插件,而客户端尝试协商时出现问题,也可能触发此报错。解决方案包括:升级客户端驱动、修改用户认证方式为`caching_sha2_password`并确保兼容,或临时将用户重置为`mysql_native_password`认证以恢复连接。
  • 写回答

1条回答 默认 最新

  • 大乘虚怀苦 2025-10-12 21:20
    关注

    1. 问题背景与现象描述

    在使用较新版本的 MySQL(8.0+)时,许多开发者在尝试通过客户端连接数据库时遇到如下错误:

    ERROR 2059 (HY000): Plugin 'mysql_native_password' was not loaded

    该错误通常出现在 PHP 7.x、Python 的 MySQLdb 或旧版 JDBC 驱动等环境中。尽管 MySQL 服务端并未禁用 mysql_native_password 插件,但由于认证机制的变更,客户端与服务端在身份验证插件协商过程中出现不兼容,导致连接中断。

    2. 根本原因分析:从认证插件演进说起

    • MySQL 5.7 及之前版本:默认使用 mysql_native_password 作为用户认证插件,广泛被各类客户端支持。
    • MySQL 8.0 起:默认认证插件更改为 caching_sha2_password,提供更强的安全性(基于 SHA-256 加密),但部分旧客户端尚未适配此协议。
    • 问题触发点:即使服务端仍加载了 mysql_native_password 插件,若用户账户显式指定使用该插件,而客户端因驱动限制无法正确处理插件协商流程,仍会报出“未加载”错误。

    3. 常见受影响的技术栈

    技术栈典型版本是否原生支持 caching_sha2_password
    PHP MySQLi/PDOPHP 7.4 及以下否(需额外配置或升级)
    Python MySQLdb1.x 系列
    Python PyMySQL0.9+是(推荐替代方案)
    Java Connector/J5.1.x
    Java Connector/J8.0+是(需启用 allowPublicKeyRetrieval=true)
    Node.js mysql<= 2.18.1有限支持
    .NET MySql.Data6.10.x需手动配置
    Go sql drivergithub.com/go-sql-driver/mysql@v1.7+支持
    旧版 phpMyAdmin4.9.x可能失败
    WordPress5.2 及以下 + MySQL 8.0常见兼容性问题

    4. 深度诊断流程图

    graph TD
        A[客户端连接请求] --> B{服务端认证插件?}
        B -->|caching_sha2_password| C[客户端是否支持SHA2?]
        C -->|否| D[尝试降级到mysql_native_password]
        D --> E{用户账户是否强制使用native?}
        E -->|是| F[协商失败 → 报错Plugin not loaded]
        E -->|否| G[允许切换 → 连接成功]
        C -->|是| H[正常完成SHA2握手 → 成功]
        B -->|mysql_native_password| I[直接使用native插件认证]
        I --> J[连接成功]
    

    5. 解决方案全景图

    1. 方案一:升级客户端驱动
      • PHP 用户应升级至 PHP 8.0+ 并使用最新 mysqli 或 PDO 扩展。
      • Python 推荐使用 pymysqlmysql-connector-python 替代 MySQLdb。
      • Java 应使用 Connector/J 8.0+ 并添加连接参数:?allowPublicKeyRetrieval=true&useSSL=false
    2. 方案二:修改用户认证方式为 caching_sha2_password ALTER USER 'username'@'host' IDENTIFIED WITH caching_sha2_password BY 'password';

      确保客户端支持新协议后再执行此操作。

    3. 方案三:临时重置为 mysql_native_password(应急恢复) ALTER USER 'username'@'host' IDENTIFIED WITH mysql_native_password BY 'password';

      适用于遗留系统无法立即升级的场景,但牺牲部分安全性。

    4. 方案四:全局配置回退默认插件(不推荐长期使用)my.cnf 中设置: [mysqld]
      default_authentication_plugin=mysql_native_password

      重启后新建用户将默认使用旧插件。

    5. 方案五:双插件共存策略(高级运维) 创建两个用户:一个用于现代应用(SHA2),一个用于旧系统(native),实现平滑过渡。
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 已采纳回答 10月23日
  • 创建了问题 10月12日