由于临时需求改动,开发排期很紧张,需要迅速单独开发一个服务,于是我采用springboot来提供服务,在开发完成后和前端联调,本地调试一切正常,部署到了服务器当前端请求接口控制台报了个:
java.sql.SQLException: Access denied for user 'xxxx'@'localhost' (using password: YES)
这个报错信息很明显 意思就是说:
xxxx这个用户被拒绝访问数据库
我第一时间查看了我的配置文件: spring.datasource.name = root
确认是root并检索了我代码了都没有xxxx这个字段....
我配置的是root呀,那xxxx这个用户是哪来的?这不科学为什么?
后来发现这个xxxx是服务器的系统用户名,我顿时茅塞顿开,应该是错把系统用户当作数据库用户了,那到底是哪里出了问题?
spring.datasource.name = root 。
spring.datasource.name:
Datasource name to use if "generate-unique-name" is false,when using an embedded database,otherwise null.(如果“generate-unique-name”为false,则使用的数据源名称。默认为“testdb”.使用嵌入式数据库时,否则为 null)
由此得知,数据源 name属性是用来配置数据源或者嵌入式数据库的。而我则因为这个name,错把系统user当作数据库name,由此可以推论:如果没有配置嵌入数据库的情况下,name则会取到本机用户名。
spring.datasource.username:
妥妥的数据库登录用户名。
本地数据库免密登录:
问题是解决了,但我又萌生了另外一个问题,那为什么我本地这个配置却可以,按照现在的推断,应该在本地也会报这个错误才对?
后来又排查了一波,发现本地数据库做了免密登录,也就是跳过权限验证:skip-grant-tables
这样即使不配置用户密码依然可以成功访问数据库。
配置数据库用户密码(mysql 5.7.22):
1.首先通过在mysql.ini文件里配置跳过权限skip-grant-tables登录mysql。
2.user mysql;
3.update mysql.user set authentication_string=password('xxxxx') where user='root' and Host ='localhost';
4.重启mysql服务
5.测试免密登录失败
6.用户名密码登录成功: mysql -uroot -p
password : xxxx