1. 背景说明
MySQL 8.0 版本引入了 caching_sha2_password 作为默认身份验证插件,以提供更高的安全性。但在实际生产环境中,许多旧版客户端(如旧版 Navicat、PHP 7.x 以前的驱动、Java 旧版 Connector 等)尚未支持该插件,导致连接失败。
特别注意:
从 MySQL 8.4 LTS 版本开始,官方策略发生了重大变更:
mysql_native_password插件默认不再加载。- 配置参数
default_authentication_plugin已被移除(使用该参数会导致服务无法启动)。 - 引入了新的参数
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 进行手动转换:
-
进入 MySQL 命令行:
# 本地登录或通过 Docker 进入 docker exec -it <container_name> mysql -u root -p -
执行账户修改命令:
-- 语法:ALTER USER '用户名'@'主机' IDENTIFIED WITH mysql_native_password BY '密码'; -- 示例:修改 root 用户 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'your_password'; -- 刷新权限 FLUSH PRIVILEGES; -
验证修改结果:
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 用户的插件类型。
评论