Docker MySQL 报 2059 错误:认证插件 ‘caching_sha2_password‘ 无法加载

432 篇文章 ¥59.90 ¥99.00
当使用Docker部署MySQL 8.0时,可能会遇到认证插件 'caching_sha2_password' 无法加载的错误。该错误由于新版本MySQL默认认证插件与旧客户端不兼容引起。解决方案包括修改MySQL配置文件,将默认认证插件改为mysql_native_password,或升级客户端程序以支持新插件。文章提供相关示例代码和操作步骤。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Docker MySQL 报 2059 错误:认证插件 ‘caching_sha2_password’ 无法加载

在使用 Docker 部署 MySQL 数据库时,有时候会遇到报错信息:Authentication plugin ‘caching_sha2_password’ cannot be loaded。这是由于默认的 MySQL 认证插件机制发生了变化所致。本文将介绍如何解决这个问题,并提供相应的源代码示例。

问题描述

在通过 Docker 镜像部署 MySQL 数据库时,你可能会遇到以下错误信息:

Authentication plugin 'caching_sha2_password' cannot be loaded

这是因为从 MySQL 8.0 版本开始,默认的认证插件从原来的 mysql_native_password 更改为 caching_sha2_password。而某些老版本的客户端程序(例如旧版本的 MySQL Connector/J 或 PHP PDO 驱动)可能不支持该新的认证插件,导致连接数据库时报错。

解决方案

为了解决这个问题,有两种常用的方法可以尝试。

方法一:修改 MySQL 配置文件

可以通过修改 MySQL 配置文件,将默认的认证插件修改为 mysql_native_password,以兼容旧版本的客户端程序。

