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
相关产品推荐
相关产品推荐

