SpringBoot版本:2.0.3 SpringCloud版本:Finchley.SR2 背景:配置数据库账户密码的ymal文件放在Git上,通过ConfigServer读取配置文件。数据库密码使用druid(1.1.9)进行加密 重现步骤:服务成功启动且能正常访问的情况下,不对配置文件做任何改动,当然也不改数据库密码,然后使用POST请求 ip:port/actuator/bus-refresh ,访问接口时必现。
报错如下: 2019-06-28 05:34:31.161 payment ERROR com.alibaba.druid.pool.DruidDataSource Line:2469 - create connection SQLException, url: jdbc:mysql://xx.xxx.xx.xx:3306/xxxx?characterEncoding=utf-8, errorCode 1045, state 28000 java.sql.SQLException: Access denied for user 'root'@'xx.xx.xx.xx' (using password: YES) at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:965) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3976) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3912) at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:871) at com.mysql.jdbc.MysqlIO.proceedHandshakeWithPluggableAuthentication(MysqlIO.java:1714) at com.mysql.jdbc.MysqlIO.doHandshake(MysqlIO.java:1224) at com.mysql.jdbc.ConnectionImpl.coreConnect(ConnectionImpl.java:2190) at com.mysql.jdbc.ConnectionImpl.connectOneTryOnly(ConnectionImpl.java:2221) at com.mysql.jdbc.ConnectionImpl.createNewIO(ConnectionImpl.java:2016) at com.mysql.jdbc.ConnectionImpl.(ConnectionImpl.java:776) at com.mysql.jdbc.JDBC4Connection.(JDBC4Connection.java:47) at sun.reflect.GeneratedConstructorAccessor122.newInstance(Unknown Source) at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) at java.lang.reflect.Constructor.newInstance(Constructor.java:423) at com.mysql.jdbc.Util.handleNewInstance(Util.java:425) at com.mysql.jdbc.ConnectionImpl.getInstance(ConnectionImpl.java:386) at com.mysql.jdbc.NonRegisteringDriver.connect(NonRegisteringDriver.java:330) at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:149) at com.alibaba.druid.filter.FilterAdapter.connection_connect(FilterAdapter.java:786) at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:143) at com.alibaba.druid.filter.stat.StatFilter.connection_connect(StatFilter.java:218) at com.alibaba.druid.filter.FilterChainImpl.connection_connect(FilterChainImpl.java:143) at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1515) at com.alibaba.druid.pool.DruidAbstractDataSource.createPhysicalConnection(DruidAbstractDataSource.java:1578) at com.alibaba.druid.pool.DruidDataSource$CreateConnectionThread.run(DruidDataSource.java:2466)
原提问者GitHub用户ghost
如果在使用Spring Cloud时,刷新配置后项目报无法连接MySQL、账户或密码错误的问题,可能的原因有以下几个:
MySQL配置信息错误
最常见的情况还是 host、port、username、password 等配置写错了。
加密后的MySQL密码无法正常解密
尤其是MySQL密码使用加密存储,而Spring Cloud刷新配置后无法正确解密该密码。
数据库 privilegest不足
对于动态修改的MySQL配置,需要确保对应用户有相应的privileges。
网络问题
应用部署迁移导致原来连接MySQL的网络配置失效。
时区不同步
应用和MySQL的时区设置不一致可能也会造成连接失败。
jar包版本不兼容
MySQL驱动包与数据库版本不匹配也会报错。
开启了MySQL密码失效检查
MySQL开启了密码失效检查,密文不对就不能连接。
针对您描述的情况,密码是加密存储的,很有可能是:
加密算法更新了,刷新配置后无法再正确解密密码
MySQL禁用了加密密码,报错提示密码错误
解决的办法是:
修改加密算法,刷新配置后能正确解密原来的密码
不对密码做加密处理,直接明文存储
使用DB证书授权而非用户名密码登录MySQL
所以解决方案主要是要确保:
Spring Cloud刷新后还能使用原来的MySQL密码
加密解密算法与MySQL的要求相符
MySQL开放对应用户的连接权限
找出问题了,自己的锅,yml文件中配置了 filter: config: enabled: true 却没有配置filters: config
原回答者GitHub用户ghost
根据报错信息,访问数据库时出现了"Access denied for user 'root'@'xx.xx.xx.xx'"的错误。这是因为数据库连接的用户名和密码不正确导致的。
首先,检查配置文件中数据库相关的配置是否正确。确保账户名和密码与数据库服务器上匹配,并且格式和大小写也要一致。
如果配置文件的数据库密码是经过加密的,那么需要确认以下几点:
另外,根据重现步骤描述,你是通过POST请求 /actuator/bus-refresh
接口来刷新配置,但并没有改动配置文件。这可能意味着配置文件并没有被刷新,仍然保持原有的加密密码。此时,数据库连接仍然会使用旧的加密密码,导致认证失败。
为了排除该问题,请按照以下步骤进行操作:
/actuator/bus-refresh
接口来刷新配置。如果以上步骤仍然无法解决问题,请提供更多关于你的配置文件、数据库连接和加密密码逻辑的信息,以便进一步帮助你解决该问题。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。