首先,停止 MySQL 容器的运行:


                
<think>我们面对的问题是:在Docker中运行MySQL时,使用Navicat等客户端连接出现错误2059,提示“Authentication plugin 'caching_sha2_password' cannot be loaded”。这是因为MySQL 8.0及以上版本默认使用`caching_sha2_password`认证插件,而一些较旧的客户端(如某些版本的Navicat)可能不支持该插件。 解决方案有两种思路: 1. 修改MySQL用户的认证插件为`mysql_native_password`(旧版兼容模式) 2. 升级客户端以支持新的认证插件 由于在Docker环境中,我们通常需要快速解决问题,因此采用第一种方法较为常见。 具体步骤: 步骤1:启动MySQL容器时,通过环境变量设置默认认证插件(推荐方法) 在运行容器时,可以设置`default_authentication_plugin`为`mysql_native_password`,这样创建的用户默认使用旧插件。 示例命令: ```bash docker run -d --name mysql-container \ -e MYSQL_ROOT_PASSWORD=yourpassword \ -e MYSQL_DATABASE=yourdb \ -e MYSQL_USER=user \ -e MYSQL_PASSWORD=password \ -e MYSQL_ROOT_HOST=% \ -p 3306:3306 \ mysql:8.0 \ --default-authentication-plugin=mysql_native_password ``` 步骤2:如果容器已经创建,则需要进入容器内部修改已有用户的认证插件 假设容器已经运行,但没有设置默认认证插件,我们可以通过以下步骤修改: 1. 进入容器: ```bash docker exec -it mysql-container bash ``` 2. 使用root用户登录MySQL: ```bash mysql -u root -p ``` 3. 执行SQL修改root用户的认证插件(注意:将'yourpassword'替换为你的密码): ```sql ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword'; FLUSH PRIVILEGES; ``` 如果你创建了其他用户,也需要修改,例如: ```sql ALTER USER 'youruser'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword'; FLUSH PRIVILEGES; ``` 4. 退出MySQL并退出容器。 步骤3:重启容器(如果修改了正在运行的容器,重启使配置生效?注意:修改用户认证方式后立即生效,无需重启容器。但需要确保客户端重新连接。) 注意:在Docker中,如果容器停止后再次启动,之前对容器的修改(除了数据卷)会丢失。因此,如果容器已经存在且需要修改认证方式,建议使用第一种方法重新创建容器并设置环境变量,或者将修改步骤写入初始化脚本。 为了避免每次手动修改,我们可以通过初始化脚本在容器首次启动时执行修改。具体方法是将一个SQL脚本挂载到`/docker-entrypoint-initdb.d/`目录下。例如: 1. 创建一个名为`init.sql`的文件,内容如下: ```sql ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword'; ``` 注意:这里的密码需要和启动容器时设置的密码一致(通过环境变量`MYSQL_ROOT_PASSWORD`设置)。如果使用脚本设置密码,则要注意脚本中的密码必须与环境变量一致。 2. 启动容器时挂载这个脚本: ```bash docker run -d --name mysql-container \ -e MYSQL_ROOT_PASSWORD=yourpassword \ -v ./init.sql:/docker-entrypoint-initdb.d/init.sql \ -p 3306:3306 \ mysql:8.0 ``` 这样,在容器初始化时就会执行这个脚本,修改root用户的认证插件。 但是,请注意:官方MySQL镜像在初始化时(第一次启动)会执行`/docker-entrypoint-initdb.d/`下的脚本,但是后续启动不会执行。因此,这种方法只适用于第一次初始化。 另外,官方镜像也支持通过命令行参数设置认证插件,如上面步骤1所示,在启动命令的最后加上`--default-authentication-plugin=mysql_native_password`。这是最推荐的方法,因为它直接修改了默认的认证插件,以后创建的用户也会使用这个插件。 总结:推荐在第一次运行容器时,通过命令行参数设置认证插件为`mysql_native_password`,这样可以避免后续连接问题。 如果问题仍未解决,请检查: 1. 是否修改了正确的用户(root@% 还是 root@localhost?) 2. 是否刷新了权限(FLUSH PRIVILEGES) 3. 客户端是否使用新密码重新连接 参考引用[4]和[5]中提供了修改用户认证插件的SQL命令,我们可以采用。 注意:修改用户认证插件后,需要确保密码正确,并且客户端使用正确的密码重新连接。 下面我们以步骤的形式总结解决方案: 解决方案一:启动容器时设置默认认证插件(推荐) ```bash docker run -d --name some-mysql \ -e MYSQL_ROOT_PASSWORD=my-secret-pw \ -p 3306:3306 \ mysql:8.0 --default-authentication-plugin=mysql_native_password ``` 解决方案二:进入容器内部修改已有用户 1. 进入容器:`docker exec -it some-mysql bash` 2. 登录MySQL:`mysql -u root -p` 3. 执行: ```sql ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'my-secret-pw'; FLUSH PRIVILEGES; ``` 解决方案三:通过初始化脚本(适用于第一次启动) 创建init.sql文件(内容如上),然后启动容器时挂载。 最后,如果用户希望保留`caching_sha2_password`插件,那么需要升级客户端(如Navicat)到支持该插件的版本。但考虑到兼容性,修改服务器端插件更为直接。 相关问题: 1. DockerMySQL容器如何持久化数据? 2. 如何修改MySQL用户的密码? 3. 如何查看MySQL用户的认证插件? 4. 如何升级Navicat以支持caching_sha2_password插件?</think>### 解决 Docker MySQL 错误 2059: 认证插件 'caching_sha2_password' 无法加载 #### 问题原因分析 根据引用内容[2][4][5],该错误是由于: 1. **认证插件不兼容**:MySQL 8.0+ 默认使用 `caching_sha2_password` 认证插件 2. **客户端不支持**:Navicat 等旧版客户端无法加载认证插件 3. **Docker 配置缺失**:启动容器时未正确设置认证插件参数 --- ### 完整解决方案(Docker 环境) #### 方法一:启动容器时修改认证插件(推荐) ```bash docker run -d --name mysql8 \ -e MYSQL_ROOT_PASSWORD=yourpassword \ -p 3306:3306 \ mysql:8.0 \ --default-authentication-plugin=mysql_native_password # 关键参数[^5] ``` #### 方法二:进入容器修改认证插件 1. **进入运行中的容器**: ```bash docker exec -it mysql-container bash ``` 2. **登录 MySQL**: ```bash mysql -u root -p ``` 3. **执行修改命令**: ```sql -- 修改 root 用户认证插件 ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY 'yourpassword'; [^4] -- 刷新权限 FLUSH PRIVILEGES; ``` #### 方法三:通过初始化脚本修改 1. 创建 `init.sql` 文件: ```sql ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '${MYSQL_ROOT_PASSWORD}'; ``` 2. 启动容器时挂载脚本: ```bash docker run -d --name mysql8 \ -v $(pwd)/init.sql:/docker-entrypoint-initdb.d/init.sql \ -e MYSQL_ROOT_PASSWORD=yourpassword \ -p 3306:3306 \ mysql:8.0 ``` --- ### 关键配置说明 | 配置项 | 说明 | 推荐值 | |--------|------|--------| | `--default-authentication-plugin` | 默认认证插件 | `mysql_native_password` | | `MYSQL_ROOT_PASSWORD` | root密码 | 至少12位强密码 | | `MYSQL_USER` / `MYSQL_PASSWORD` | 应用账户 | 避免使用root账户 | --- ### 验证步骤 1. **检查用户认证插件**: ```sql SELECT user, plugin FROM mysql.user; ``` ``` +------------------+-----------------------+ | user | plugin | +------------------+-----------------------+ | root | mysql_native_password | ✔️ 应显示此结果 +------------------+-----------------------+ ``` 2. **测试远程连接**: ```bash mysql -h 127.0.0.1 -u root -p --protocol=tcp ``` 3. **查看容器日志**: ```bash docker logs mysql-container | grep -i 'authentication' ``` --- ### 永久解决方案 在 `docker-compose.yml` 中添加配置: ```yaml services: mysql: image: mysql:8.0 command: - --default-authentication-plugin=mysql_native_password # 关键配置[^5] environment: MYSQL_ROOT_PASSWORD: yourpassword ports: - "3306:3306" ``` --- ### 为何选择 `mysql_native_password`? 1. **兼容性**:支持所有 MySQL 客户端(包括旧版 Navicat)[^2] 2. **安全性**:仍满足多数场景的安全需求 3. **稳定性**:经过长期生产环境验证[^4] > ⚠️ 注意:如果安全要求极高,建议升级客户端支持 `caching_sha2_password` 而非降级插件 --- ### 常见问题排查 1. **修改后仍连接失败**: ```sql /* 检查用户主机权限 */ UPDATE mysql.user SET host='%' WHERE user='root'; FLUSH PRIVILEGES; ``` 2. **密码策略冲突**: ```sql ALTER USER 'root'@'%' IDENTIFIED BY 'yourpassword' PASSWORD EXPIRE NEVER; ``` 3. **插件未生效**: ```bash # 重启MySQL服务 docker restart mysql-container ``` --- ###
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值