Spring Boot应用无法连接MySQL数据库(控制台连接正常)
解决Spring Boot连接MySQL时的Access Denied错误
嘿,这个权限拒绝的问题我之前在项目里也踩过坑,结合你的配置和报错信息,咱们从几个最常见的点来排查:
首先先明确你的配置和报错内容:
你的application.properties配置:
spring.datasource.url=jdbc:mysql://my_host:3306/my_db spring.datasource.username=my_user spring.datasource.password=my_pass spring.datasource.driver-class-name=com.mysql.jdbc.Driver
核心报错片段:
Caused by: org.springframework.jdbc.CannotGetJdbcConnectionException: Could not get JDBC Connection; nested exception is java.sql.SQLException: Access denied for u...
接下来是具体的排查和解决步骤:
第一步:验证账号密码的正确性
别光盯着配置文件看,用MySQL客户端手动连接试试:mysql -u my_user -p my_pass -h my_host -P 3306如果这一步就失败,那肯定是账号密码不对,先把这个基础问题解决。
第二步:检查MySQL用户的主机权限
MySQL的用户权限是和允许访问的主机绑定的,比如你创建的my_user可能只允许localhost(本地)访问,但你的Spring Boot应用是在另一台机器/容器里,用my_host访问就会被拒绝。
登录MySQL的管理员账号,执行以下命令查看用户的主机权限:SELECT user, host FROM mysql.user WHERE user = 'my_user';如果结果里的
host是localhost或者127.0.0.1,那需要给用户开放远程访问权限:-- 允许所有主机访问(生产环境建议指定具体IP更安全) GRANT ALL PRIVILEGES ON my_db.* TO 'my_user'@'%' IDENTIFIED BY 'my_pass'; -- 刷新权限使配置生效 FLUSH PRIVILEGES;第三步:匹配JDBC驱动和MySQL版本
你用的com.mysql.jdbc.Driver是适配MySQL 5.x的旧驱动,如果你的MySQL是8.0及以上版本,必须换成新版驱动:- 把
driver-class-name改成com.mysql.cj.jdbc.Driver - JDBC URL里必须加上时区参数,比如:
spring.datasource.url=jdbc:mysql://my_host:3306/my_db?serverTimezone=UTC&useSSL=false
(
useSSL=false是避免SSL连接的警告,生产环境可根据实际需求调整)- 把
第四步:确认数据库服务和端口可达性
检查my_host的3306端口是否开放,比如用telnet测试:telnet my_host 3306如果连接失败,可能是数据库服务没启动,或者服务器防火墙挡住了3306端口,先把网络连通性搞定。
按照这个顺序排查,基本能解决绝大多数Access Denied的问题。
内容的提问来源于stack exchange,提问作者ccc




