You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker部署MySQL容器后Java应用连接报错caching_sha2_password求助

解决Java连接Docker MySQL时的caching_sha2_password认证问题

看起来你遇到的是MySQL 8.0+默认认证插件和JDBC驱动兼容的典型问题,虽然你尝试修改了默认插件,但可能有些环节没落实到位,我来一步步帮你排查解决:

1. 先确认目标用户的认证插件已单独修改

你修改了全局默认认证插件,但已创建的用户不会自动同步更新认证方式,需要单独针对saman用户做修改:

ALTER USER 'saman'@'%' IDENTIFIED WITH mysql_native_password BY 'password';
FLUSH PRIVILEGES;

执行完后,用这条SQL验证:

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

确保结果里saman对应的plugin列是mysql_native_password。

2. 确保MySQL容器的全局配置生效

修改全局默认插件后,必须重启MySQL容器才能让配置生效:

# 替换成你的容器名称或ID
docker restart <your-mysql-container-id>

另外要确认你是正确配置了容器内的MySQL配置文件(比如/etc/mysql/mysql.conf.d/mysqld.cnf),添加了:

[mysqld]
default_authentication_plugin=mysql_native_password

如果是通过Docker启动命令或docker-compose.yml配置的,要确保参数正确:

docker run -d -e MYSQL_DEFAULT_AUTHENTICATION_PLUGIN=mysql_native_password [其他参数] mysql:latest

3. 调整JDBC连接串的必要参数

Java应用的连接串需要补充几个参数来适配认证方式,建议修改为:

jdbc:mysql://172.17.0.2:3306/databaseName?useSSL=false&allowPublicKeyRetrieval=true&serverTimezone=UTC
  • allowPublicKeyRetrieval=true:允许客户端从服务器获取公钥,即使你改了用户认证插件,部分JDBC驱动版本仍需要这个参数来完成连接
  • useSSL=false:测试环境可关闭SSL避免额外报错(生产环境建议开启)
  • serverTimezone=UTC:解决时区不匹配导致的潜在连接异常

4. 检查MySQL JDBC驱动版本

确保项目中使用的mysql-connector-java版本是兼容的:

  • 如果是MySQL 8.0+,建议使用8.0.x版本的驱动
  • 若使用5.x版本的旧驱动,即使修改了用户认证方式,也可能因无法识别新协议而报错

关于telnet输出的说明

telnet连接后显示caching_sha2_password是MySQL服务器返回的全局默认认证插件,但只要你的saman用户已经设置为mysql_native_password,Java应用使用该用户连接时会自动匹配对应的认证方式,所以这个输出不影响实际连接,不用过度在意。

按照以上步骤操作后,应该就能解决Java应用的连接异常了。

内容的提问来源于stack exchange,提问作者Saman Salehi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:09:46