Heroku部署Spring MVC应用遇SELECT权限拒绝问题求助
解决Heroku ClearDB MySQL的SELECT权限拒绝问题
我一看你的错误日志和配置代码,马上发现问题出在数据源URL的硬编码上了,这直接导致数据库用户权限不匹配。
问题根源
你的日志明确显示:SELECT command denied to user 'bd427bc263a111'@'ip-10-84-26-33.eu-west-1.compute.internal' for table 'users'。
你虽然从CLEARDB_DATABASE_URL环境变量里获取了用户名和密码,但JDBC URL是硬写死的:
String dbUrl = "jdbc:mysql://eu-cdbr-west- 01.cleardb.com:3306/heroku_eb3825f7cae7006?reconnect=true";
ClearDB为每个Heroku应用分配的数据库用户仅对该应用专属的数据库有完整权限,硬编码的URL可能指向了和环境变量不匹配的数据库,自然会触发权限拒绝。
修复方案
修改dataSource()方法,直接从CLEARDB_DATABASE_URL解析出完整的JDBC连接信息,完全抛弃硬编码:
@Bean public DataSource dataSource() throws URISyntaxException { URI dbUri = new URI(System.getenv("CLEARDB_DATABASE_URL")); String username = dbUri.getUserInfo().split(":")[0]; String password = dbUri.getUserInfo().split(":")[1]; // 从环境变量的URI动态生成正确的JDBC URL String dbUrl = String.format("jdbc:mysql://%s:%s/%s?reconnect=true", dbUri.getHost(), dbUri.getPort() == -1 ? 3306 : dbUri.getPort(), // 处理MySQL默认端口 dbUri.getPath().substring(1) // 去掉路径开头的斜杠,得到数据库名 ); DriverManagerDataSource dataSource = new DriverManagerDataSource(); dataSource.setUrl(dbUrl); dataSource.setUsername(username); dataSource.setPassword(password); return dataSource; }
额外验证步骤
如果修改后仍有问题,可以做这些检查:
- 重新部署应用确保配置生效:
git commit -m "Fix ClearDB data source config" && git push heroku main - 通过Heroku CLI确认环境变量:
heroku config:get CLEARDB_DATABASE_URL,对比解析后的URL和变量内容是否一致 - 检查Hibernate的表名配置,确保它访问的是你实际创建的
users表(比如有没有schema指定错误、大小写不匹配的问题)
内容的提问来源于stack exchange,提问作者sagar limbu
相关产品推荐
相关产品推荐

