注意!: db/migration路径sql文件名称规则:"V20210625.17.30__V1.0.sql

springboot自带flyway依赖版本号,这里不需要配置版本号 maven文件里面注释掉flyway版本

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

    <build>
        <plugins>
            <plugin>
                <groupId>org.flywaydb</groupId>
                <artifactId>flyway-maven-plugin</artifactId>
            </plugin
        </plugins>
   </build>

方式一:通过yml文件 (需要手动执行创建flyway_schema_history表)

配置application.yml文件,手动创建数据库flyway_schema_history

spring:
  flyway:
    # 数据库名称
    schemas: yjx
    # flyway自动配置 true 开启
    enabled: true
    #设定 SQL 脚本的目录,多个路径使用逗号分隔, 比如取值为 classpath:db/migration,filesystem:/sql-migrations
    locations:
      - classpath:db/migration
    # 如果数据库不是空表,需要设置成 true,否则启动报错
    baseline-on-migrate: true
    # 与 baseline-on-migrate: true 搭配使用
    baseline-version: 0
    encoding: UTF-8
    # 开发环境最好开启 outOfOrder, 生产环境关闭 outOfOrder .
    out-of-order: false
    # 禁止清理数据库表
    clean-disabled: true
    # 校验
    validate-on-migrate: true
    # 版本控制日志表,默认flyway_schema_history,不同系统建议修改改数据
    table: flyway_schema_history



-- 执行以下sql,创建 flyway_schema_history 表即可
-- yjx 为要使用flyway的非空数据库 
create table if not exists yjx.flyway_schema_history
(
    installed_rank int not null
        primary key,
    version varchar(50) null,
    description varchar(200) not null,
    type varchar(20) not null,
    script varchar(1000) not null,
    checksum int null,
    installed_by varchar(100) not null,
    installed_on timestamp default CURRENT_TIMESTAMP not null,
    execution_time int not null,
    success tinyint(1) not null
);

create index flyway_schema_history_s_idx
    on yjx.flyway_schema_history (success);

方式二 :通过java配置文件 (不需要配置yml,也不需要手动执行创建flyway_schema_history表)


/*
 * Copyright 2021 Wicrenet, Inc. All rights reserved.
 */
package com.xxx.customer.config;

/**
 * 【 flyway配置 自动生成flyway_schema_history表 】
 *
 * @author yangjunxiong
 * Created on 2021/6/25 17:08
 */

import org.flywaydb.core.Flyway;
import org.flywaydb.core.api.FlywayException;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;

import javax.annotation.PostConstruct;
import javax.sql.DataSource;

@Configuration
public class FlywayConfig {
    @Autowired
    private DataSource dataSource;
    private Logger     logger = LoggerFactory.getLogger(this.getClass());

    @PostConstruct
    public void migrate() {
        Flyway flyway = Flyway.configure()
                .dataSource(dataSource)
                .locations("db/migration")//sql文件名称规则:"V20210625.17.30__V1.0.sql"
                .baselineOnMigrate(true)
                .outOfOrder(true)//对于开发环境, 可能是多人协作开发, 很可能先 apply 了自己本地的最新 SQL 代码, 然后发现其他同事早先时候提交的 SQL 代码还没有 apply, 所以 开发环境应该设置 spring.flyway.outOfOrder=true, 这样 flyway 将能加载漏掉的老版本 SQL 文件; 而生产环境应该设置 spring.flyway.outOfOrder=false
                .encoding("UTF-8")
                .load()
        try {
            flyway.migrate();
        } catch (FlywayException e) {
            logger.error("Flyway配置第一次加载出错", e);
            try {
                flyway.repair();//生成版本记录表
                logger.info("Flyway配置修复成功");
                flyway.migrate();
                logger.info("Flyway配置重新加载成功");
            } catch (Exception e1) {
                logger.error("Flyway配置第二次加载出错", e1);
                throw e1;
            }
        }
    }
}

、Flyway 最佳实践

1. SQL 的文件名

开发环境和生产环境的 migration SQL 不共用. 开发过程往往是多人协作开发, DB migration 也相对比较频繁, 所以 SQL 脚本会很多. 而生产环境 DB migration 往往由 DBA 完成, 每次升级通常需要提交一个 SQL 脚本.

(1). 开发环境 SQL 文件建议采用时间戳作为版本号.

开发环境 SQL 文件建议采用时间戳作为版本号, 多人一起开发不会导致版本号争用, 同时再加上生产环境的版本号, 这样的话, 将来手工 merge 成生产环境 V1.2d migration 脚本也比较方便, SQL 文件示例:
V20180317.10.59__V1.2_Unique_User_Names.sql
V20180317.14.59__V1.2_Add_SomeTables.sql

(2). 生产环境 SQL 文件, 应该是手动 merge 开发环境的 SQL 脚本, 版本号按照正常的版本, 比如

V2.1.5_001__Unique_User_Names.sql

2. migration 后的SQL 脚本不应该再被修改.

3. spring.flyway.outOfOrder 取值 true /false

对于开发环境, 可能是多人协作开发, 很可能先 apply 了自己本地的最新 SQL 代码, 然后发现其他同事早先时候提交的 SQL 代码还没有 apply, 所以 开发环境应该设置 spring.flyway.outOfOrder=true, 这样 flyway 将能加载漏掉的老版本 SQL 文件; 而生产环境应该设置 spring.flyway.outOfOrder=false

4. 多个系统公用要 DB schema

很多时候多个系统公用一个 DB schema , 这时候使用 spring.flyway.table 为不同的系统设置不同的 metadata 表, 缺省为 flyway_schema_history

5. flyway的其他配置

flyway.baseline-description对执行迁移时基准版本的描述.
flyway.baseline-on-migrate当迁移时发现目标schema非空,而且带有没有元数据的表时,是否自动执行基准迁移,默认false.
flyway.baseline-version开始执行基准迁移时对现有的schema的版本打标签,默认值为1.
flyway.check-location检查迁移脚本的位置是否存在,默认false.
flyway.clean-on-validation-error当发现校验错误时是否自动调用clean,默认false.
flyway.enabled是否开启flywary,默认true.
flyway.encoding设置迁移时的编码,默认UTF-8.
flyway.ignore-failed-future-migration当读取元数据表时是否忽略错误的迁移,默认false.
flyway.init-sqls当初始化好连接时要执行的SQL.
flyway.locations迁移脚本的位置,默认db/migration.
flyway.out-of-order是否允许无序的迁移,默认false.
flyway.password目标数据库的密码.
flyway.placeholder-prefix设置每个placeholder的前缀,默认${.
flyway.placeholder-replacementplaceholders是否要被替换,默认true.
flyway.placeholder-suffix设置每个placeholder的后缀,默认}.
flyway.placeholders.[placeholder name]设置placeholder的value
flyway.schemas设定需要flywary迁移的schema,大小写敏感,默认为连接默认的schema.
flyway.sql-migration-prefix迁移文件的前缀,默认为V.
flyway.sql-migration-separator迁移脚本的文件名分隔符,默认__
flyway.sql-migration-suffix迁移脚本的后缀,默认为.sql
flyway.tableflyway使用的元数据表名,默认为schema_version
flyway.target迁移时使用的目标版本,默认为latest version
flyway.url迁移时使用的JDBC URL,如果没有指定的话,将使用配置的主数据源
flyway.user迁移数据库的用户名
flyway.validate-on-migrate迁移时是否校验,默认为true.
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