分享一個最近在整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
,但是很多國外友人跟我們一樣,似乎在這個版本並沒有解決問題:
嘗試了5.2.4
之後的各種版本(包括最新的6.x版本),都未能解決這個問題。
後面留意到了這個留言:
原來這個問題是5.2.2
版本之後纔開始出現的,那麼順勢嘗試一下5.2.1
版本!
果然,替換這個版本後,就一切正常了!
歡迎關注我的公衆號:程序猿DD,獲得獨家整理的學習資源和日常乾貨推送。
如果您對我的專題內容感興趣,也可以關注我的博客:didispace.com