1、什么是Flyway
Flyway is an open-source database migration tool. It strongly favors simplicity and convention over configuration.
It is based around just 7 basic commands: Migrate, Clean, Info, Validate, Undo, Baseline and Repair.
Flyway是一款开源的数据库迁移工具。强力支持简单性和约束性而不是配置。
通俗来讲,我们的代码可以通过git或svn来进行版本管理,项目运行环境可以通过镜像或者dockerfile来创建,而Flyway就是用来进行数据库的版本管理的。
以前的工作流程:
-
开发人员将应用程序打包,并整理好数据库脚本
-
运维人员拿到部署包,先检查数据库脚本,进行备份、执行,再部署应用程序
引入Flyway:
-
开发打包
-
运维直接替换,不用管数据库的改动。脚本全交给Flyway执行
有了Flyway,所有开发人员能时刻关注DML、DDL对数据库的改变,持续集成会方便很多
相当于一个脚本管控工具,谁提交的,谁更改的,ddl还是dml语句,都可以进行追溯和管理
2、基本使用
-
创建一个基本的boot demo,并配置数据库
-
添加依赖,或也可以在新建boot demo的时候选择Flyway
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>8.2.2</version>
</dependency>
- 在resource下新建db.migration文件夹,里面主要放脚本。
- 直接运行,可以看到
启动信息:
数据库:
可以发现,company和department是db.migration文件夹里的sql脚本创建的
flyway_schema_history表是Flyway自动创建的,用来标识版本
3、深入学习
1、[How Flyway works ](How Flyway works - Flyway by Redgate • Database Migrations Made Easy.)
2、[配置文件说明](Config Files - Config Files - Flyway by Redgate • Database Migrations Made Easy.)
3、[migrations命名](Migrations - Migrations - Flyway by Redgate • Database Migrations Made Easy.)
4、常用
1、常用配置
## 设定 db source 属性
spring.datasource.url=jdbc:mysql://localhost:3306/world
spring.datasource.username=root
spring.datasource.password=toor
## 设定 flyway 属性
spring.flyway.cleanDisabled = true
# flyway 的 clean 命令会删除指定 schema 下的所有 table, 杀伤力太大了, 应该禁掉.
spring.flyway.enabled = true
# 启用或禁用 flyway
spring.flyway.locations =classpath:db/migration
# 设定 SQL 脚本的目录,多个路径使用逗号分隔, 比如取值为 classpath:db/migration,filesystem:/sql-migrations
spring.flyway.baselineOnMigrate=true
# 如果指定 schema 包含了其他表,但没有 flyway schema history 表的话, 在执行 flyway migrate 命令之前, 必须先执行 flyway baseline 命令.
# 设置 spring.flyway.baseline-on-migrate 为 true 后, flyway 将在需要 baseline 的时候, 自动执行一次 baseline.
spring.flyway.baselineVersion=1
# 指定 baseline 的版本号,缺省值为 1, 低于该版本号的 SQL 文件, migrate 的时候被忽略.
#spring.flyway.encoding=
# Encoding of SQL migrations (default: UTF-8)
spring.flyway.table=flyway_schema_history_myapp
# 设定 flyway 的 metadata 表名, 缺省为 flyway_schema_history
spring.flyway.outOfOrder=true
# 开发环境最好开启 outOfOrder, 生产环境关闭 outOfOrder .
#spring.flyway.schemas=
# 需要 flyway 管控的 schema list, 缺省的话, 使用的时 dbsource.connection直连上的那个 schema, 可以指定多个schema, 但仅会在第一个schema下建立 metadata 表, 也仅在第一个schema应用migration sql 脚本. 但flyway Clean 命令会依次在这些schema下都执行一遍.
2、脚本命名
-
开发环境建议采用时间戳的形式作为版本号。V20211215.14.48__V1.2_add_user_name.sql
-
生产环境应该是手动merge开发环境的脚本,然后按正常版本号命名。V1.2___001_add_user_name.sql
3、不允许修改migration后的sql(Versioned Migraties)。可以修改可重复执行迁移(Repeatable Migrations)
4、spring.flyway.outOfOrder 取值 true /false
对于开发环境, 可能是多人协作开发, 很可能先 apply 了自己本地的最新 SQL 代码, 然后发现其他同事早先时候提交的 SQL 代码还没有 apply, 所以 开发环境应该设置 spring.flyway.outOfOrder=true, 这样 flyway 将能加载漏掉的老版本 SQL 文件; 而生产环境应该设置 spring.flyway.outOfOrder=false
5、多个系统公用要 DB schema
很多时候多个系统公用一个 DB schema , 这时候使用 spring.flyway.table 为不同的系统设置不同的 metadata 表, 缺省为 flyway_schema_history