若依/Springboot引入Flyway

Spring Boot 会自动管理Flyway的启动和运行。Flyway默认在你的项目的CLASSPATH路径下的db/migration目录下(在我们的项目一般就是src/main/resources/db/migration里面)查找SQL脚本。将你的SQL脚本写完然后放入此路径下后就可以运行你的项目,Spring会自动创建Flyway的Bean来处理你的脚本。

引入步骤:

一、添加依赖

在ruoyi-admin这个module里面的pom.xml添加flyway依赖

  <dependency>
      <groupId>org.flywaydb</groupId>
      <artifactId>flyway-core</artifactId>
  </dependency>

二、配置flyway

在ruoyi-admin这个module的application.yml文件中添加如下配置

spring:
    flyway:
        enabled: true
        baseline-on-migrate: true
        clean-on-validation-error: false
        sql-migration-prefix: V
        sql-migration-suffixes: .sql
        locations: classpath:db/migration

三、新建目录、添加脚本

在src/main/resources/下新建db/migration目录,并在其中新建.sql迁移文件。

迁移文件命名格式:大写字母V + 版本数字 + 两个下划线 + 描述.sql

我这边参考Rails,使用“年月日时分”作为版本数字。务必注意,版本数字后面是两个下划线。

img

目录结构: 

 

四、其他说明

配置参数说明

flyway.baseline-description对执行迁移时基准版本的描述.
flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
flyway.enabled是否开启flywary,默认true.
flyway.encoding设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls当初始化好连接时要执行的SQL.
flyway.locations迁移脚本的位置,默认db/migration.
flyway.out-of-order是否允许无序的迁移,默认false.
flyway.password目标数据库的密码.
flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
flyway.placeholder-replacementplaceholders是否要被替换,默认true.
flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
flyway.placeholders.[placeholder name]设置placeholder的value
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
flyway.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true.

五、常见问题

1、Flyway 执行报错: ‘user_variables_by_thread’ 表没有SELECT权限的问题解决

错误日志:

java.sql.SQLSyntaxErrorException: SELECT command denied to user 'dev'@'192.168.213.134' for table 'user_variables_by_thread'
	at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)
	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.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3188)
	at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:465)
	at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3185)
	at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeQuery(PreparedStatementProxyImpl.java:181)
	at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:228)
	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)

解决办法:

给这个数据库用户授权。

GRANT SELECT ON  `performance_schema`.user_variables_by_thread TO 'xx'@'localhost';

2、Flyway 执行报错:Migration checksum mismatch for migration version xxx

已经执行过的脚本被改动,导致校验失败。

解决办法:

还原该迁移脚本。

或者将更改后的迁移文件对应的checksum,手动覆盖到每一个环境的flyway_schema_history版本记录中。

3、版本兼容关系

六、人工干预

Flyway在使用过程可能出现一些必须人工干预的场景,比如已经执行过的脚本被修改、已经执行过的脚本被删除。


5.1、修改执行过的脚本
如果因为某些原因必须修改已经执行过的脚本,不修改不行,记住修改后脚本的checksum,手动覆盖到每一个环境的flyway_schema_history版本记录中。

5.2、删除执行过的脚本
如果因为某些原因必须删除已经执行过的脚本,建议在所有环境同步更新后,再删除sql脚本文件,并对应删除flyway_schema_history里的版本记录。

强烈建议:尽量避免上述两个操作。

参考:SpringBoot引入Flyway,及Flyway简单了解_魔笛Love的博客-CSDN博客_springboot 引入flyway

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值