Flyway是一款开源的数据库版本管理工具,包含社区版、专业版和企业版,可以独立于应用实现管理并跟踪数据库变更。支持多种配置,包括Java APICommand linemavengradle

一、入门

本文使用社区版 Flywaymaven 插件来迁移数据库,数据库为 MySQL

1、新建 maven 项目

resources 目录下建立 db/migration 目录。

flyway_dir.png

2、修改 pom.xml

添加 Flyway 插件,并配置 mysql 的连接字符串用户名密码

<build>
  <plugins>
    <plugin>
      <groupId>org.flywaydb</groupId>
      <artifactId>flyway-maven-plugin</artifactId>
      <version>5.0.5</version>
      <configuration>
        <url>jdbc:mysql://hostname:port#/db_name</url>
        <user>username</user>
        <password>password</password>
      </configuration>
    </plugin>
  </plugins>
</build>

3、迁移数据库

(1)建立一个数据库用于测试。

(2)在 db/migration 目录下建立 SQL 脚本 V1__Create_person_table.sql

create table PERSON (
    ID int not null,
    NAME varchar(100) not null
);

(3)运行 maven 命令:mvn flyway:migrate,数据库中会建立表 flyway_schema_history 跟踪数据库版本,插入第一次迁移记录,并执行 SQL 脚本。

migrate.png

4、第二次迁移

(1)在 db/migration 目录下建立 SQL 脚本 V2__Add_people.sql

insert into PERSON (ID, NAME) values (1, 'Axel');
insert into PERSON (ID, NAME) values (2, 'Mr. Foo');
insert into PERSON (ID, NAME) values (3, 'Ms. Bar');

(2)运行 maven 命令:mvn flyway:migrateflyway_schema_histry 会插入第二条记录,并执行 SQL 脚本:

migrate2.png

二、命令

1、Flyway 迁移

(1)带版本的迁移:迁移脚本带版本号,每一次带版本的迁移都有版本号描述校验和,并且只能执行一次。典型用于数据表结构变更等。

(2)可重复的迁移:和带版本的迁移不同,它没有版本号,只有描述校验和,而且可以多次执行。典型用于插入数据等操作。

(3)脚本命名规则:

migration_naming.png

2、Flyway 命令

  • migrate:把数据库迁移到最新版本,迁移是根据 db/migration 目录下的脚本顺序执行。
  • clean:清空数据库中的数据,不能在生产环境使用此命令
  • info:打印出版本迁移信息。
  • validate:验证要执行的迁移脚本。
  • baseline:为已经存在的数据库建立基线,迁移数据库将建立在基线的基础上。
  • repair:修复 flyway_schema_histry 表。

三、Flyway 管理已存在的数据库

  • 导出脚本:把现有数据库的结构和数据导出为 SQL 脚本,起名如 V1__Base_version.sql
  • 清理数据:这步可以跳过,如果数据不再需要可以运行清理命令:mvn flyway:clean
  • 建立基线:mvn flyway:baseline

之后对数据库的修改就可以通过 Flyway 来管理了。