1. 背景说明

MySQL 8.0 版本引入了 caching_sha2_password 作为默认身份验证插件,以提供更高的安全性。但在实际生产环境中,许多旧版客户端(如旧版 Navicat、PHP 7.x 以前的驱动、Java 旧版 Connector 等)尚未支持该插件,导致连接失败。

特别注意
MySQL 8.4 LTS 版本开始,官方策略发生了重大变更:

  1. mysql_native_password 插件默认不再加载
  2. 配置参数 default_authentication_plugin 已被移除(使用该参数会导致服务无法启动)。
  3. 引入了新的参数 authentication_policy

2. 问题现象

在 MySQL 8.4 环境下,如果沿用 MySQL 8.0 或 5.7 的旧配置,服务启动时会报错并自动退出。

典型错误日志

[ERROR] [MY-000067] [Server] unknown variable 'default_authentication_plugin=mysql_native_password'.
[ERROR] [MY-010119] [Server] Aborting

3. 适用范围

  • 数据库版本:MySQL 8.4.0 及以上版本
  • 部署方式:二进制安装、RPM/Deb 包安装、Docker 容器化部署

4. 实施步骤

4.1 修改配置文件 (my.cnf / my.ini)

找到 MySQL 的配置文件(通常位于 /etc/my.cnf 或映射到 Docker 容器内的配置路径),在 [mysqld] 配置段下进行以下修改。

移除(如果存在)

# 必须删除或注释掉此行,否则 8.4 无法启动
# default_authentication_plugin=mysql_native_password

新增

[mysqld]
# 1. 显式启用 mysql_native_password 插件(8.4 默认不加载)
mysql_native_password=ON

# 2. 设置认证策略为 native 方式
# 格式为:authentication_policy = default_auth_plugin
authentication_policy=mysql_native_password

4.2 重启数据库服务

配置修改完成后,必须重启服务生效。

  • Linux Systemd:
    systemctl restart mysqld
    
  • Docker:
    docker restart <container_name>
    

4.3 兼容现有用户(关键步骤)

注意:修改配置文件仅改变“新建用户”的默认规则。对于已经存在的用户(如 root),其认证方式通常已被初始化为 caching_sha2_password修改配置文件不会自动转换现有用户的密码格式。

若客户端连接仍报错,需执行以下 SQL 进行手动转换:

  1. 进入 MySQL 命令行

    # 本地登录或通过 Docker 进入
    docker exec -it <container_name> mysql -u root -p
    
  2. 执行账户修改命令

    -- 语法:ALTER USER '用户名'@'主机' IDENTIFIED WITH mysql_native_password BY '密码';
    
    -- 示例:修改 root 用户
    ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password';
    
    -- 刷新权限
    FLUSH PRIVILEGES;
    
  3. 验证修改结果

    SELECT user, host, plugin FROM mysql.user WHERE user = 'root';
    

    期望输出结果中 plugin 列应为 mysql_native_password

5. 常见问题排查

Q: 修改配置后 Docker 容器处于 Restarting 状态?

  • A: 检查是否忘记删除了 default_authentication_plugin 参数。MySQL 8.4 对未知参数非常敏感,遇到不认识的参数会直接停止服务。可通过 docker logs <container_name> 查看是否有 “unknown variable” 报错。

Q: 为什么新创建的用户可以连接,root 用户不行?

  • A: 如 4.3 节所述,root 用户通常在数据库初始化阶段创建,当时使用的是旧策略。必须手动运行 ALTER USER 命令修改 root 用户的插件类型。