SpringBoot集成Flyway数据库版本管理

1,290 阅读2分钟

小知识,大挑战!本文正在参与“程序员必备小知识”创作活动。

前言

最近项目里面有人推荐用Flayway做数据库版本管理,在平时项目开发中维护好脚本自动执行,无需人为执行数据库同步操作。在我们平时开发过程中开发环境配置同步还行,但是生产和测试环境还是不推荐使用, 生产账号权限管理,系统的数据库账号一般只有DML的权限,没有DDL操作的权限。

FlayWay 基本工作原理

FlayWay 通过历史记录表(flyway_schema_history)来记录版本历史。每次随项目启动时将会自动扫描在resources/db/migration下的文件并查询flyway_schema_history判断是否为新增文件。如果是新增的文件,则执行该迁移文件。如果不是,则忽略。

主要是这两步:

  1. 当flyway在一个空数据库执行时,它将直接创建一张默认名为 flyway_schema_history的数据记录为空的历史记录表,这张表将被用来跟踪或记录数据库的状态。
  2. flyway将会开始扫描文档系统或项目classpath路径下的迁移文件。

image.png

image.png

SpringBoot 集成Flyway

引入FlyWay依赖

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

FlyWay 配置

flyway:
  baseline-on-migrate: true
  locations: classpath:db/migration
  check-location: true
  enabled: true

image.png

启动工程

我们可以看到会初始化一张历史表, flyway_schema_history image.png

创建V1.1.sql, 重启应用就会多一个修改版本记录, 数据库中表字段自动增加。

Alter table smp_down_link_record  add column `create_by` int(10) NOT NULL comment '创建人';

image.png

image.png

FAQ

  1. SpringBoot 集成之后报错,报错信息
java.sql.SQLSyntaxErrorException: SELECT command denied to user 'test'@'127.0.0.1' for table 'user_variables_by_thread'\
at com.mysql.cj.jdbc.exceptions.SQLError.createSQLException(SQLError.java:120)

lALPDiCpwgGl4wvNAQXNBVA_1360_261.png 解决的办法降低版本

lALPDg7mSMnb6AvNAsrNBXA_1392_714.png

  1. FlyWay 接入的过程中其实也遇到一些,问题FlayWay其实需要的权限比较大,还有一些潜在的坑,下来也列了一下需要避免的一些坑。个人任务接入最好的方式是中间件团队将配置封装一些, 否则导致数据库被删除了,反而得不偿失。 一般只建议在开发环境做同步,测试和生产环境还是按照升级脚本执行,比较完全。 lALPDh0cQ13mPpbMuM0C3g_734_184.png

参考文档

官网 GitHUB: github.com/flyway