7

Flyway 执行报错: 'user_variables_by_thread' 表没有SELECT权限问题

 3 years ago
source link: http://blog.didispace.com/flyway-user-variables-by-thread/
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

Flyway 执行报错: 'user_variables_by_thread' 表没有SELECT权限问题

分享一个最近在整Flyway时候碰到的一个问题,以及对应的一些解决方案。如果您还不知道Flyway,建议可以先看一下这篇文章Spring Boot中使用Flyway来管理数据库版本

问题出现所描述的工程所用版本信息如下:

  • Spring Boot:2.1.3
  • Flyway:5.2.4(非特别指定,随Spring Boot的素材版本管理)

具体错误:在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权限导致。

所以,最直接的解决方法就是给对应用户设置权限即可。

解决方法二:修改Flyway版本

如果你对这个环境的MySQL没有管理权限的时候怎么办呢?

针对这个问题,其实在Github上有很多Issue讨论,比如:https://github.com/flyway/flyway/issues/2215

可以看到,这个问题官方有对其进行修复,并且修复版本就是5.2.4,但是很多国外友人跟我们一样,似乎在这个版本并没有解决问题:

pasted-289.png

尝试了5.2.4之后的各种版本(包括最新的6.x版本),都未能解决这个问题。

后面留意到了这个留言:

pasted-290.png

原来这个问题是5.2.2版本之后才开始出现的,那么顺势尝试一下5.2.1版本!

果然,替换这个版本后,就一切正常了!


About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK