分享一个最近在整Flyway时候碰到的一个问题,以及对应的一些解决方案。如果您还不知道Flyway,建议可以先看一下这篇文章 Spring Boot中使用Flyway来管理数据库版本
问题出现所描述的工程所用版本信息如下:
具体错误:在Spring Boot中整和Flyway之后,本地执行ok,但在部署环境出现了这样的错误:
java.sql.SQLSyntaxErrorException: SELECT command denied to user 'test'@'10.10.8.101' for table 'user_variables_by_thread' at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120) at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:97) at com.mysql.cj.jdbc.exceptions.SQLExceptionsMapping.translateException(SQLExceptionsMapping.java:122) at com.mysql.cj.jdbc.ClientPreparedStatement.executeInternal(ClientPreparedStatement.java:953) at com.mysql.cj.jdbc.ClientPreparedStatement.executeQuery(ClientPreparedStatement.java:1003) at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:227) at org.flywaydb.core.internal.jdbc.JdbcTemplate.queryForStringList(JdbcTemplate.java:119) at org.flywaydb.core.internal.database.mysql.MySQLConnection.hasUserVariableResetCapability(MySQLConnection.java:84) at org.flywaydb.core.internal.database.mysql.MySQLConnection.<init>(MySQLConnection.java:54) at org.flywaydb.core.internal.database.mysql.MySQLDatabase.doGetConnection(MySQLDatabase.java:162) at org.flywaydb.core.internal.database.mysql.MySQLDatabase.doGetConnection(MySQLDatabase.java:40) at org.flywaydb.core.internal.database.base.Database.getConnection(Database.java:122) at org.flywaydb.core.internal.database.base.Database.getMainConnection(Database.java:315) at org.flywaydb.core.Flyway.prepareSchemas(Flyway.java:550) at org.flywaydb.core.Flyway.execute(Flyway.java:487) at org.flywaydb.core.Flyway.migrate(Flyway.java:149) at com.yonghui.beanstalk.config.flyway.FlywayConfig.migrate(FlywayConfig.java:25) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at
从报错信息看,就是 test
用户对 user_variables_by_thread
表没有 select
权限导致。
所以,最直接的解决方法就是给对应用户设置权限即可。
如果你对这个环境的MySQL没有管理权限的时候怎么办呢?
针对这个问题,其实在Github上有很多Issue讨论,比如: https://github.com/flyway/flyway/issues/2215 。
可以看到,这个问题官方有对其进行修复,并且修复版本就是 5.2.4
,但是很多国外友人跟我们一样,似乎在这个版本并没有解决问题:
尝试了 5.2.4
之后的各种版本(包括最新的6.x版本),都未能解决这个问题。
后面留意到了这个留言:
原来这个问题是 5.2.2
版本之后才开始出现的,那么顺势尝试一下 5.2.1
版本!
果然,替换这个版本后,就一切正常了!