是什么?

Flyway 是一款开源的数据库版本管理工具。 可以实现管理并跟踪数据库变更,支持数据库版本自动升级,而且不需要复杂的配置,能够帮助团队更加方便、合理的管理数据库变更。

为什么?

研发过程中经常涉及到数据库变更,对表结构的修复及对数据的修改,为了保证各环境都能正确的进行变更,我们可能需要维护一个数据库升级文档来保存这些记录,有需要升级的环境按文档进行升级。 这样手工维护有几个缺点:

  1. 无法保证每个环境都按要求执行
  2. 遇到问题不一定有相对的回滚语句
  3. 无法自动化

怎么做?

为了解决这些问题,我们进行了一些调研,主要调研对象是 Liquibase 和 Flyway,我们希望通过数据库版本管理工具实现以下几个目标:

  1. 数据库升级
  2. 数据库回滚
  3. 版本标记

两者差异如下:

Flyway Liquibase
开发商 Red Gate Liquibase
发布时间 2010年 2006年
版本 开源/商业 开源/商业
易用性 简单易用、学习成本低、功能相对较少 功能齐全、概念多,学习成本高
跨平台 手动实现 支持
diff模式 商业版支持 支持
回滚 rollback 商业版支持 支持

Flyway 工作原理

Flyway在第一次执行时,会创建一个默认名为 flyway_schema_history 的历史记录表,这张表会用来跟踪或记录数据库的状态,然后每次项目启动时都会自动扫描在 resources/db/migration 下的文件的版本号并且通过查询flyway_schema_history 来判断是否有新增文件,从而判断是否进行迁移。 默认的查找 migration 的路径为 classpath:db/migration ,对应 SQL 文件可放置在src/main/resources/db/migration 下,Java 类可放置在 src/main/java/db/migration 下。

Flyway 的使用

添加依赖

目前支持mysql5.7的社区版为7.15.0,支持mysql8.0的版本是8.2.0,8.2.1移除了mysql支持:

<!-- 8.2.1版本开始,将各数据库版本支持拆分开来了 --><dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-mysql</artifactId>
    <version>10.10.0</version>
</dependency>
<!-- 8.2.0版本及其老版本引入如下包 --><dependency>
    <groupId>org.flywaydb</groupId>
    <artifactId>flyway-core</artifactId>
    <version>8.2.0</version>
</dependency>