Skip to content

解决Docker中MySQL启动错误:未知变量'default-authentication-plugin'

问题描述

当用户尝试使用Docker Compose启动MySQL 8.4容器时,遇到以下错误提示:

unknown variable 'default-authentication-plugin=mysql_native_password'

出现此错误的docker-compose.yml配置如下:

yaml
db:
    image: mysql:8.4
    command: ["mysqld", "--default-authentication-plugin=mysql_native_password"] # 问题命令
    ports:
        - 3306:3306
    environment:
        MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
    volumes:
        - ./my.cnf:/etc/mysql/conf.d/my.cnf # 挂载的配置文件

同时使用的my.cnf配置文件包含:

ini
[mysqld]
default-authentication-plugin=mysql_native_password # 无效配置项

问题核心:MySQL 8.4 版本中弃用了 default-authentication-plugin 参数,导致容器启动失败。虽然降级到MySQL 5.7可以解决,但这并非理想的升级方案。

解决方案及说明

原因分析

在MySQL 8.4版本中,default-authentication-plugin 参数已被移除,取而代之的是新的身份验证插件管理系统。根据官方文档,启用原生密码验证的正确参数现在是 --mysql-native-password

完整修复步骤

1. 修改docker-compose.yml中的启动命令

将弃用的参数替换为新的标准参数:

yaml
db:
    image: mysql:8.4
-   command: ["mysqld", "--default-authentication-plugin=mysql_native_password"]
+   command: ["mysqld", "--mysql-native-password=ON"] # 使用新参数

为什么有效

--mysql-native-password=ON 是MySQL 8.4官方支持启用原生密码验证的正确参数。其可选值包括:

  • ON:启用插件
  • OFF:禁用插件
  • FORCE:强制启用(加载失败则中止启动)

2. 更新my.cnf配置文件

移除无效的配置行并注释相关项:

ini
[mysqld]
- default-authentication-plugin=mysql_native_password
+ # default-authentication-plugin=mysql_native_password # 已废弃的参数

配置文件注意事项

保留 mysql_native_password=ON 在配置文件中非必须,因为该设置已通过启动参数显式启用

最终有效配置

docker-compose.yml (修正后)

yaml
db:
    image: mysql:8.4
    command: ["mysqld", "--mysql-native-password=ON"]
    restart: unless-stopped
    ports:
        - 3306:3306
    environment:
        MYSQL_RANDOM_ROOT_PASSWORD: yes
        MYSQL_AUTHENTICATION_PLUGIN: mysql_native_password
        MYSQL_DATABASE: ${MYSQL_DATABASE:-learn}
        MYSQL_USER: ${MYSQL_USER:-learn}
        MYSQL_PASSWORD: ${MYSQL_PASSWORD:-test2024}
    volumes:
        - mysql_dev:/var/lib/mysql
        - ./docker/laravel/config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf
    healthcheck:
        test: [ "CMD", 'mysqladmin', 'ping', '-h', 'localhost', '-u', '$$MYSQl_USER', '-p$$MYSQL_PASSWORD' ]
        timeout: 20s
        retries: 2

my.cnf (修正后)

ini
[mysqld]
mysql_native_password=ON
# default-authentication-plugin=mysql_native_password # 此行已废弃
general_log = 0
general_log_file = /var/lib/mysql/general.log
default_time_zone='+00:00'

技术原理说明

MySQL 8.4验证机制变更

MySQL 8.0+ 默认使用更安全的 caching_sha2_password 验证插件。如果应用程序需要兼容旧式验证协议(如部分PHP应用),必须显式启用 mysql_native_password 插件。

参数获取方法

验证MySQL支持的有效参数:

bash
# 在容器内执行
mysqld --verbose --help | grep mysql-native-password

输出结果将确认参数的有效性:

--mysql-native-password[=name] 
                      Enable or disable mysql_native_password plugin...

操作验证流程

  1. 执行 docker-compose down 停止并移除旧容器
  2. 清理数据卷:docker volume prune(首次错误配置需要)
  3. 重新启动:docker-compose up -d
  4. 检查日志:docker-compose logs db 确认无错误启动

版本兼容建议

如需确保长期兼容性,请使用特定子版本标签:

yaml
image: mysql:8.4.0 # 而非模糊的8.4

这种方式可避免次版本更新带来的意外变更

常见问题

Q: 修改后仍报错?
A: 执行完整清理流程:

bash
docker-compose down -v  # 删除关联卷
docker system prune -f   # 清理残余容器

Q: 如何确认插件已激活?
A: 进入容器后执行:

sql
SELECT plugin_name, plugin_status 
FROM information_schema.plugins 
WHERE plugin_name = 'mysql_native_password';

结果中 plugin_status 应为 ACTIVE