Vertx应用连接MySQL报Access denied for user 'user1'@'localhost'求助
问题原因分析与解决方法
你遇到的是Vertx MySQL客户端认证失败的问题,相同账号密码可通过MySQL Workbench连接,通常由以下几个原因导致:
- MySQL认证插件不兼容
MySQL 8.0及以上版本默认使用caching_sha2_password作为用户认证插件,低版本的Vertx MySQL客户端不支持该认证方式,而MySQL Workbench原生兼容该插件,所以可以正常连接。
解决方法:- 升级Vertx MySQL客户端到最新稳定版
- 手动修改用户认证插件为旧版兼容模式,执行以下SQL后重启应用即可:
ALTER USER 'user1'@'localhost' IDENTIFIED WITH mysql_native_password BY 'pass123'; FLUSH PRIVILEGES; - localhost连接方式差异
Vertx MySQL客户端配置host=localhost时,默认走TCP/IP协议连接127.0.0.1,而MySQL中user1@localhost的授权默认仅适用于本地socket连接,TCP连接对应的授权账号是user1@127.0.0.1,未单独授权的情况下就会报错。MySQL Workbench连接localhost时默认优先使用本地socket协议,所以可以正常连接。
解决方法:- 将代码中的
setHost("localhost")改为setHost("127.0.0.1") - 给
user1@127.0.0.1单独授予bookstore库的访问权限 - 本地部署场景下可添加配置
.setUseSocket(true)指定使用本地socket连接
- 将代码中的
- SSL配置不匹配
若你的MySQL实例强制要求SSL连接,Vertx客户端默认未开启SSL配置时会触发认证失败,MySQL Workbench默认会自动适配SSL配置所以可正常连接。
解决方法:在MySQLConnectOptions中添加SSL相关配置,不需要SSL的场景可设置.setSslMode(SslMode.DISABLED),需要SSL的场景设置为SslMode.REQUIRED即可。 - 密码特殊字符转义问题
若你的实际密码包含&、%、!等Java字符串需要转义的特殊字符,代码中硬编码未转义会导致实际发送的密码和真实密码不一致,MySQL Workbench输入密码时会自动处理转义所以不会有问题。可以打印connectOptions.getPassword()校验实际发送的密码是否正确。
内容的提问来源于stack exchange,提问作者Sudhanshu Goyal
相关产品推荐
相关产品推荐

