db脚本持续集成: flyway创建、管理和版本化数据库
flyway是什么
Flyway 是一种开源的数据库迁移工具,可以帮助开发者将数据库的版本管理集成到应用程序中。它使用简单的 SQL 脚本来管理数据库的版本和升级。Flyway 支持多种主流的数据库(如 MySQL、PostgreSQL、Oracle、SQL Server 等),使得在不同数据库之间进行迁移变得更加容易和灵活。
Flyway 是基于约定优于配置的原则,提供了一系列命名规范和组织结构,使得创建、管理和版本化数据库变得更加可预期和可重复。Flyway 的核心思想是版本化控制数据库,每个版本通过 SQL 脚本进行管理,这样可以让开发者更好地维护数据库结构的稳定性和一致性。
Flyway 还提供了多种集成方式,可以让开发者轻松地与项目中其他工具(如 Maven、Gradle、Spring Boot 等)进行集成。同时,Flyway 还支持多种部署方式,包括命令行、Java 应用程序、Web 应用程序等,方便开发者进行灵活的部署和扩展。
总之,Flyway 是一个功能强大、易于上手、灵活可扩展的开源数据库版本控制工具,可以帮助开发者更好地管理其数据库结构和数据,并让数据库的变更更加可预期和易于维护
springboot应用启动集成flyway
pom引入flyway依赖包
<dependency>
<groupId>org.flywaydb</groupId>
<artifactId>flyway-core</artifactId>
<version>7.9.1</version>
</dependency>
flyway执行的sql存放的目录
resources
dbflyway
my-application-name2.30.0
my-application-name2.30.0_01__filename.sql
my-application-name2.31.0
my-application-name2.31.0_01__filename.sql
flyway的配置bean
org.flywaydb.core.api.configuration.ClassicConfiguration
ClassicConfiguration定义了可以配置的参数
场景一:之前那已经单独执行,现在迁移到应用启动执行,需要忽略之前执行的。从指定版本开始执行
#yaml的配置应该为:
spring:
application:
name: my-application-name
flyway:
# 启动flyway
enabled: true
#
schemas: public
# sql文件前缀名
sql-migration-prefix: my-application-name
# baselineOnMigrate 和baselineVersion配置从指定版本开始执行
baselineOnMigrate: true
# 执行的版本
baselineVersion: 2.31.0
ignoreIgnoredMigrations: true
# flyway执行的记录,
table: flyway_schema_history
# flyway执行的sql目录
locations: classpath:dbflyway,classpath:sql/fix,classpath:sql/poc
flyway_schema_history表结构及字段说明
flyway_schema_history这个表不需要我们创建,启动flayway会自动创建这个表。
installed_rank | version | description | type | script | checksum | installed_by | installed_on | execution_time | success |
---|---|---|---|---|---|---|---|---|---|
主键递增的执行的id | 版本/文件名前缀 | 取文件名没有版本的部分 | 记录类型 基线还是执行的SQL | 执行名称全路径 | 文件的hash值 | ||||
1 | 2.31.0 | << Flyway Baseline >> | BASELINE | << Flyway Baseline >> | null | 2023-05-24 14:35:28.000767 | 0 | true | |
2 | 2.31.0.01 | create ssdlc origin save | SQL | my-application-name2.31.0/my-application-name2.31.0_01__create_business_table.sql | -588013804 | dbuser | 2023-05-24 14:35:28.078776 | 44 | true |
- 注意已经跑过的文件,不要再修改,会导致计算的hash变化,checksum检查不通过。
- 每次都从基线开始跑,ckechsum一致则跳过
上面第二点,我们有一种场景,之前是在独立的机器执行flyway,现在要降本增效减少机器以及让我们的应用部署更加内聚,需要把flyway修改为应用启动时执行。我们要按照上面的配置再yaml里配置,并且指定基线版本,为我们最新的版本,flyway执行记录表要用新表跑,因为我们修改了sql的存放目录,以及之前一些迭代过程不规范的问题,因此指定flyway新建一张表。生成新的基线版本
create table flyway_schema_history1
(
installed_rank integer not null
constraint flyway_schema_history1_pk
primary key,
version varchar(50),
description varchar(200) not null,
type varchar(20) not null,
script varchar(1000) not null,
checksum integer,
installed_by varchar(100) not null,
installed_on timestamp default now() not null,
execution_time integer not null,
success boolean not null
);
alter table flyway_schema_history1
owner to dev_root;
create index flyway_schema_history1_s_idx
on flyway_schema_history1 (success);